Last active
December 14, 2015 11:18
-
-
Save currencysecrets/5077919 to your computer and use it in GitHub Desktop.
Silent orders with reversable positions.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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