Ошибки, баги, вопросы - страница 1914

 
nys2000:

А конкретнее, если можно?


начни с нуля

 
nys2000:

А конкретнее, если можно?

for(i=1; i <=OrdersTotal(); i++)  Ордера в этом списке нумеруются от нуля до OrdersTotal()-1 включительно (пусть извинит меня Артем Тришкин, просто сократил ожидание для nys2000).
 
Aleksei Beliakov:

начни с нуля


Это два равноценных варианта. Если for (i=1...), тогда OrderSelect(i-1,...), если for (i=0,...) - OrderSelect(i,...)

 
Vladimir:
for(i=1; i <=OrdersTotal(); i++)  Ордера в этом списке нумеруются от нуля до OrdersTotal()-1 включительно (пусть извинит меня Артем Тришкин, просто сократил ожидание для nys2000).

Спасибо, но нумерация ордеров с 0 до OrdersTotal()-1 учтена в OrderSelect(i-1,...)

 
int OrdersTotalT(int _type)
  {
   int _total=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {

      bool select=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()==_type)
        {
           _total++;
        }
     }
   return(_total);
  }
 
nys2000:

Спасибо, но нумерация ордеров с 0 до OrdersTotal()-1 учтена в OrderSelect(i-1,...)


делайте перебор в обратном порядке ..

 
nys2000:

Вот такой простенький код:

В момент запуска функции открыто две позиции Buy. Функция дважды принтует наличие двух ордеров: Проход № 1, Проход № 2.

Снимаем комментарии и запускаем функцию повторно. Она бодро сносит один ордер бай, честно принтует "Проход № 1" и выходит из цикла. Второй ордер остается нетронутым сообщение "Проход № 2" не появляется.

В чем магия?


1. i=1, Посчитали ордера ... проверили условие 1<= 2 ? да. Выбрали и Закрыли ордер.

2. i++ (i=2)

3. OrdersTotal()=1 <---------- закрытием ордера внутри цикла фактически поменяли условие для выхода из цикла

4. 2<=1 ? нет <----------- тут ваша "магия" и соответственно выход из цикла

void CloseAllOrders()
{
bool Ans;
int total=OrdersTotal();
   for(int i=1; i <=total; i++)     
      {      
      Print("Проход № ", i);      
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
         {  
         if (OrderSymbol() != Symbol())
            continue;
         if (OrderType()==0)
             {
//            Ans=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble(Bid,Digits),25);
             }           
         if (OrderType()==1)
             {
//            Ans=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble(Ask,Digits),25);
             } 
         }
      }      
         
return;
   
}
 

зачем введен дополнительный идентификатор чарта CHART_WINDOW_HANDLE, ведь есть ID чарта, для каких целей он нужен?

 
Konstantin:

зачем введен дополнительный идентификатор чарта CHART_WINDOW_HANDLE, ведь есть ID чарта, для каких целей он нужен?

Предположу, что ID чарта для среды mql, а HWND - для winapi.
 

Ошибка при выполнении

int f( int t )
{
union U {
        U( int t ) : t1( t ) {}
        int t2;
        int t1;
};
	U u( t );
        return u.t2;
}
void OnStart()
{
        Print( f( 3 ));
}

Результат: случайное число (ну уж точно не 3)
Причина обращения: