Afflitto dall'errore non ci sono operazioni commerciali - pagina 5

 
Alexey Viktorov:

Non è perché l'ho ricompilato, è perché i test sono iniziati da una data diversa. E ho notato questo bug, se si inserisce qualcosa che era già presente, allora il test non avviene, ma dà immediatamente il risultato del test precedente. Quindi non fatevi ingannare da queste stampelle. Cerca di renderlo normale. Se manca qualcosa o i parametri non sono validi, segnalalo tramite Print e tutto sarà corretto.

Se fosse solo dovuto a una data diversa, allora i miei controlli lo rivelerebbero (barre mancanti, ecc.), ma non è la data il problema. Se non posso ricostruire l'errore che la validazione automatica trova, allora è più facile per me scivolare lo stesso e sperare che la vendetta con gli acquirenti trovi l'area problematica (se c'è). Questa implementazione delle validazioni non mi dà una comprensione completa di dove cercare l'errore. E Print è già spinto dappertutto per me.

Alexey Viktorov:

E ho notato un tale shag, se incollo che già era, poi il test non si verifica e dà immediatamente il risultato del test precedente.

E per non ottenere un risultato di test precedente, devo cambiare qualcosa, anche aggiungere una stringa vuota (volevo dire "ricompilare").

 
Roman Gergert:

Ho finalmente capito, forse qualcuno può aiutare, in generale, il Soviet ha solo controllato il lotto minimo quando la MM è stata abilitata, e così hardcore set lot = 0.01, bene, nel deposito validatore risulta essere $ 1 (trovato questa informazione in uno dei topic), rispettivamente, utilizza il lotto 0.001 (o così) per scambiare e perché ho sempre avuto un lotto di 0.01 in un posto, gli mancavano i fondi e il robot non scambia)

Esattamente, Roman, il validatore sta testando con un deposito di 1$.

C'è molta funzione di normalizzazione nell'EA. Se restituisce 0, il trade non tenta nemmeno di aprirsi:

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Ma non è chiaro allora come la funzione di normalizzazione dei lotti di questo EA mandi un lotto di 0,2 ad aprire:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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()*0.95;
   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;
   return(_lot);
}

Dopo tutto, se il lotto 0.2 arriva per il controllo e il margine a giudicare dai log è 645, allora questa parte dell'espressione dovrebbe dare vero

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

E la funzione invierà 0,0, ma non 0,2. Può inviare solo 0,2 se

MarketInfo(symbol,MODE_MARGINREQUIRED);

ha restituito 0 o un valore trascurabile. Non capisco affatto come funziona questo validatore.

Cari sviluppatori MQL, vi preghiamo di inviarci i log dei test invece di secchi rapporti di errore di convalida in tre righe. Sarà molto più facile per noi, umili programmatori, capire gli errori di codice e correggerli. Puoi inviarlo come archivio alla posta elettronica, probabilmente penserai a un modo)))

P.S. Situazione divertente. Per il 5° giorno sto cercando di mettere sul mercato un Expert Advisor che funziona perfettamente nel tester e nella vita reale.
 
Andrey Kaunov:

Esattamente, Roman, il validatore prova con un deposito di 1$.

C'è una funzione di normalizzazione molto nell'EA. Se restituisce 0, il trade non tenta nemmeno di aprirsi:

Ma non è chiaro allora come la funzione di normalizzazione dei lotti di questo EA mandi un lotto di 0,2 ad aprire:

Dopo tutto, se il lotto 0.2 arriva per il controllo e il margine a giudicare dai log è 645, allora questa parte dell'espressione dovrebbe dare vero

E la funzione invierà 0,0, ma non 0,2. Può inviare solo 0,2 se

ha restituito 0 o un valore trascurabile. Non capisco affatto come funziona questo validatore.

Cari sviluppatori MQL, vi preghiamo di inviarci i log dei test invece di secchi rapporti di errore di convalida in tre righe. Sarà molto più facile per noi, umili programmatori, capire gli errori di codice e correggerli. Potresti inviarli come archivio per e-mail, potresti pensare a un modo :)))

P.S. Situazione divertente. Per il 5° giorno sto cercando di mettere sul mercato un Expert Advisor che funziona perfettamente nel tester e nella vita reale.

sembra che tu abbia una leva diversa da quella del Mercato, forse 1:500

provare a portare il calcolo del lotto a 1k100 cambiando solo una linea nel codice:

margin = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

e il lotto minimo per il mercato è 0,1 credo....
 

Vivete in una specie di mondo limitato tutto vostro. In un mondo normale, il lotto minimo può essere molto diverso da 0,01

RICETTA: leggere e rileggere l'articolo "Quali controlli devono passare...".

Prima di inviare un ordine di trading, devi controllare se passerà, se c'è abbastanza margine...


In generale, il validatore ha finora soddisfatto il suo compito principale: setacciare il codice incompleto dal Marketplace.

 
Renat Akhtyamov:

sembra che tu abbia una leva diversa da quella del mercato, forse 1:500

provare a portare il calcolo del lotto alla leva 1k100 cambiando solo una linea nel codice:

margin = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

Renat, grazie per il consiglio, farò una prova.

Vladimir Karputov:

Tu vivi in un mondo limitato tutto tuo. In un mondo normale il lotto minimo può essere molto diverso da 0,01

RICETTA: leggere e rileggere l'articolo "Quali controlli devono passare...".

Prima di inviare un ordine di trading, devi controllare se passerà, se c'è abbastanza margine...


In generale, il validatore ha finora fatto fronte al suo compito principale: setacciare il codice incompleto dal mercato.

Vladimir, puoi capire la domanda in modo costruttivo?! Non controllo il lotto per il margine e altre cose?L'articolo "Quali controlli devono essere superati..." è già come una bibbia per me. Ho postato degli snippet di codice qui sopra. Ho cambiato il codice secondo le vostre raccomandazioni dell'articolo per una piena conformità:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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()*0.95;
   //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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Ma ottengo ancora "no trades":

Bene, se la funzione invia sempre il lotto 0,0 e non permette di aprire operazioni, la cambio per inviare il lotto minimo:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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()*0.95;
   //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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

E ottengo la storia che i trade si verificano (vedi gli screenshot qui sotto). Ma il lotto minimo naturalmente viene molto strano, ma lasciamo che venga. Ma le offerte ci sono!

Che è in questa situazione, cosa molto strana è validatore, facendo un lotto minimo 0,2 per un deposito di $ 1.


Naturalmente, non ci sarà nessun accordo! E questo con un codice perfettamente adeguato. A proposito, ho rimosso tutte le condizioni sugli indicatori, ecc. per i test. Le transazioni iniziano ad essere aperte non appena l'EA viene avviato.

Vladimir Karputov:

...

Finora, il validatore ha fatto fronte al suo compito principale: vagliare il codice incompleto dal mercato.

Quindi cosa gestisce il validatore? Non vedo come possa fare altro che far saltare il cervello ai programmatori!

Notate che non vi sto chiedendo di cambiare qualcosa nel validatore. Possiamo semplicemente vedere i log dei test. Capiremo allora con quali parametri vengono eseguiti i test e su quali depositi. Alla fine della giornata, possiamo almeno usare le stampe per controllare dove si trova l'errore nel codice e correggerlo il più velocemente possibile. Non staremo a puntare il dito nel cielo per una settimana intera, cercando solo di localizzare un errore. Non stiamo lavorando l'uno contro l'altro, vero? Capisco, stiamo cercando di guadagnare qualcosa insieme.

 
Andrey Kaunov:

...Non è che stiamo lavorando l'uno contro l'altro! Capisco, stiamo cercando di guadagnare qualcosa insieme.

Andrew, mi sono imbattuto in un blocco del server una volta durante il fine settimana.

il che significa che non mangerebbe MarketInfo(...)

Sono riuscito a malapena a farlo funzionare.

Quindi, se si capisce che non si può inghiottire Market, resta da pensare come fare in modo che il validatore non giuri

Per esempio, chiedo: quale leva?

Dice 0.

Aggiungo nel codice - se è 0, allora dice 100

Se la logica è chiara, funzionerà e buona fortuna!

 

Capisco, Renat, grazie.

Ho già fatto molte stampelle, ma in alcuni punti sono in un vicolo cieco. E voglio che il codice adeguato sia adeguatamente testato. Inoltre, non è impossibile trovare un problema in assenza di log di test, ma è molto laborioso.

Forse anche il validatore sarebbe bello avere un aggiornamento. Non sono l'unico che incontra questi problemi.

 
Andrey Kaunov:

Capisco, Renat, grazie.

Ho già fatto molte stampelle, ma in alcuni punti sono in un vicolo cieco. E voglio che il codice adeguato sia adeguatamente testato. Inoltre, non è impossibile trovare un problema in assenza di log di test, ma è molto laborioso.

Forse anche il validatore sarebbe bello avere un aggiornamento. Non sono l'unico che incontra questi problemi.

Sì, non sei l'unico che ha affrontato questo problema, nel prossimo thread c'è un altro che ha affrontato questo problema - siete già due.

Inoltre, guardate quanti EAs vengono pubblicati sul mercato ogni giorno senza problemi, si chiama "il livello di professionalità".

 

Vitaly, se tu e altri "professionisti" riuscite a passare la convalida la prima volta, posso solo applaudire. Ma ci sono ben più di due thread su un problema simile. Inoltre non tutti scrivono, alcuni leggono e basta. A proposito, l'Expert Advisor non è mio. Lo preparo nel mercato per il cliente. Ma questo non annulla i problemi descritti sopra. Se leggi attentamente il mio post, forse come "professionista" puoi suggerire una soluzione al problema. Mettere un post sulla falsariga di "Tu sei stupido e io sono intelligente" non richiede molta conoscenza.

Ecco un altro problema per voi. Perché avendo aggiunto all'inizio di OnTick() l'apertura seriale incondizionata di 5 transazioni in 5 minuti con lotto minimo, il validatore mi dà anche un messaggio"nessuna operazione di trading".

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitaly, se tu e altri "professionisti" riuscite a passare la convalida la prima volta, posso solo applaudire. Ma ci sono ben più di due thread su un problema simile. Inoltre non tutti scrivono, alcuni leggono e basta. A proposito, l'Expert Advisor non è mio. Lo preparo nel mercato per il cliente. Ma questo non annulla i problemi descritti sopra. Se leggi attentamente il mio post, forse come "professionista" puoi suggerire una soluzione al problema. Mettere un post sulla falsariga di "Tu sei stupido e io sono intelligente" non richiede molta conoscenza.

Ecco un altro problema per voi. Perché avendo aggiunto all'inizio di OnTick() l'apertura incondizionata di 5 trade in 5 minuti con lotto minimo il validatore mi dà"nessuna operazione di trading"?

E dovresti prima postare la risposta completa del validatore qui

E cosa le fa pensare che la validatrice regoli i biglietti secondo il principio che lei ha inventato?

per aprire 5 compravendite, dovete contare il numero di compravendite aperte, non il ticketing
Motivazione: