// extern string rem4 = "=== Параметры безубытка ==="; extern bool _IsStopLoss_0 = false; // Включение использования уровня безубытка extern int _StopLoss_0_From = 0; // Отступ от уровеня безубытка (в пунктах) extern int _StopLoss_0_Level = 15; // Уровень безубытка // extern string rem5 = "=== Параметры трейлинг стопа ==="; extern bool _IsTrailingStop = false; // Включение трейлинг стопа bool _IsTrailingStopProfit = true; // Включение трейлинг стопа с позиции безубытка //extern int _TrailingStopProfit_From = 0; // Отступ от уровеня безубытка (в пунктах) extern int _TrailingStopLevel = 15; // Уровень трейлинг стопа extern int _TrailingStopStep = 5; // Шаг перемещения трейлинг стопа // //=++==============================================================++= // подсчёт количества ордеров по направлению int CountOrders(int cmd) { int n = 0; for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) && (OrderType() == cmd) ) n++; } } return(n); } //=++==============================================================++= // поиск ордера по магику bool FindOrders(int magic) { for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic) ) return(true); } } return(false); } //=++==============================================================++= // отработка уровня безубытка по магику void StopLoss_0(int from) { double profitpoint, bid, ask; bool is; double P3_buy, P3_sell; // for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue; // if(OrderType() == OP_BUY) { bid = MarketInfo(_Symbol, MODE_BID); profitpoint = (bid - OrderOpenPrice()) / _Point; is = profitpoint >= _StopLoss_0_Level + from; P3_buy = ND( OrderOpenPrice() + from * _Point ); // if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) ) { Print("v128-2 б4 >", _Symbol, " | ", _Timeframe, " -> Bid=", MarketInfo(_Symbol, MODE_BID), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy, " | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint); if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE)) Print("v128-2 б4 > ", _Symbol, " | ", _Timeframe, " -> BUY > ticket=", OrderTicket(), " > Ошибка (безубыток) #", GetLastError()); } } // else if(OrderType() == OP_SELL) { ask = MarketInfo(_Symbol, MODE_ASK); profitpoint = (OrderOpenPrice() - ask) / _Point; is = profitpoint >= _StopLoss_0_Level + from; P3_sell = ND( OrderOpenPrice() - from * _Point ); // if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) ) { Print("v128-2 б4 >", _Symbol, " | ", _Timeframe, " -> Ask =", MarketInfo(_Symbol, MODE_ASK), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell, " | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint); if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE)) Print("v128-2 б4 > ", _Symbol, " | ", _Timeframe, " -> SELL -> ticket=", OrderTicket(), " > Ошибка (безубыток) #", GetLastError()); } } } } } //=++==============================================================++= // отработка трейлинг стопа по магику void TrailingStop(int from) { double profitpoint, bid, ask; double fromprice; // for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue; // if(OrderType() == OP_BUY) { if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point; else fromprice = OrderStopLoss(); // bid = MarketInfo(_Symbol, MODE_BID); profitpoint = (bid - ND(fromprice)) / _Point; // if( profitpoint >= _TrailingStopLevel && bid > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) ) { Print("v128-2 т4 >", _Symbol, " | ", _Timeframe, " -> Bid=", MarketInfo(_Symbol, MODE_BID), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | d=", _TrailingStopLevel, " | profitpoint=", profitpoint); if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point), OrderTakeProfit(), 0, CLR_NONE)) { Print("v128-2 т4 >", _Symbol, " | ", _Timeframe, " -> BUY > ticket=", OrderTicket(), " > Ошибка (трейлинг стоп) #", GetLastError()); } } } // else if(OrderType() == OP_SELL) { if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point; else fromprice = OrderStopLoss(); // ask = MarketInfo(_Symbol, MODE_ASK); profitpoint = (ND(fromprice) - ask) / _Point; // if( profitpoint >= _TrailingStopLevel && ask < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) ) { Print("v128-2 т4 >", _Symbol, " | ", _Timeframe, " -> Ask=", MarketInfo(_Symbol, MODE_ASK), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | d=", _TrailingStopLevel, " | profitpoint=", profitpoint); if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point), OrderTakeProfit(), 0, CLR_NONE)) { Print("v128-2 т4 >", _Symbol, " | ", _Timeframe, " -> SELL > ticket=", OrderTicket(), " > Ошибка (трейлинг стоп) #", GetLastError()); } } } } } }