Skip to content

Instantly share code, notes, and snippets.

@currencysecrets
Last active December 14, 2015 11:18
Show Gist options
  • Save currencysecrets/5077919 to your computer and use it in GitHub Desktop.
Save currencysecrets/5077919 to your computer and use it in GitHub Desktop.
Silent orders with reversable positions.
/*
* checkOpenTrades
* This function checks open trades and compares them to risk levels.
* @param sym
* @return int -1 = error
*/
int checkOpenTrades( string sym ) {
int type, revType, tradeReady, tkt, dir;
double p, revP, profit, trailingStop;
for ( int i = 0; i < OrdersTotal(); i++ ) {
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) {
if ( OrderSymbol() == sym ) {
type = OrderType();
if ( type == OP_BUY ) {
dir = 1;
revType = OP_SELL;
p = MarketInfo( sym, MODE_BID );
revP = MarketInfo( sym, MODE_ASK );
} else {
dir = -1;
revType = OP_BUY;
p = MarketInfo( sym, MODE_ASK );
revP = MarketInfo( sym, MODE_BID );
}
// check whether position has the wide stop loss in place
if ( OrderStopLoss() == 0 ) {
double getIni = getStopLossPrice( sym, OrderOpenPrice(), dir, 1, true );
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderModify( OrderTicket(), OrderOpenPrice(), getIni, 0, 0, 0 );
}
// check whether position has a take profit amount, if it does remove it
if ( OrderTakeProfit() > 0 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 0, 0, 0 );
}
if ( OrderProfit() < ( -1 * globalRiskDollars ) ) {
// order has exceeded risked amount must now be exited at market
// check if it's a reversal order
if ( OrderMagicNumber() < 2 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
// now enter reversal trade
tradeReady = -1;
while ( tradeReady < 0 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady >= 0 ) {
OrderSend( OrderSymbol(), revType, OrderLots(), revP, globalSlippage, 0, 0, systemTag + "r", 2, 0, 0 );
}
}
}
// if it is a reversal order just exit at market
else if ( OrderMagicNumber() == 2 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
}
} else {
// now checking trailingStop
if ( OrderMagicNumber() < 2 ) {
trailingStop = getTrailingStop( sym, OrderOpenTime(), OrderOpenPrice(), OrderType(), false );
if ( type == OP_BUY ) {
if ( p < trailingStop ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return ( -1 );
}
profit = OrderProfit();
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
if ( profit < 0 ) {
tradeReady = -1;
while ( tradeReady < 0 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady >= 0 ) {
OrderSend( sym, revType, OrderLots(), revP, globalSlippage, 0, 0, systemTag + "r", 2, 0, 0 );
}
}
}
}
} else if ( type == OP_SELL ) {
if ( p > trailingStop ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
profit = OrderProfit();
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
// if order was a loss we will look to reverse our trade
if ( profit < 0 ) {
tradeReady = -1;
while ( tradeReady < 0 ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady >= 0 ) {
OrderSend( sym, revType, OrderLots(), revP, globalSlippage, 0, 0, systemTag + "r", 2, 0, 0 );
}
}
}
}
}
}
// trailing orders need to be checked against previous trades' loss
else if ( OrderMagicNumber() == 2 ) {
datetime entryTime = OrderOpenTime();
for ( int r = 0; r < OrdersTotal(); r++ ) {
if ( OrderSelect( r, SELECT_BY_TICKET, MODE_HISTORY ) ) {
if ( OrderSymbol() == sym ) {
if ( OrderMagicNumber() < 2 ) {
if ( entryTime - OrderCloseTime() < 300 ) {
profit = OrderProfit(); // gives complete p/l of trade
break;
}
}
}
}
}
// if we have now made our return on profit we will now trail with a tight stop
if ( OrderProfit() > (-1 * profit) ) {
trailingStop = getTrailingStop( sym, OrderOpenTime(), OrderOpenPrice(), OrderType(), true );
if ( type == OP_BUY ) {
if ( p < trailingStop ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
}
} else if ( type == OP_SELL ) {
if ( p > trailingStop ) {
tradeReady = _IsTradeAllowed();
if ( tradeReady < 0 ) {
return( -1 );
}
OrderClose( OrderTicket(), OrderLots(), p, globalSlippage );
}
}
}
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment