Помогите с OrderModify()

 
Привет! Подскажите как поменять тейк профит сделки у которой уже есть тейк профит?
 

Элементарно, вписать новое значение ТП в OrderModify(). Желательно до этого сравнить новое и старое значения, чтобы не было кода 1.

 
Vitalie Postolache:

Элементарно, вписать новое значение ТП в 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()

- ну и избегайте лесенок в условиях, это ухудшает читаемость, как минимум два отступа в коде лишние

 
Aleksei Radchenko:

По коду возникает несколько вопросов:

- вы уверены, что вам надо модифицировать первый найденный ордер, а не все?

- вы уверены, что вам надо модифицировать ордер с заданной лотностью? (честно говоря лотность как поисковый тег вообще странная вещь)

- вы уверены, что вам надо модифицировать любые ордера, а не только данного робота (нет фильтрации по мэджику)

- ну и с тейком, лучше проверять его не на ноль, а на соответствие заданному (я конечно не знаю логики робота, но это в любом случае странно)

- в коде распринтовывается успешная модификация, хотя более важно обрабатывать ошибку

- нет проверки на допустимость значений SL, TP

- нет нормализации SL, TP

- в модификации используется цена Ask. несмотря на то, что цена будет проигнорена, уместнее там смотрится OrderPriceOpen()

- ну и избегайте лесенок в условиях, это ухудшает читаемость, как минимум два отступа в коде лишние

Отпишусь только по ошибках:

Магик добавил - спасибо что обратили внимание, совсем забыл о нем));

поставил обработку ошибки - тоже важно, не учел;

модификацию дописал (Бид) для селла тоже - просто для теста использовались только ордера бай (но в дальнейшем конечно же я бы про это забыл);

Насчет лотности как поискового критерия: почему странная вещь? (если есть 5 ордеров с разницей только в тикетах и лотности то зачем искать эти самые тикеты, почему не воспользоваться лотностью?)

 
Maksim Neimerik:

Отпишусь только по ошибках:

Магик добавил - спасибо что обратили внимание, совсем забыл о нем));

поставил обработку ошибки - тоже важно, не учел;

модификацию дописал (Бид) для селла тоже - просто для теста использовались только ордера бай (но в дальнейшем конечно же я бы про это забыл);

Насчет лотности как поискового критерия: почему странная вещь? (если есть 5 ордеров с разницей только в тикетах и лотности то зачем искать эти самые тикеты, почему не воспользоваться лотностью ?)


Видимо вы не знаете что между double полями нельзя ставить знак "=="  и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.

Почему-то об этом никто не говорит.

 
Petros Shatakhtsyan:

Видимо вы не знаете что между double полями нельзя ставить знак "=="  и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.

Почему-то об этом никто не говорит.


А вы своих советников не сами пишите?

С чего вдруг нельзя ставить знак "=="? Отнормализовать и можно. Здесь частный случай - сравнение изначально отсутствующего тейкпрофита с нулем, работает без нормализации.

 
Petros Shatakhtsyan:

Видимо вы не знаете что между double полями нельзя ставить знак "=="  и еще нельзя написать OrderTakeProfit()==0, так как уже сказал что double нельзя сравнить с 0.

Я согласен с Вами, вот мой пост по этому поводу: https://www.mql5.com/ru/forum/205452

Но ведь работает же))) Я так понимаю до поры до времени...

Я пока незнаю как мне иначе модифицировать ордер. Суть такая: выставляется пять отложеных ордеров, когда срабатывает первый - у него появляется ТП, когда срабатывает второй - у него появляется двойной ТП а ТП первого ордера переносится на уровень ТП второго ордера и т.д.

Я решил проблему по другому: когда появляется ТП второго ордера тогда ТП первого ордера удаляется вообще, а закрывается он с помощью OrderClose() при срабатывании ТП второго ордера. Вот как-то так...

Нужна помощь с NormalizeDouble!
Нужна помощь с NormalizeDouble!
  • 2017.06.25
  • www.mql5.com
Скажите почему при volume=0.2*3 получается вот такое число 0,6000000000000001????????? Пробовал NormalizeDouble(volume,2)- та же песня, WTF...
 

Пройтись по рыночным ордерам, выбрать из них ордер с максимальным временем открытия, или с наименьшей/наибольшей ценой открытия, взять с него значение тейкпрофита. Еще раз пройтись по всем ордерам, и всем, у которых тейкпрфит не равен полученному  значению выполнить модификацию тейкпрофита.

 
Dmitry Fedoseev:

Пройтись по рыночным ордерам, выбрать из них ордер с максимальным временем открытия, или с наименьшей/наибольшей ценой открытия, взять с него значение тейкпрофита. Еще раз пройтись по всем ордерам, и всем, у которых тейкпрфит не равен полученному  значению выполнить модификацию тейкпрофита.

Неплохо)) Спасибо, попробую...