Вложеный оператор

protr  

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

 if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true && OrderType() == OP_BUYSTOP && OrderOpenPrice() > Ask + TS*Point)
               bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
            if(!res_1)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

вариата 2

   if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true && OrderType() == OP_BUYSTOP 
    && OrderOpenPrice() > Ask + TS*Point){
               bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
            if(!res_1)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");
               }
Alexey Volchanskiy  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо


А пробовали выделить отдельно? Какой код ошибки конкретно?

if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true)
{
// дальше все остальное
}
Vitaly Muzichenko  
protr:

   Подскажите пожалуста как правильно... со скобками или без?

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

 if(OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
  if(OrderType() == OP_BUYSTOP && (OrderOpenPrice() > (Ask + TS*Point)))
   {
    bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
     if(!res_1)
      {
       Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
       } else {
        Print("Цена Stop Loss ордера успешно модифицирована.");
      }
    }
  }

 

В вашем случае ответ дан предыдущим оратором )

[Удален]  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

вариата 2

Здравствуйте. Скорее всего. не там ищите. Как минимум нужно нормализовать все цены, переданные в функцию модификации ордера.

Далее вопрос к этой строке OrderOpenPrice() > Ask + TS*Point. Цена аск может повторяться несколько раз, а значит Вы будете модифицировать ордер на ту же цену. Нужно добавить проверку, что ТП или СЛ уже модифицированы по текущей цене аск.

Да, второй вариант, приведенный Вами, правильнее. 

 

Artyom Trishkin  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

вариата 2

1. При выделении ордера по тикету pool игнорируется - MODE_TRADES не имеет никакого значения и он тут не нужен (его использование не является ошибкой, но говорит о том, что программист не совсем понимает что он делает)

2. Для того, чтобы понять из какого списка выбран ордер, нужно проверить время его закрытия: если == 0 --> значит ордер в списке открытых, если не равен нулю - ордер уже закрыт, и находится в списке закрытых, соответственно, и модифицировать его уже бесполезно.

3. Сначала сделайте правильно выбор, потом уже пробуйте модифицировать. Ну и со скобками - всё, что должно происходить при истинности условия - всё в скобки. За скобки выносите всё, что должно быть в случае "иначе"

ghost_master  
Artyom Trishkin:

1. При выделении ордера по тикету pool игнорируется - MODE_TRADES не имеет никакого значения и он тут не нужен (его использование не является ошибкой, но говорит о том, что программист не совсем понимает что он делает)

2. Для того, чтобы понять из какого списка выбран ордер, нужно проверить время его закрытия: если == 0 --> значит ордер в списке открытых, если не равен нулю - ордер уже закрыт, и находится в списке закрытых, соответственно, и модифицировать его уже бесполезно.

3. Сначала сделайте правильно выбор, потом уже пробуйте модифицировать. Ну и со скобками - всё, что должно происходить при истинности условия - всё в скобки. За скобки выносите всё, что должно быть в случае "иначе"

Спасибо. 

1. Понял

2. А так что происходит попытка модифицировать ордер из истории? :) Я думаю этот параметр при выборе такое исключает MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров.

3. тогда else за скобки? 

ghost_master  
Код ошибки 0... ето при модификации ордерор... непосредственно при исполнении программы. Спасибо.
Alexander Puzanov  
ghost_master:
Код ошибки 0... ето при модификации ордерор... непосредственно при исполнении программы. Спасибо.
В этом разе err #0 это попытка задать ордеру те же самые параметры, которые у него и так есть
protr  

Alexander Puzanov:
В этом разе err #0 это попытка задать ордеру те же самые параметры, которые у него и так есть

 

 

 

 При этом когда ошибка 0 - серверу отсылается запрос на модификацию?

 

Вот в етом и причина того что терминал жрет ресурс впса... а как можно обойти этот момент... ?  

Alexander Puzanov  
protr:

Вот в етом и причина того что терминал жрет ресурс впса... а как можно обойти этот момент... ?  

Елементарно - сверяйте 3 новых параметра с существующими до отправки заявки OrderModify
protr  

Alexander Puzanov:
Елементарно - сверяйте 3 новых параметра с существующими до отправки заявки OrderModify

 

 

 

 

Спасибо. Но мне кажется что етот параметр проверки исключает отсылку цены равной или меньше.

OrderOpenPrice() > Ask + TS*Point

Спасибо. 

 
Причина обращения: