Errore di convalida quando si rilascia il robot di trading al mercato. - pagina 5

 
Grazie per il suggerimento, ma probabilmente non è il mio caso. Il mio validatore non vede affatto le funzioni di trading, nessun modo per arrivare al numero massimo di ordini )))
 

Oh, shaitan... Convalida superata e ora

nessuna operazione commerciale

non è più un errore.

P.S. Era uno scatto casuale. Il prossimo test è di nuovo la stessa cosa


 
Andrey Kaunov:

Non c'è nessun errore qui, non capisco affatto cosa stia succedendo. Ho messo una stampella (divisione per zero) prima della funzione commerciale:

Funziona:

Se lo tolgo, mi dà lo stesso

Nessuna operazione commerciale.

Non capisco cosa impedisce al validatore di OrderSend(). Dopo tutto, se gli arriva, ci devono essere errori di fatturazione (anche se li ho corretti tutti) 130, 131, 134, ..., ma non"nessuna operazione commerciale". Devo solo mettere un ordine pendente da qualche parte lontano in OnInit() per evitare che si attivi.

E che senso ha una tale stampella se la condizione in cui un commercio deve essere eseguito non entra nel codice?

 
Perché non arriva? Guarda attentamente, Alexey. Appena prima di OrderSend c'è una stampella.
 
Andrey Kaunov:
Perché non c'è nessun input? Guarda attentamente Alexey. C'è una stampella appena prima di OrderSend.

Giusto. Se OrderSend non viene eseguito, significa che l'esecuzione del codice non lo raggiunge per qualche motivo. E non importa cosa metti prima nel blocco di condizioni, non c'è nessun input e nessuna esecuzione, nemmeno la divisione per zero.

 

Aspetta, non capisco. Se l'operatore 1 (divisione per zero) viene eseguito, allora il successivo è l'operatore if. E questo significa controllare le sue condizioni. Per verificare la condizione, la funzione OrderSend deve essere eseguita, il che significa che è la prossima in linea dopo la divisione per zero.

Ma non importa. Ho cambiato il codice per il bene della purezza dell'esperimento:


Il risultato è lo stesso. Il risultato con la stampella è un errore di divisione per zero. Senza la stampella, il risultato è mostrato sopra: nessuna operazione commerciale.

 
Andrey Kaunov:

Aspetta, non capisco. Se l'operatore 1 (divisione per zero) viene eseguito, allora il successivo è l'operatore if. E questo significa controllare le sue condizioni. Per verificare la condizione, la funzione OrderSend deve essere eseguita, il che significa che è la prossima in linea dopo la divisione per zero.

Ma non importa. Ho cambiato il codice per il bene della purezza dell'esperimento:


Il risultato è lo stesso. Il risultato con la stampella è un errore di divisione per zero. Il risultato è mostrato sopra senza di essa: nessuna operazione commerciale.

Non avresti dovuto usare un'immagine per incollare il codice. È impossibile leggerlo del tutto. E il problema non è in questo frammento di codice. Il problema è che alcune condizioni non sono soddisfatte in alcuni parametri di input e non c'è alcuna notifica.

 
Andrey Kaunov:
Perché non arriva?

Perché cerchi di scrivere peggio per il mercato che per te stesso?

È semplice - prima di inviare un ordine, vedere "è almeno eseguibile?".

controlla i limiti (l'hai detto tu), controlla i fondi e il margine (non ce l'hai), vedi se c'è un collegamento e se il commercio è permesso.

(opzione) se ci sono stati calcoli pesanti, non è un peccato rinfrescare i tassi prima di leggere Bid Ask

Per il vostro bene farete tutti questi controlli. Perché non ora?

 

Pensi che io non controlli. La dimensione del lotto è controllata in una funzione separata

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin();
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

I limiti non sono necessari qui, perché Stop Loss e Take Profit sono uguali a zero all'apertura della negoziazione.RefreshRates() aggiorna i dati al calcolo del lotto. Certo, non c'è nessun controllo di connessione, ecc. prima di ogni ingresso, ma non è questo il punto. Se OrderSend inviasse una richiesta, ci sarebbe un errore specifico: 130, 131, ecc. Ma quello che ho è.

Non si tratta affatto di inviare un ordine da aprire. Anche nell'ultimo test, quando ho impostato una posizione di controllo nella funzione OnInit().

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

Non avresti dovuto incollare il codice in un'immagine. È impossibile leggerlo. Il problema non è in questo frammento di codice. Il problema è che qualche condizione non è soddisfatta in alcuni parametri di input e non c'è alcuna notifica di questo fatto.

Può essere. Ma ho già ricontrollato tutto. Non so dove scavare dopo.

 
Andrey Kaunov:

Pensi che io non controlli. La dimensione del lotto è controllata in una funzione separata

I limiti non sono necessari qui, perché Stop Loss e Take Profit sono uguali a zero all'apertura della negoziazione.RefreshRates() aggiorna i dati al calcolo del lotto. Certo, non c'è nessun controllo di connessione, ecc. prima di ogni ingresso, ma non è questo il punto. Se OrderSend inviasse una richiesta, ci sarebbe un errore specifico: 130, 131, ecc. Ma quello che ho è.

Non si tratta affatto di inviare un ordine da aprire. Anche nell'ultimo test, quando ho impostato una posizione di controllo nella funzione OnInit().


È possibile. Ma ho già ricontrollato tutto. Non so dove andare dopo.

Guardate come sono stati implementati altri ordini nell'EA. Non credo che l'Expert Advisor apra solo

all'apertura ticket<0 è stato impostato - guarda l'altra logica, come reagisce a questo in realtà