Советник не видит ордер - почему? - страница 4

 
alexnau:

Код посмотрите на первой странице.

Я Вам уже отвечал: там ошибки. Помимо того,  что Вы исправили, там: 1 Выход за пределы массива и 2.во втором цикле перебираются не все ордера.
 
Vinin:

Так по тому куску кода были сказаны все ошибки, которые там есть. Неизвестно вы их исправили или нет.

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

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


В коде все соответствует. Я выкладывал из журнала результаты принтовки. Если бы в коде были бы ошибки, я бы не не смог получить тикета селл-ордера с магик_1.

Здесь, на форумея, код исправил тоже чтобы не было вопросов. Ошибаться может любой из нас.

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

 
VladislavVG:

Я Вам уже отвечал: там ошибки. Помимо того, что Вы исправили, там: 1 Выход за пределы массива и 2.во втором цикле перебираются не все ордера.


Можете объяснить, что означает выход за пределы массива?

Во втором цикле пропускаем ордера не соответсвующие нашему символу. ВЫ это имели ввиду?

 

Подскажите, еще. Список перебираемых ордеров начинается с нуля или единицы?

 
alexnau:


Можете объяснить, что означает выход за пределы массива?

Во втором цикле пропускаем ордера не соответсвующие нашему символу. ВЫ это имели ввиду?

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

Это 100 раз обсуждалось:
1. Ордера с номером OrdersTotal() не существует. Максимальный номер OrdersTotal() -1

2. Вы не рассматриваете ордер с номером 0

 Это специально во всех руководствах написано: индексация массивов от 0 !

 

Попробуйте использовать следующую функцию (сделана из вашего кода)


void MYOrderModify(int magic, int type, double StopLoss){
   for(int i=OrdersTotal();i>=0;i--)  {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))   continue;
      if(OrderSymbol()!=Symbol())                        continue;
      if (OrderMagicNumber()!=magic)                     continue;
      if(OrderType()!=type)                              continue;
      
      if (type==OP_BUY) {
         if (modSL>OrderStopLoss())  {
            OrderModify(OrderTicket(),OrderOpenPrice(),modSL,OrderTakeProfit(),0,LightBlue); 
         }
      } else if (type==OP_SELL) {
         if (modSL<OrderStopLoss())  {
            OrderModify(OrderTicket(),OrderOpenPrice(),modSL,OrderTakeProfit(),0,LightBlue); 
         }
      }
   }   
}
 
alexnau:

Подскажите, еще. Список перебираемых ордеров начинается с нуля или единицы?


Посмотрел в МАСД-Sample нумерация существующих ордеров, вроде бы, с нуля начинпется, судя по коду.
for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
 
VladislavVG:

Это 100 раз обсуждалось:
1. Ордера с номером OrdersTotal() не существует. Максимальный номер OrdersTotal() -1

2. Вы не рассматриваете ордер с номером 0

Это специально во всех руководствах написано: индексация массивов от 0 !


Спасибо за ответ. Я поменял сам OrdersTotal()-1 на OrdersTotal() - признаю это моя ошибка. Еще разспасибо.
 
alexnau:

Спасибо за ответ. Я поменял сам OrdersTotal()-1 на OrdersTotal() - признаю это моя ошибка. Еще разспасибо.

А строгое неравенство не нестрогое ?
 
Vinin:

Попробуйте использовать следующую функцию (сделана из вашего кода)


Спасибо за участие и за функцию. Я ее только подправил в соответствие с указанием на существующие ошибки.
void MYOrderModify(int magic, int type, double StopLoss){
   for(int i=OrdersTotal()-1;i>=0;i--)  {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))   continue;
      if(OrderSymbol()!=Symbol())                        continue;
      if (OrderMagicNumber()!=magic)                     continue;
      if(OrderType()!=type)                              continue;
      
      if (type==OP_BUY) {
         if (StopLoss>OrderStopLoss())  {
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,LightBlue); 
         }
      } else if (type==OP_SELL) {
         if (StopLoss<OrderStopLoss())  {
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,LightBlue); 
         }
      }
   }   
}

Заменил: i=OrdersTotal() на i=OrdersTotal()-1 и modSL на StopLoss.

Вроде бы все правильно теперь. По науке!

Vinin, еще вопросик. У Вас идет перед проверкой селл-ордеров else if (type==OP_SELL) {, может можно без if (type==OP_SELL) { без else?

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