Замучила ошибка there are no trading operations - страница 21

 
Arkadii Zagorulko:

Точно МТ5...

Пишут, только с МТ4 проблема.

Может это саботаж для перехода на МТ5...

 

Если кому то поможет, то вот как я прошел валидацию. Советник без стопов и модификаций ордеров, но на всех таймфреймах.

Валидатор выдавал ошибку 131 (неправильный лот)и нет торговых операций. Это мой первый советник, поэтому ошибки были наверное все, какие только возможно.

Вначале я добавил все комментарии на английском в проверки торговых функций. т.е если советник не торгует, он должен выдать ошибку в Print().

Еще добавил проверку на свободную маржу и убрал все ExpertRemove() но это не помогло, ошибки были те же.

void buy()
  {
   if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)>0)
     {
      if(OrderSend(_Symbol,OP_BUY,Lots,Ask,Slip,SLb,0,comment,Magic,0,Green)<1)
         Print(" Buy ​​order error !"+ IntegerToString(_Period,0) +" Error code = " + IntegerToString(GetLastError(),0));
     }
   else
      Print("Not enough money!" +" Error code = " + IntegerToString(GetLastError(),0));
      /// ExpertRemove();
   return;   
  }

Дальше сделал сразу несколько изменений и не понятно, что из этого помогло.

Сброс ошибок в начале и в конце работы советника, проверка наличия котировок на всех ТФ

int OnInit()
  {
    ResetLastError();   

      for(int cycle=1; cycle<=5; cycle++)
     {
      switch(cycle)
        {
         case 1:
            TF = PERIOD_D1;
            break;
         case 2:
            TF = PERIOD_H4;
            break;
         case 3:
            TF = PERIOD_H1;
            break;
         case 4:
            TF = PERIOD_M15;
            break;
         case 5:
            TF = PERIOD_M5;
            break;
        }
   if(iTime(_Symbol,TF,Limit)<1)
     Print("Missing quotes! " + IntegerToString(TF,0) + " Timeframe"+" Error = " + IntegerToString(GetLastError(),0));            
     }      
   return(INIT_SUCCEEDED);
  }
//****************************
void OnDeinit(const int reason)
  {  
   Alert("Error = "+ IntegerToString(GetLastError(),0));
   ResetLastError();
  }

и расчет лота переделал под все случаи,если шаг (0,1), (0,01) и даже (0,001)

double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);

   Lots = NormalizeDouble(AccountEquity()/10000*Lot_for_10K,3);
   if(lotstep>0.001)
   Lots = (MathRound(Lots/lotstep))*lotstep;    
   Lots = MathMax(Lots,MarketInfo(Symbol(),MODE_MINLOT));
   Lots = MathMin(Lots,MarketInfo(Symbol(),MODE_MAXLOT));

в итоге можно сказать что быстро получилось все исправить, всего 2 дня и около 10 попыток

 
Пошагова опишу свои эксперимент при "there are no trading operations":

1. После перекомпиляций старого EA из Маркета и попытки загрузить на сайт, появилась ошибка "there are no trading operations":
test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
there are no trading operations
test on GBPUSDcheck,M30
there are no trading operations
test on XAUUSDcheck,Daily
there are no trading operations
2. Проверка наличия котировок на всех ТФ не выявил ошибок (воспользовался делением на 0).
3. Дальше начал проверять объем для торговых операций, ошибок не находил но все равно "there are no trading operations".
4. Дальше поменял в все OrderSend количество лотов на SYMBOL_VOLUME_MIN - "there are no trading operations"
5. Видно явно что-то уже не то с тестером валидатора. И попробовал в OnInit() добавить открытие позиций:
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
int ticket1=OpenPosition(NULL,OP_SELL,min_volume,0,0,magic);

и вот что получил (к стати, в первый раз увидел настолько детализировано в валидаторе):

 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134


Здесь уже понятно из за чего ошибка "there are no trading operations". При балансе 1.00, явно не получится открыть ордер с 0.20 (SYMBOL_VOLUME_MIN). И проверка баланса в коде справляется со своей задачей и не допускает выставление такого ордера и выводится принтом в журнале о недостатке баланса (только в валидаторе это не видно) .

Как по вашему с валидаторам все порядке?


Будем ждать пока поправят валидатор.

 
Free margine не беспокоит, а то меня Гондурас замучил. 
 
Алексей Тарабанов #:
Free margine не беспокоит, а то меня Гондурас замучил. 

Трудно? Я про выражение мыслей.

 
Да, я о параметрах тестирования
 
Память почистите всякую. 
 

Всё-таки нашёл проблему, мне по умолчание в  input параметрах стоит ограничение на максимальный лот позиций.

input double MaxLots=0.1;
...
lots = MathMin(lots, MaxLots);

Это и не пропускало открытие позиций если SYMBOL_VOLUME_MIN в валидаторе 0.20. Нельзя для валидатора выставлять по умолчание такое малое ограничение на максимальный лот позиций.

 
Nauris Zukas #:

Здесь уже понятно из за чего ошибка "there are no trading operations". При балансе 1.00, явно не получится открыть ордер с 0.20 (SYMBOL_VOLUME_MIN). И проверка баланса в коде справляется со своей задачей и не допускает выставление такого ордера и выводится принтом в журнале о недостатке баланса (только в валидаторе это не видно) .

Ошибка все еще преследует всех я так понимаю, но мне не помогла проверка баланса, сообщаю об ошибках где только можно, и при проверке баланса тоже. Проверяю на меньше 10, вывожу и в Print и в Comment бесполезно.

Кто то решил как-то эту проблему?

bool IsTrade() {
   if (AccountInfoDouble(ACCOUNT_EQUITY) < 10) { 
      Print("=== ATTENTION!!! - The minimum balance for trading is $50"); 
      Comment(TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " === ATTENTION!!! - The minimum balance for trading is $50");
      Sleep(10000);
      return false; 
   }
   if (MarketInfo(_Symbol,MODE_STOPLEVEL) > Shift) { 
      Print("=== ATTENTION!!! - The price is close to the order opening level: StopLevel="+DoubleToString(MarketInfo(_Symbol,MODE_STOPLEVEL),0)); 
      Comment(TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " === ATTENTION!!! - The price is close to the order opening level: StopLevel="+DoubleToString(MarketInfo(_Symbol,MODE_STOPLEVEL),0));
      Sleep(10000);
      return false; 
   }
   
   if (MarketInfo(_Symbol,MODE_SPREAD) > MaxSpread) { 
      Print("=== ATTENTION!!! - Exceeding the maximum spread: Spread="+DoubleToString(MarketInfo(_Symbol,MODE_SPREAD),0)); 
      Comment(TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " === ATTENTION!!! - Exceeding the maximum spread: Spread="+DoubleToString(MarketInfo(_Symbol,MODE_SPREAD),0)); 
      Sleep(10000);
      return false; 
   }
   return true;
}

Кстати при добавлении открытия ордера в Oninit так же вижу что на попытке открыть ордер 0.2 при балансе 1 спотыкается.

 

@Artyom Trishkin поясните пожалуйста ситуацию. Я уже задрочил ваш валидатор чтобы в принципе понять причину почему выдается сообщение что нет сделок. Сделал все проверки и принты в этих проверках.

То итогу если ставлю в начале Oninit безусловное открытие сделки с заведомо ложными параметрами валидатор все равно выдает сообщение что сделок нет, хотя по GBPUSDcheck выдал правильную ошибку, а по EURUSD и NZDUSD как будто вообще не заходил в Oninit и сразу выдал ошибку что сделок нет.

Пробовал ставить тоже самое в OnTick, тоже самое, по EURUSD нет сделок, как будто в OnTick валидатор ни разу не заходит и выдает ошибку, зато появляется ошибка 131 уже в NZDUSD.

Путем простой логики делаю выводы что валидатор даже не заходит в OnTick EURUSD и сваливается в ошибку нет сделок.

int OnInit()
  {
  OrderSend(_Symbol,OP_BUY,0.001,NormalizeDouble(Ask,_Digits),0,0,0);