Вопросы по коду. - страница 6

 
Renat Akhtyamov #:

учитывая то, что программа при необходимости вернется к модификации на новом тике

примерно так проще, понятнее и практичнее:

                  int ticket=OrderModify(OrderTicket(), OrderOpenPrice(), extr_price-5*Point, OrderTakeProfit(),0,clrNONE);

                  if(ticket<0)

                  {

                     Print("Modify error ", GetLastError());  

                     return;

                  }


int a = OrderModify(OrderTicket(), OrderOpenPrice(), extr_price-5*Point, OrderTakeProfit(), 0) ;

while (!a) { 

   OrderModify(); }

Так будет работать? Хочу чтобы советник пытался изменить ордер до тех пор пока не получится.

 
gnesnyi #:

int a = OrderModify(OrderTicket(), OrderOpenPrice(), extr_price-5*Point, OrderTakeProfit(), 0) ;

while (!a) { 

   OrderModify(); }

Так будет работать? Хочу чтобы советник пытался изменить ордер до тех пор пока не получится.

не желательно зацикливать торговые приказы, торговый сервер может забанить Вашего эксперта как атакующего

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

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

 
gnesnyi #:

int a = OrderModify(OrderTicket(), OrderOpenPrice(), extr_price-5*Point, OrderTakeProfit(), 0) ;

while (!a) { 

   OrderModify(); }

Так будет работать? Хочу чтобы советник пытался изменить ордер до тех пор пока не получится.

Нет, не будет.
 

Можно сделать примерно так.

if (OrderSelect(Ticet,SELECT_BY_TICKET, MODE_TRADES)) //ордер должен быть предварительно выбран в переменной Ticet хранится уникальный тикет ордера
{
   bool res = false;
   double SL=NormalizeDouble(extr_price-5*Point(),(int)MarketInfo(Sumbol(),MODE_DIGITS));//нормализуем новое значение стоплоса
   for (uint i=1;i<=3;i++)// три попытки модифицировать ордер
   {
         if (OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrNONE)) 
         {
            res = true;
            break;//модификация прошла успешно выход из цикла
         }else
         {            
            Sleep(1000);//чуток подождем и потом пробуем обновить данные или проанализировать ошибку и попытаться ее исправить.
            if (!RefreshRates()) {break} //если данные не обновлены или ошибку исправить невозможно выход из цикла           
         }         
   } 
   if (res)
   {
        Print(Sumbol(),": Modify order #",OrderTicket()," passed successfully ");//пишем в журнал об успешной модификации
   }else
   {
        Print(Sumbol(),": Error Modify order #",OrderTicket()," code " ,GetLastError());//пишем в журнал об ошибке
        //to do анализ ошибки
   }
}else {Print("Ордера ", Ticet," не существует");}
 
Renat Akhtyamov #:

нет, Вы просто узнаете выполнилась ли команда  OrderModify ?

if( OrderModify () == true)  или то же самое if( OrderModify () >=0)  - выполнилась

if( OrderModify () == false) или то же самое if( OrderModify () != true) или то же самое if( OrderModify () <0) - не выполнилась

а если далее дописать что нибудь в фигурных скобках, то если условие правда, то и выполнится то, что в фигурных скобках

например

if( OrderModify ()) { тут выполнится при условии успешной модификации ордера , что означает что модификация ордера фактически произошла  }

if(! OrderModify ())  { тут выполнится при условии модификации ордера, завершившейся с ошибкой, что означает что модификация ордера фактически не произошла }

Доброе утро, Ренат! В коде, выделенном жёлтым цветом, точно нужен знак равенства? В коде, выделенном зелёным цветом, точно должен быть знак < ? Справочник с Вами не согласен.

Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно. 

С уважением, Владимир.

 
MrBrooklin #:

Доброе утро, Ренат! В коде, выделенном жёлтым цветом, точно нужен знак равенства? Справочник с Вами не согласен

С уважением, Владимир.

В его коде даже индус ногу сломает.

...

Только от великого ума наверно пишут так  if( OrderModify () == true)  Интересно какой машинный код генерирует при этом компилятор. Или в нем защита от таких шедевров встроена.  OrderModify () возвращает или true или false.

Получается если он возвращает true то код будет выглядеть так if (true==true) если возвращает false то код получится if ( false==true) . В итоге такая конструкция заставляет процессор дважды производить логические вычисления из за наличия оператора сравнения. Тогда как если написано просто  if( OrderModify () ) вычисление происходит только один раз.

 

Ну и начудили вы тут… Одному OrderModify() возвращает тикет, другому ещё чудней…

Но я ввязываться в ваши разборки уже не буду, чуди́те дальше, я буду просто заходить сюда повеселиться.

 

Товарищи, почему перебирая все ордера нужно писать  i=OrdersTotal()-1, а что последний ордер не ордер?

for(int i=OrdersTotal()-1; i>=0; i--)

или у меня код написан не правильно? Хотя ... все работает.

 
gnesnyi #:

Товарищи, почему перебирая все ордера нужно писать  i=OrdersTotal()-1, а что последний ордер не ордер?

for(int i=OrdersTotal()-1; i>=0; i--)

или у меня код написан не правильно? Хотя ... все работает.

Потому что нумерация начинается с нуля.
 
Vitalii Ananev #:

В его коде даже индус ногу сломает.

...

Только от великого ума наверно пишут так  if( OrderModify () == true)  Интересно какой машинный код генерирует при этом компилятор. Или в нем защита от таких шедевров встроена.  OrderModify () возвращает или true или false.

Получается если он возвращает true то код будет выглядеть так if (true==true) если возвращает false то код получится if ( false==true) . В итоге такая конструкция заставляет процессор дважды производить логические вычисления из за наличия оператора сравнения. Тогда как если написано просто  if( OrderModify () ) вычисление происходит только один раз.

схематично писали