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

 

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 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 ордера успешно модифицирована.");
               }
 
protr:

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


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

if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true)
{
// дальше все остальное
}
 
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. Цена аск может повторяться несколько раз, а значит Вы будете модифицировать ордер на ту же цену. Нужно добавить проверку, что ТП или СЛ уже модифицированы по текущей цене аск.

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

 

 
protr:

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

вариант 1

 

вариата 2

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

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

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

 
Artyom Trishkin:

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

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

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

Спасибо. 

1. Понял

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

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

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

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

 

 

 

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

 

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

 
protr:

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

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

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

 

 

 

 

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

OrderOpenPrice() > Ask + TS*Point

Спасибо.