OrderType() неправильно определяет тип ордера - страница 2

 
evillive:
считать-то кто будет? обратный порядок полезен всегда при работе с ордерами, не только при закрытии.

При всем уважении, сделал уже и так:

for(i = OrdersTotal()-1; i >=0; i--)
на проблеме игнора :
if(OrderType() == OP_BUY)
это никак не отражается
 

Ну видишь, тикет-то другой.

И проверь поставив в принт OrderType()

 
AlexeyVik:

Ну видишь, тикет-то другой.

И проверь поставив в принт OrderType()


Тикет изменился лишь потому что тот первый sell_limit уже закрылся и функция теперь переключилась на ближайший Sell.


вот и принт это подтверждает:

а нам нужен Buy. тип ордера = 0 должно быть

 
Цикл перебора ордеров в цикле перебора ордеров делать НЕЛЬЗЯ!!! Chek_way() - уберите из цикла.
 
TarasBY:
Цикл перебора ордеров в цикле перебора ордеров делать НЕЛЬЗЯ!!! Chek_way() - уберите из цикла.

//+------------------------------------------------------------------+
//| Модифицируем стоплоссы                                           |
//+------------------------------------------------------------------+   
void modify_stoploss()
  {
   int sway = chek_way();
   for(int i = OrdersTotal()-1; i >=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==magic)
              {
               if(OrderType() == OP_BUY)
                 {
                  if(sway==1)
                    {
                     double stoploss=NormalizeDouble(pre_openPrice(OP_BUY),Digits);
                     Print("Стоплосс для Бай ",OrderTicket()," = ", stoploss," - это принт из modify_stoploss(), Тип ордера = ", OrderType());
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
               if(OrderType() == OP_SELL)
                 {
                  if(sway==0)
                    {
                     stoploss=NormalizeDouble(pre_openPrice(OP_SELL),Digits);
                     Print("Стоплосс для Cелл ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
              }
           }
        }
     }

  }
так цикл считается убранным или нет? если да, то не помогло.
 
TarasBY:
Цикл перебора ордеров в цикле перебора ордеров делать НЕЛЬЗЯ!!! Chek_way() - уберите из цикла.

Все, спасибо, помогло!) а я балбес не догадался. там еще один цикл перебора,
pre_openPrice(OP_SELL)

его тоже вынес и все заработало!

еще раз спасибо, TarasBY! :)

и всем остальным кто пытался мне помочь так же спасибо!)

 
TarasBY:
Цикл перебора ордеров в цикле перебора ордеров делать НЕЛЬЗЯ!!! Chek_way() - уберите из цикла.
Это точно. Не сразу я понял что в Chek_way() может быть ещё один цикл и выбор ордера...
 
А pre_openPrice() цикл перебора в себе не содержит?
 
TarasBY:
А pre_openPrice() цикл перебора в себе не содержит?

содержит, еще и как содержит) уже убрал)


будет мне урок.

 
Lazarechek:

содержит, еще и как содержит) уже убрал)


будет мне урок.

Просто перед вызовом функции, в которой тоже есть перебор ордеров, сохраните в переменной тикет выбранного ордера, и сразу же по возвращении из вызываемой функции опять выбирайте ордер по тикету, сохранённому в переменной. Только не забудьте после выбора проверить время его закрытия и, если оно больше нуля, то continue;, иначе - продолжайте обрабатывать этот ордер.