Элементарно, вписать новое значение ТП в OrderModify(). Желательно до этого сравнить новое и старое значения, чтобы не было кода 1.
Элементарно, вписать новое значение ТП в OrderModify(). Желательно до этого сравнить новое и старое значения, чтобы не было кода 1.
Дело в том что я вызываю OrderModify() через функцию:
bool ModifyOrders(int cmd, double volume, double stoploss, double takeprofit ) { for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol()&&OrderType()==cmd&&OrderLots()==volume&&OrderTakeProfit()==0) { if(OrderModify(OrderTicket(),Ask,stoploss,takeprofit,0)) { Print("Order Modify!"); return(true); } } } } return(false); }
там есть условие if
OrderTakeProfit()==0
тоесть если уже есть тейк то нового не будет... я, кажется, пока писал уже придумал выход...
Сделайте копию функции, дайте ей другое имя и уберите проверку на 0.
По коду возникает несколько вопросов:
- вы уверены, что вам надо модифицировать первый найденный ордер, а не все?
- вы уверены, что вам надо модифицировать ордер с заданной лотностью? (честно говоря лотность как поисковый тег вообще странная вещь)
- вы уверены, что вам надо модифицировать любые ордера, а не только данного робота (нет фильтрации по мэджику)
- ну и с тейком, лучше проверять его не на ноль, а на соответствие заданному (я конечно не знаю логики робота, но это в любом случае странно)
- в коде распринтовывается успешная модификация, хотя более важно обрабатывать ошибку
- нет проверки на допустимость значений SL, TP
- нет нормализации SL, TP
- в модификации используется цена Ask. несмотря на то, что цена будет проигнорена, уместнее там смотрится OrderPriceOpen()
- ну и избегайте лесенок в условиях, это ухудшает читаемость, как минимум два отступа в коде лишние
По коду возникает несколько вопросов:
- вы уверены, что вам надо модифицировать первый найденный ордер, а не все?
- вы уверены, что вам надо модифицировать ордер с заданной лотностью? (честно говоря лотность как поисковый тег вообще странная вещь)
- вы уверены, что вам надо модифицировать любые ордера, а не только данного робота (нет фильтрации по мэджику)
- ну и с тейком, лучше проверять его не на ноль, а на соответствие заданному (я конечно не знаю логики робота, но это в любом случае странно)
- в коде распринтовывается успешная модификация, хотя более важно обрабатывать ошибку
- нет проверки на допустимость значений SL, TP
- нет нормализации SL, TP
- в модификации используется цена Ask. несмотря на то, что цена будет проигнорена, уместнее там смотрится OrderPriceOpen()
- ну и избегайте лесенок в условиях, это ухудшает читаемость, как минимум два отступа в коде лишние
Отпишусь только по ошибках:
Магик добавил - спасибо что обратили внимание, совсем забыл о нем));
поставил обработку ошибки - тоже важно, не учел;
модификацию дописал (Бид) для селла тоже - просто для теста использовались только ордера бай (но в дальнейшем конечно же я бы про это забыл);
Насчет лотности как поискового критерия: почему странная вещь? (если есть 5 ордеров с разницей только в тикетах и лотности то зачем искать эти самые тикеты, почему не воспользоваться лотностью?)
Отпишусь только по ошибках:
Магик добавил - спасибо что обратили внимание, совсем забыл о нем));
поставил обработку ошибки - тоже важно, не учел;
модификацию дописал (Бид) для селла тоже - просто для теста использовались только ордера бай (но в дальнейшем конечно же я бы про это забыл);
Насчет лотности как поискового критерия: почему странная вещь? (если есть 5 ордеров с разницей только в тикетах и лотности то зачем искать эти самые тикеты, почему не воспользоваться лотностью ?)
Видимо вы не знаете что между double полями нельзя ставить знак "==" и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.
Почему-то об этом никто не говорит.
Видимо вы не знаете что между double полями нельзя ставить знак "==" и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.
Почему-то об этом никто не говорит.
А вы своих советников не сами пишите?
С чего вдруг нельзя ставить знак "=="? Отнормализовать и можно. Здесь частный случай - сравнение изначально отсутствующего тейкпрофита с нулем, работает без нормализации.
Видимо вы не знаете что между double полями нельзя ставить знак "==" и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.
Я согласен с Вами, вот мой пост по этому поводу: https://www.mql5.com/ru/forum/205452
Но ведь работает же))) Я так понимаю до поры до времени...
Я пока незнаю как мне иначе модифицировать ордер. Суть такая: выставляется пять отложеных ордеров, когда срабатывает первый - у него появляется ТП, когда срабатывает второй - у него появляется двойной ТП а ТП первого ордера переносится на уровень ТП второго ордера и т.д.
Я решил проблему по другому: когда появляется ТП второго ордера тогда ТП первого ордера удаляется вообще, а закрывается он с помощью OrderClose() при срабатывании ТП второго ордера. Вот как-то так...
- 2017.06.25
- www.mql5.com
Пройтись по рыночным ордерам, выбрать из них ордер с максимальным временем открытия, или с наименьшей/наибольшей ценой открытия, взять с него значение тейкпрофита. Еще раз пройтись по всем ордерам, и всем, у которых тейкпрфит не равен полученному значению выполнить модификацию тейкпрофита.
Пройтись по рыночным ордерам, выбрать из них ордер с максимальным временем открытия, или с наименьшей/наибольшей ценой открытия, взять с него значение тейкпрофита. Еще раз пройтись по всем ордерам, и всем, у которых тейкпрфит не равен полученному значению выполнить модификацию тейкпрофита.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования