Бесконечное зацикливания цикла, как исправить? - страница 3

 
Dmitry Fedoseev:

Но все же посмотрите... вдруг! Вдруг дойдет... хоть маловероятно, но вдруг...

вдруг что?

с уважением.

 
Andrey Kisselyov:

вдруг что?

с уважением.


уж наверно ничего...

 
Andrey Kisselyov:
создайте код который будет считать количество миллисекунд на выполнение данного задания и проверьте оба варианта выполнения
1 вариант

2 вариант

полученные результаты выведите на экран, если не хватит точности выполнения увеличите значение W до 100000 проходов.
ulong Bench1( const int Amount = 1e8, const int Magik = 0 )
{
  int e = 0;  
  const ulong StartTime = GetMicrosecondCount();

//выполнение проверки по каждому условию
   for(int w=0;w<Amount;w++)
     {
      for(int q=0;q<OrdersTotal();q++)
        {
         if(!OrderSelect(q,SELECT_BY_POS))continue;
         if(OrderMagicNumber()!=Magik)continue;
         if(OrderSymbol()!=_Symbol)continue;
         if(OrderType()!=OP_SELL)continue;
         e++;
        }
     }
     
  return(GetMicrosecondCount() - StartTime);
}

ulong Bench2( const int Amount = 1e8, const int Magik = 0 )
{
  int e = 0;  
  const ulong StartTime = GetMicrosecondCount();

//проверка всех условий в одном операторе IF
   for(int w=0;w<Amount;w++)
     {
      for(int q=0;q<OrdersTotal();q++)
        {
         if(OrderSelect(q,SELECT_BY_POS) && 
            OrderMagicNumber()==Magik && 
            OrderSymbol()==_Symbol && 
            OrderType()==OP_SELL) e++;
        }
     }
     
  return(GetMicrosecondCount() - StartTime);
}

#define TOSTRING(A) #A + " = " + (string)(A)

void OnStart()
{
  Print(TOSTRING(Bench1()));
  Print(TOSTRING(Bench2()));
}


Результат

2017.07.23 15:42:57.757 Test4 EURUSD,M1: Bench2() = 2272590
2017.07.23 15:42:55.483 Test4 EURUSD,M1: Bench1() = 2296227
 
fxsaber:


Результат

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

с уважением.

P.S. это будет иметь смысл когда есть что проверять.
 
fxsaber:


Результат


А о чем разговор, о нескольких if'aх или continue?

 
Dmitry Fedoseev:

А о чем разговор, о нескольких if'aх или continue?

continue

 
Andrey Kisselyov:
поменяйте на проверку ордеров истории, если они конечно там есть.
ulong Bench1( const int Amount = 1e3, const int Magik = 0 )
{
  int e = 0;  
  const ulong StartTime = GetMicrosecondCount();

//выполнение проверки по каждому условию
   for(int w=0;w<Amount;w++)
     {
      for(int q=0;q<OrdersHistoryTotal();q++)
        {
         if(!OrderSelect(q,SELECT_BY_POS, MODE_HISTORY))continue;
         if(OrderMagicNumber()!=Magik)continue;
         if(OrderSymbol()!=_Symbol)continue;
         if(OrderType()!=OP_SELL)continue;
         e++;
        }
     }
     
  return(GetMicrosecondCount() - StartTime);
}

ulong Bench2( const int Amount = 1e3, const int Magik = 0 )
{
  int e = 0;  
  const ulong StartTime = GetMicrosecondCount();

//проверка всех условий в одном операторе IF
   for(int w=0;w<Amount;w++)
     {
      for(int q=0;q<OrdersHistoryTotal();q++)
        {
         if(OrderSelect(q,SELECT_BY_POS, MODE_HISTORY) && 
            OrderMagicNumber()==Magik && 
            OrderSymbol()==_Symbol && 
            OrderType()==OP_SELL) e++;
        }
     }
     
  return(GetMicrosecondCount() - StartTime);
}

#define TOSTRING(A) #A + " = " + (string)(A)

void OnStart()
{  
  Print(TOSTRING(OrdersHistoryTotal()));
  
  Print(TOSTRING(Bench1()));
  Print(TOSTRING(Bench2()));
}


Результат

2017.07.23 15:56:45.166 Test4 EURUSD,M1: Bench2() = 3201081
2017.07.23 15:56:41.965 Test4 EURUSD,M1: Bench1() = 3212761
2017.07.23 15:56:38.755 Test4 EURUSD,M1: OrdersHistoryTotal() = 34623
 
fxsaber:


Результат

на мой взгляд в пределах погрешности.

для пущей честности можно ещё и OrdersTotal() вынести за оба цикла, чтобы исключить его из замеров

 
Maxim Kuznetsov:

на мой взгляд в пределах погрешности.

для пущей честности можно ещё и OrdersTotal() вынести за оба цикла, чтобы исключить его из замеров

Достаточно проанализировать результат выполнения этого скрипта

bool FuncFalse()
{
  Print(__FUNCSIG__);
  
  return(false);
}

bool FuncTrue()
{
  Print(__FUNCSIG__);
  
  return(true);
}

#define MACROS(A) A Print(#A + " - true");  else Print(#A + " - false"); Print("");

void OnStart()
{  
  MACROS(if (FuncFalse() || FuncTrue()))  
  MACROS(if (FuncFalse() && FuncTrue()))  

  MACROS(if (FuncTrue() || FuncFalse()))
  MACROS(if (FuncTrue() && FuncFalse()))
}


Результат (читать снизу-вверх)

2017.07.23 16:11:35.923 Test4 EURUSD,M1: if(FuncTrue()&&FuncFalse()) - false
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncFalse()
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncTrue()
2017.07.23 16:11:35.923 Test4 EURUSD,M1: 
2017.07.23 16:11:35.923 Test4 EURUSD,M1: if(FuncTrue()||FuncFalse()) - true
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncTrue()
2017.07.23 16:11:35.923 Test4 EURUSD,M1: 
2017.07.23 16:11:35.923 Test4 EURUSD,M1: if(FuncFalse()&&FuncTrue()) - false
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncFalse()
2017.07.23 16:11:35.923 Test4 EURUSD,M1: 
2017.07.23 16:11:35.923 Test4 EURUSD,M1: if(FuncFalse()||FuncTrue()) - true
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncTrue()
2017.07.23 16:11:35.923 Test4 EURUSD,M1: bool FuncFalse()

чтобы понять, что использование нескольких if и continue даже теоретически не в состоянии дать преимущества в скорости перед единым if.

Короткая оценка логических операций

К логическим выражениям применяется схема так называемой "короткой оценки", то есть, вычисление выражения прекращается в тот момент, когда можно точно оценить результат выражения.

Документация по MQL5: Основы языка / Операции и выражения / Логические операции
Документация по MQL5: Основы языка / Операции и выражения / Логические операции
  • www.mql5.com
Основы языка / Операции и выражения / Логические операции - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Andrey Kisselyov:
Артем, проблема по коду решена?

с уважением.

Проблема осталась. Я не совсем полно написал в первом посте, как именно проявляется закисленность. Конечно я проверил с помощью printf. Получается всегда оба условия true и в массив MassLockSellTrade постоянно в бесконечном цикле добавляются по 2 тикета (по условию цикл срабатывает, когда срабатывают 2 SellStop) таким образом 2,4,6,8 и так до бесконечности.

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