#property description "StopLoss 100 pips." #property description "TakeProfit 50 - 500 pips." //--- Trade parameters. extern double SL_Pips = 600; extern double TP_Pips_Buy = 300; extern double TP_Pips_Sell = 300; //--- Trail parameters. extern double Trail_Pips = 150; extern double Trail_Step = 1; extern double Trail_To_Lock_In = 40; //--- Break Even parameters. extern double BreakEven_Pips_Small = 37; extern double BreakEven_Too_Lock_In_Small = 10; //--- extern double BreakEven_Pips_Medi = 74; extern double BreakEven_Too_Lock_In_Medi = 20; //--- extern double BreakEven_Pips_Large = 111; extern double BreakEven_Too_Lock_In_Large = 30; //--- Other parameters. int LotDigits; //initialized in OnInit int MagicNumber = 950619; int NextOpenTradeAfterDays = 1; //next open trade after time double MM_PositionSizing = 10000; int MaxSlippage = 3; //slippage, adjusted in OnInit int MaxSlippage_; bool crossed[2]; //initialized to true, used in function Cross int MaxOpenTrades = 2; int MaxLongTrades = 1000; int MaxShortTrades = 1000; int MaxPendingOrders = 1000; int MaxLongPendingOrders = 1000; int MaxShortPendingOrders = 1000; bool Hedging = true; int OrderRetry = 5; //# of retries if sending order returns error int OrderWait = 5; //# of seconds to wait if sending order returns error double myPoint; //initialized in OnInit double Close[]; int MA_handle; double MA[]; double MM_Size() //position sizing { double MaxLot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double MinLot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double lots = AccountInfoDouble(ACCOUNT_BALANCE) / MM_PositionSizing; if(lots > MaxLot) lots = MaxLot; if(lots < MinLot) lots = MinLot; return(lots); } bool Cross(int i, bool condition) //returns true if "condition" is true and was false in the previous call { bool ret = condition && !crossed[i]; crossed[i] = condition; return(ret); } void myAlert(string type, string message) { if(type == "print") Print(message); else if(type == "error") { Print(type+" | IC_ONE_LINE_100_test @ "+Symbol()+","+IntegerToString(Period())+" | "+message); } else if(type == "order") { } else if(type == "modify") { } } int TradesCount(ENUM_ORDER_TYPE type) //returns # of open trades for order type, current symbol and magic number { if(type <= 1) { int result = 0; int total = PositionsTotal(); for(int i = 0; i < total; i++) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue; result++; } return(result); } else { int result = 0; int total = OrdersTotal(); for(int i = 0; i < total; i++) { if(OrderGetTicket(i) <= 0) continue; if(OrderGetInteger(ORDER_MAGIC) != MagicNumber || OrderGetString(ORDER_SYMBOL) != Symbol() || OrderGetInteger(ORDER_TYPE) != type) continue; result++; } return(result); } } datetime LastOpenTradeTime() { datetime result = 0; for(int i = PositionsTotal()-1; i >= 0; i--) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_TYPE) > 1) continue; if(PositionGetString(POSITION_SYMBOL) == Symbol() && PositionGetInteger(POSITION_MAGIC) == MagicNumber) { result = (datetime)PositionGetInteger(POSITION_TIME); break; } } return(result); } ulong LastHistoryTradeTicket(int deal_io) { HistorySelect(0, TimeCurrent()); int total = HistoryDealsTotal(); ulong ticket = 0; for(int i = total-1; i >= 0; i--) { if((ticket = HistoryDealGetTicket(i)) <= 0) continue; if(HistoryDealGetString(ticket, DEAL_SYMBOL) == Symbol() && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber && HistoryDealGetInteger(ticket, DEAL_TYPE) <= 1 && HistoryDealGetInteger(ticket, DEAL_ENTRY) == deal_io) return(ticket); } return(0); } datetime LastOpenTime() { ulong ticket = 0; datetime opentime1 = 0, opentime2 = 0; if((ticket = LastHistoryTradeTicket(DEAL_ENTRY_IN)) > 0) opentime1 = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME); opentime2 = LastOpenTradeTime(); if (opentime1 > opentime2) return opentime1; else return opentime2; } ulong myOrderSend(ENUM_ORDER_TYPE type, double price, double volume, string ordername) //send order, return ticket ("price" is irrelevant for market orders) { if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED)) return(0); int retries = 0; int long_trades = TradesCount(ORDER_TYPE_BUY); int short_trades = TradesCount(ORDER_TYPE_SELL); int long_pending = TradesCount(ORDER_TYPE_BUY_LIMIT) + TradesCount(ORDER_TYPE_BUY_STOP) + TradesCount(ORDER_TYPE_BUY_STOP_LIMIT); int short_pending = TradesCount(ORDER_TYPE_SELL_LIMIT) + TradesCount(ORDER_TYPE_SELL_STOP) + TradesCount(ORDER_TYPE_SELL_STOP_LIMIT); string ordername_ = ordername; if(ordername != "") ordername_ = "("+ordername+")"; //test Hedging if(!Hedging && ((type % 2 == 0 && short_trades + short_pending > 0) || (type % 2 == 1 && long_trades + long_pending > 0))) { myAlert("print", "Order"+ordername_+" not sent, hedging not allowed"); return(0); } //test maximum trades if((type % 2 == 0 && long_trades >= MaxLongTrades) || (type % 2 == 1 && short_trades >= MaxShortTrades) || (long_trades + short_trades >= MaxOpenTrades) || (type > 1 && type % 2 == 0 && long_pending >= MaxLongPendingOrders) || (type > 1 && type % 2 == 1 && short_pending >= MaxShortPendingOrders) || (type > 1 && long_pending + short_pending >= MaxPendingOrders) ) { myAlert("print", "Order"+ordername_+" not sent, maximum reached"); return(0); } //prepare to send order MqlTradeRequest request; ZeroMemory(request); request.action = (type <= 1) ? TRADE_ACTION_DEAL : TRADE_ACTION_PENDING; //set allowed filling type int filling = (int)SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE); if(request.action == TRADE_ACTION_DEAL && (filling & 1) != 1) request.type_filling = ORDER_FILLING_IOC; request.magic = MagicNumber; request.symbol = Symbol(); request.volume = NormalizeDouble(volume, LotDigits); request.sl = 0; request.tp = 0; request.deviation = MaxSlippage_; request.type = type; request.comment = ordername; int expiration=(int)SymbolInfoInteger(Symbol(), SYMBOL_EXPIRATION_MODE); if((expiration & SYMBOL_EXPIRATION_GTC) != SYMBOL_EXPIRATION_GTC) { request.type_time = ORDER_TIME_DAY; request.type_filling = ORDER_FILLING_RETURN; } MqlTradeResult result; ZeroMemory(result); while(!OrderSuccess(result.retcode) && retries < OrderRetry+1) { //refresh price before sending order MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); if(type == ORDER_TYPE_BUY) price = last_tick.ask; else if(type == ORDER_TYPE_SELL) price = last_tick.bid; else if(price < 0) //invalid price for pending order { myAlert("order", "Order"+ordername_+" not sent, invalid price for pending order"); return(0); } request.price = NormalizeDouble(price, Digits()); if(!OrderSend(request, result) || !OrderSuccess(result.retcode)) { myAlert("print", "OrderSend"+ordername_+" error: "+result.comment); Sleep(OrderWait*1000); } retries++; } if(!OrderSuccess(result.retcode)) { myAlert("error", "OrderSend"+ordername_+" failed "+IntegerToString(OrderRetry+1)+" times; error: "+result.comment); return(0); } string typestr[8] = {"Buy", "Sell", "Buy Limit", "Sell Limit", "Buy Stop", "Sell Stop", "Buy Stop Limit", "Sell Stop Limit"}; myAlert("order", "Order sent"+ordername_+": "+typestr[type]+" "+Symbol()+" Magic #"+IntegerToString(MagicNumber)); return(result.order); } int myOrderModify(ENUM_ORDER_TYPE type, ulong ticket, double SL, double TP) //modify SL and TP (absolute price), zero targets do not modify { if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED)) return(-1); bool netting = AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING; int retries = 0; int err = 0; SL = NormalizeDouble(SL, Digits()); TP = NormalizeDouble(TP, Digits()); if(SL < 0) SL = 0; if(TP < 0) TP = 0; //prepare to select order Sleep(10); if((type <= 1 && ((netting && !PositionSelect(Symbol())) || (!netting && !PositionSelectByTicket(ticket)))) || (type > 1 && !OrderSelect(ticket))) { err = GetLastError(); myAlert("error", "PositionSelect / OrderSelect failed; error #"+IntegerToString(err)); return(-1); } //ignore open positions other than "type" if (type <= 1 && PositionGetInteger(POSITION_TYPE) != type) return(0); //prepare to modify order double currentSL = (type <= 1) ? PositionGetDouble(POSITION_SL) : OrderGetDouble(ORDER_SL); double currentTP = (type <= 1) ? PositionGetDouble(POSITION_TP) : OrderGetDouble(ORDER_TP); if(NormalizeDouble(SL, Digits()) == 0) SL = currentSL; //not to modify if(NormalizeDouble(TP, Digits()) == 0) TP = currentTP; //not to modify if(NormalizeDouble(SL - currentSL, Digits()) == 0 && NormalizeDouble(TP - currentTP, Digits()) == 0) return(0); //nothing to do MqlTradeRequest request; ZeroMemory(request); request.action = (type <= 1) ? TRADE_ACTION_SLTP : TRADE_ACTION_MODIFY; if (type > 1) request.order = ticket; else request.position = PositionGetInteger(POSITION_TICKET); request.symbol = Symbol(); request.price = (type <= 1) ? PositionGetDouble(POSITION_PRICE_OPEN) : OrderGetDouble(ORDER_PRICE_OPEN); request.sl = NormalizeDouble(SL, Digits()); request.tp = NormalizeDouble(TP, Digits()); request.deviation = MaxSlippage_; MqlTradeResult result; ZeroMemory(result); while(!OrderSuccess(result.retcode) && retries < OrderRetry+1) { if(!OrderSend(request, result) || !OrderSuccess(result.retcode)) { err = GetLastError(); myAlert("print", "OrderModify error #"+IntegerToString(err)); Sleep(OrderWait*1000); } retries++; } if(!OrderSuccess(result.retcode)) { myAlert("error", "OrderModify failed "+IntegerToString(OrderRetry+1)+" times; error #"+IntegerToString(err)); return(-1); } string alertstr = "Order modify: ticket="+IntegerToString(ticket); if(NormalizeDouble(SL, Digits()) != 0) alertstr = alertstr+" SL="+DoubleToString(SL); if(NormalizeDouble(TP, Digits()) != 0) alertstr = alertstr+" TP="+DoubleToString(TP); myAlert("modify", alertstr); return(0); } int myOrderModifyRel(ENUM_ORDER_TYPE type, ulong ticket, double SL, double TP) //works for positions and orders, modify SL and TP (relative to open price), zero targets do not modify, ticket is irrelevant for open positions { if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED)) return(-1); bool netting = AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING; int retries = 0; int err = 0; SL = NormalizeDouble(SL, Digits()); TP = NormalizeDouble(TP, Digits()); if(SL < 0) SL = 0; if(TP < 0) TP = 0; //prepare to select order Sleep(10); if((type <= 1 && ((netting && !PositionSelect(Symbol())) || (!netting && !PositionSelectByTicket(ticket)))) || (type > 1 && !OrderSelect(ticket))) { err = GetLastError(); myAlert("error", "PositionSelect / OrderSelect failed; error #"+IntegerToString(err)); return(-1); } //ignore open positions other than "type" if (type <= 1 && PositionGetInteger(POSITION_TYPE) != type) return(0); //prepare to modify order, convert relative to absolute double openprice = (type <= 1) ? PositionGetDouble(POSITION_PRICE_OPEN) : OrderGetDouble(ORDER_PRICE_OPEN); if(((type <= 1) ? PositionGetInteger(POSITION_TYPE) : OrderGetInteger(ORDER_TYPE)) % 2 == 0) //buy { if(NormalizeDouble(SL, Digits()) != 0) SL = openprice - SL; if(NormalizeDouble(TP, Digits()) != 0) TP = openprice + TP; } else //sell { if(NormalizeDouble(SL, Digits()) != 0) SL = openprice + SL; if(NormalizeDouble(TP, Digits()) != 0) TP = openprice - TP; } double currentSL = (type <= 1) ? PositionGetDouble(POSITION_SL) : OrderGetDouble(ORDER_SL); double currentTP = (type <= 1) ? PositionGetDouble(POSITION_TP) : OrderGetDouble(ORDER_TP); if(NormalizeDouble(SL, Digits()) == 0) SL = currentSL; //not to modify if(NormalizeDouble(TP, Digits()) == 0) TP = currentTP; //not to modify if(NormalizeDouble(SL - currentSL, Digits()) == 0 && NormalizeDouble(TP - currentTP, Digits()) == 0) return(0); //nothing to do MqlTradeRequest request; ZeroMemory(request); request.action = (type <= 1) ? TRADE_ACTION_SLTP : TRADE_ACTION_MODIFY; if (type > 1) request.order = ticket; else request.position = PositionGetInteger(POSITION_TICKET); request.symbol = Symbol(); request.price = (type <= 1) ? PositionGetDouble(POSITION_PRICE_OPEN) : OrderGetDouble(ORDER_PRICE_OPEN); request.sl = NormalizeDouble(SL, Digits()); request.tp = NormalizeDouble(TP, Digits()); request.deviation = MaxSlippage_; MqlTradeResult result; ZeroMemory(result); while(!OrderSuccess(result.retcode) && retries < OrderRetry+1) { if(!OrderSend(request, result) || !OrderSuccess(result.retcode)) { err = GetLastError(); myAlert("print", "OrderModify error #"+IntegerToString(err)); Sleep(OrderWait*1000); } retries++; } if(!OrderSuccess(result.retcode)) { myAlert("error", "OrderModify failed "+IntegerToString(OrderRetry+1)+" times; error #"+IntegerToString(err)); return(-1); } string alertstr = "Order modify: ticket="+IntegerToString(ticket); if(NormalizeDouble(SL, Digits()) != 0) alertstr = alertstr+" SL="+DoubleToString(SL); if(NormalizeDouble(TP, Digits()) != 0) alertstr = alertstr+" TP="+DoubleToString(TP); myAlert("modify", alertstr); return(0); } void TrailingStopTrail(ENUM_ORDER_TYPE type, double TS, double step, bool aboveBE, double aboveBEval) //set Stop Loss to "TS" if price is going your way with "step" { TS = NormalizeDouble(TS, Digits()); step = NormalizeDouble(step, Digits()); int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue; MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); double SL = PositionGetDouble(POSITION_SL); double openprice = PositionGetDouble(POSITION_PRICE_OPEN); ulong ticket = PositionGetInteger(POSITION_TICKET); if(type == ORDER_TYPE_BUY && (!aboveBE || last_tick.bid > openprice + TS + aboveBEval) && (NormalizeDouble(SL, Digits()) <= 0 || last_tick.bid > SL + TS + step)) myOrderModify(ORDER_TYPE_BUY, ticket, last_tick.bid - TS, 0); else if(type == ORDER_TYPE_SELL && (!aboveBE || last_tick.ask < openprice - TS - aboveBEval) && (NormalizeDouble(SL, Digits()) <= 0 || last_tick.ask < SL - TS - step)) myOrderModify(ORDER_TYPE_SELL, ticket, last_tick.ask + TS, 0); } } void TrailingStopBE_Small (ENUM_ORDER_TYPE type, double profit, double add) //set Stop Loss to open price if in profit { profit = NormalizeDouble(profit, Digits()); int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue; MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); double SL = PositionGetDouble(POSITION_SL); double openprice = PositionGetDouble(POSITION_PRICE_OPEN); ulong ticket = PositionGetInteger(POSITION_TICKET); if(type == ORDER_TYPE_BUY && last_tick.bid > openprice + profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice > SL)) myOrderModify(ORDER_TYPE_BUY, ticket, openprice + add, 0); else if(type == ORDER_TYPE_SELL && last_tick.ask < openprice - profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice < SL)) myOrderModify(ORDER_TYPE_SELL, ticket, openprice + add, 0); } } void TrailingStopBE_Medi (ENUM_ORDER_TYPE type, double profit, double add) //set Stop Loss to open price if in profit { profit = NormalizeDouble(profit, Digits()); int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue; MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); double SL = PositionGetDouble(POSITION_SL); double openprice = PositionGetDouble(POSITION_PRICE_OPEN); ulong ticket = PositionGetInteger(POSITION_TICKET); if(type == ORDER_TYPE_BUY && last_tick.bid > openprice + profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice > SL)) myOrderModify(ORDER_TYPE_BUY, ticket, openprice + add, 0); else if(type == ORDER_TYPE_SELL && last_tick.ask < openprice - profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice < SL)) myOrderModify(ORDER_TYPE_SELL, ticket, openprice + add, 0); } } void TrailingStopBE_Large (ENUM_ORDER_TYPE type, double profit, double add) //set Stop Loss to open price if in profit { profit = NormalizeDouble(profit, Digits()); int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { if(PositionGetTicket(i) <= 0) continue; if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue; MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); double SL = PositionGetDouble(POSITION_SL); double openprice = PositionGetDouble(POSITION_PRICE_OPEN); ulong ticket = PositionGetInteger(POSITION_TICKET); if(type == ORDER_TYPE_BUY && last_tick.bid > openprice + profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice > SL)) myOrderModify(ORDER_TYPE_BUY, ticket, openprice + add, 0); else if(type == ORDER_TYPE_SELL && last_tick.ask < openprice - profit && (NormalizeDouble(SL, Digits()) <= 0 || openprice < SL)) myOrderModify(ORDER_TYPE_SELL, ticket, openprice + add, 0); } } bool OrderSuccess(uint retcode) { return(retcode == TRADE_RETCODE_PLACED || retcode == TRADE_RETCODE_DONE || retcode == TRADE_RETCODE_DONE_PARTIAL || retcode == TRADE_RETCODE_NO_CHANGES); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { MaxSlippage_ = MaxSlippage; //initialize myPoint myPoint = Point(); if(Digits() == 5 || Digits() == 3) { myPoint *= 10; MaxSlippage_ *= 10; } //initialize LotDigits double LotStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); if(NormalizeDouble(LotStep, 3) == round(LotStep)) LotDigits = 0; else if(NormalizeDouble(10*LotStep, 3) == round(10*LotStep)) LotDigits = 1; else if(NormalizeDouble(100*LotStep, 3) == round(100*LotStep)) LotDigits = 2; else LotDigits = 3; int i; //initialize crossed for (i = 0; i < ArraySize(crossed); i++) crossed[i] = true; MA_handle = iMA(NULL, PERIOD_H1, 100, 0, MODE_EMA, PRICE_CLOSE); if(MA_handle < 0) { Print("The creation of iMA has failed: MA_handle=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { ulong ticket = 0; double price; double SL; double TP; if(CopyClose(Symbol(), PERIOD_H1, 0, 200, Close) <= 0) return; ArraySetAsSeries(Close, true); if(CopyBuffer(MA_handle, 0, 0, 200, MA) <= 0) return; ArraySetAsSeries(MA, true); //+------------------------------------------------------------------+ //| Break Even Function. | //+------------------------------------------------------------------+ TrailingStopBE_Small (ORDER_TYPE_BUY, BreakEven_Pips_Small * myPoint, 0 + BreakEven_Too_Lock_In_Small * myPoint); //Trailing Stop = go break even + fixed value TrailingStopBE_Small (ORDER_TYPE_SELL, BreakEven_Pips_Small * myPoint, 0 - BreakEven_Too_Lock_In_Small * myPoint); //Trailing Stop = go break even - fixed value TrailingStopBE_Medi (ORDER_TYPE_BUY, BreakEven_Pips_Medi * myPoint, 0 + BreakEven_Too_Lock_In_Medi * myPoint); //Trailing Stop = go break even + fixed value TrailingStopBE_Medi (ORDER_TYPE_SELL, BreakEven_Pips_Medi * myPoint, 0 - BreakEven_Too_Lock_In_Medi * myPoint); //Trailing Stop = go break even - fixed value TrailingStopBE_Large (ORDER_TYPE_BUY, BreakEven_Pips_Large * myPoint, 0 + BreakEven_Too_Lock_In_Large * myPoint); //Trailing Stop = go break even + fixed value TrailingStopBE_Large (ORDER_TYPE_SELL, BreakEven_Pips_Large * myPoint, 0 - BreakEven_Too_Lock_In_Large * myPoint); //Trailing Stop = go break even - fixed value //+------------------------------------------------------------------+ //| Trailing Stop function. | //+------------------------------------------------------------------+ TrailingStopTrail (ORDER_TYPE_BUY, Trail_Pips * myPoint, Trail_Step * myPoint, true, Trail_To_Lock_In * myPoint); //Trailing Stop = trail TrailingStopTrail (ORDER_TYPE_SELL, Trail_Pips * myPoint, Trail_Step * myPoint, true, Trail_To_Lock_In * myPoint); //Trailing Stop = trail //Open Buy Order, instant signal is tested first if(Cross(0, Close[0] > MA[0]) //Candlestick Close crosses above Moving Average && Close[1] < MA[1] //Candlestick Close < Moving Average ) { MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); price = last_tick.ask; SL = SL_Pips * myPoint; //Stop Loss = value in points (relative to price) TP = TP_Pips_Buy * myPoint; //Take Profit = value in points (relative to price) if(TimeCurrent() - LastOpenTime() < NextOpenTradeAfterDays * 86400) return; //next open trade after time after previous trade's open if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && MQLInfoInteger(MQL_TRADE_ALLOWED)) { ticket = myOrderSend(ORDER_TYPE_BUY, price, MM_Size(), ""); if(ticket == 0) return; } else //not autotrading => only send alert myAlert("order", ""); myOrderModifyRel(ORDER_TYPE_BUY, ticket, SL, 0); myOrderModifyRel(ORDER_TYPE_BUY, ticket, 0, TP); } //Open Sell Order, instant signal is tested first if(Cross(1, Close[0] < MA[0]) //Candlestick Close crosses below Moving Average && Close[1] > MA[1] //Candlestick Close > Moving Average ) { MqlTick last_tick; SymbolInfoTick(Symbol(), last_tick); price = last_tick.bid; SL = SL_Pips * myPoint; //Stop Loss = value in points (relative to price) TP = TP_Pips_Sell * myPoint; //Take Profit = value in points (relative to price) if(TimeCurrent() - LastOpenTime() < NextOpenTradeAfterDays * 86400) return; //next open trade after time after previous trade's open if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && MQLInfoInteger(MQL_TRADE_ALLOWED)) { ticket = myOrderSend(ORDER_TYPE_SELL, price, MM_Size(), ""); if(ticket == 0) return; } else //not autotrading => only send alert myAlert("order", ""); myOrderModifyRel(ORDER_TYPE_SELL, ticket, SL, 0); myOrderModifyRel(ORDER_TYPE_SELL, ticket, 0, TP); } } //+