В функции StopMode() не вызывайте функцию CountTrades() внутри цикла for. Независимо от цикла в StopMode(), после работы функции CountTrades() всегда оказывается выделенным последний ордер.
Сделайте вызов CountTrades() один раз в начале функции StopMode(), с присвоением результата переменной, а дальше пользуйтесь значением из переменной.
В функции StopMode() не вызывайте функцию CountTrades() внутри цикла for. Независимо от цикла в StopMode(), после работы функции CountTrades() всегда оказывается выделенным последний ордер.
Сделайте вызов CountTrades() один раз в начале функции StopMode(), с присвоением результата переменной, а дальше пользуйтесь значением из переменной.
Переписал с переменной начале функции StopMode(). Результат тот же. Модифицируется первый ордер.
//+------------------------------------------------------------------+ //| Модификация стопов | //+------------------------------------------------------------------+ void StopMode() { bool m=1; double sl=0,tp=0; int count=CountTrades(); for(int i=OrdersTotal();i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(count==1) { sl=NormalizeDouble(OrderOpenPrice()-StopLoss*_Point,_Digits); tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits); } if(count==2) { sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits); tp=NormalizeDouble(FirstPrice(),_Digits); } if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) { m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } } if(OrderType()==OP_SELL) { if(count==1) { sl=NormalizeDouble(OrderOpenPrice()+StopLoss*_Point,_Digits); tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits); } if(count==2) { sl=NormalizeDouble(FirstPrice()+StopLoss*_Point*2,_Digits); tp=NormalizeDouble(FirstPrice(),_Digits); } if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) { m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } } } } } }
Попробовал и такой вариант.Здесь по идее должны модифицироваться все ордера а изменился снова только первый:
//+------------------------------------------------------------------+ //| Модификация стопов | //+------------------------------------------------------------------+ void StopMode() { bool m=1; double sl=0,tp=0; if(CountTrades()==2) { for(int i=OrdersTotal();i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits); tp=NormalizeDouble(FirstPrice(),_Digits); } if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } } } } }
Тоже самое надо сделать с функцией FirstPrice() - не вызывать ее внутри цикла, а вызывать один раз в начале функции.
Заработало!
void StopMode() { bool m=1; int count=CountTrades(); double sl=0,tp=0,pr=FirstPrice(); for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(count==2) { sl=NormalizeDouble(pr-StopLoss*_Point*2,_Digits); tp=NormalizeDouble(pr,_Digits); } if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow); } } } } }
Премного благодарен!
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую! Прошу помощи, т.к. сам не решил данный вопрос.
Есть функция модификации двух позиций в составе общей функции по модификации стопов.
Когда одна позиция стопы модифицируются, также модифицируется и одна из двух позиций когда в рынке их 2.
А чтобы модифицировались обе ничего не получается что бы я ни делал. Перепробовал множество вариантов и никак.
код эксперта целиком: