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

 
Maxim Kuznetsov:

pensare a quello che succederà allo Stop Out. (avete già Margin Call, Steppe è più vicino che mai)

il tuo trade sarà forzatamente chiuso, ma tu ignori tale opzione, e la cercherai ogni tick (nella storia, è lunga) e invierai ordini errati.

Solo per aggiungere per chi ha "più di 10 anni di programmazione MQL"

Se qualcosa può accadere, accadrà sicuramente.

Stop Out e Margin Call non sono così normali, ma è naturale, e un EA dovrebbe essere pronto per loro.

Le condizioni commerciali possono cambiare, non sono costanti. StopLevel salta e anche la leva cambia a volte.

L'utente può facilmente impostare/cambiare Stop/Take o chiudere una posizione, anche involontariamente - l'Expert Advisor dovrebbe reagire a questo

Un utente può aprire/chiudere un ordine con Magic (o accidentalmente impostare Magic=0 e negoziare a mano) - cosa farà il robot?

Il saldo viene depositato/prelevato senza riavviare l'EA - è estremamente importante che il robot sia in grado di farlo (c'è stato un argomento di recente - un uomo ha appena perso soldi)

Il terminale può riavviarsi e impiegare molto tempo per aggiornarsi, o la connessione può essere persa per un tempo significativo - tutto questo e tutto quello che è successo offline deve essere preso in considerazione

Il validatore controlla solo l'1-2% del "minimo del candidato" e la gente ancora si lamenta...

 
Renat Akhtyamov:

sembra essere stato scritto in sequenza, domanda - risposta

tutte le pagine del thread sono accessibili.

Renat, capisco che stai contando i mandati. Non capisco perché?


Maxim Kuznetsov:

Solo per aggiungere per tutti coloro che hanno "più di 10 anni di programmazione MQL".

Se qualcosa può accadere, accadrà sicuramente.

Stop Out e Margin Call non sono così normali, ma è naturale, e un EA deve essere pronto per loro

Le condizioni commerciali possono cambiare, non sono costanti. StopLevel salta e anche la leva cambia a volte.

L'utente può facilmente impostare/cambiare Stop/Take o chiudere una posizione, anche involontariamente - l'Expert Advisor dovrebbe reagire a questo

Un utente può aprire/chiudere un ordine con Magic (o accidentalmente impostare Magic=0 e negoziare a mano) - cosa farà il robot?

Il saldo viene depositato/prelevato senza riavviare l'EA - è estremamente importante che il robot sia in grado di farlo (c'è stato un argomento di recente - un uomo ha appena perso soldi)

Il terminale può riavviarsi e impiegare molto tempo per aggiornarsi, o la connessione può essere persa per un tempo significativo - tutto questo e tutto quello che è successo offline deve essere preso in considerazione

Il validatore è controllato solo dall'1-2% dei "candidati minimi" e la gente ancora si lamenta...

Maxim, di cosa stai parlando?! Che cosa ho chiesto consigli su cosa fare quando ho uno stop out. Leggete il forum da pagina 6, secondo me ho esposto la mia domanda in modo molto dettagliato.

 
Andrey Kaunov:

Renat, capisco che stai contando i mandati. Non capisco perché?


Maxim, di cosa stai parlando?! Ho chiesto consigli su cosa fare con uno stop out? Leggete il forum a pagina 6, credo di aver esposto la mia domanda in modo molto dettagliato.

Perché i biglietti sul reale non sono 0,,,,N

 
Oh, intendi il mio piccolo codice. Quindi non importa che tipo di biglietti ci siano. Renat c'è un array bidimensionale. Nella cella [0] scrive un biglietto, e nella cella [1] conta gli ordini. Potremmo farlo con variabili diverse, ma ho deciso di farlo così.
 
Andrey Kaunov:

Renat, capisco che stai contando i mandati. Non capisco perché?


Maxim, di cosa stai parlando?! Ho chiesto consigli su cosa fare con uno stop out? Leggete il forum da pagina 6, secondo me ho esposto la mia domanda in modo molto dettagliato.

con i tuoi 10 anni di esperienza, cosa posso consigliarti... niente in linea di principio :-)

Stai ignorando il mio consiglio e insistendo nel fissare il Validor per il tuo EA.

---

hai uno stop out su NZDUSD, un ordine è stato chiuso, la logica del tuo EA non ha importanza, lo selezioni ancora e mandi OrderClose, ottieni false. Questa sorprendente operazione si ripete ad ogni tick, il tutto rallenta e il controllo viene annullato. E questo nel caso più semplice.

A proposito dei controlli delle condizioni commerciali - vedi le 14 pagine precedenti

 
Andrey Kaunov:

Presta attenzione a questo tuo post:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Stanco dell'errore che non ci sono operazioni commerciali

Andrey Kaunov, 2020.07.25 11:42

Lo proverò, grazie per il suggerimento.

Vladimir, puoi capire la domanda in modo costruttivo? Non controllo il lotto per il margine e così via? L'articolo "Quali controlli devono passare..." è 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 ho la storia che gli scambi avvengono (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'Expert Advisor viene lanciato.

Quindi, cosa fa il validatore? Penso che finora l'unica cosa che fa è far impazzire i programmatori!

Notate che non 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, potete 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.

Il tuo primissimo screenshot. Ti sei attaccato al messaggio che non ci sono scambi su NZDUSD. E per 14 pagine avete combattuto con questo mulino.

Ma l'errore principale nel primo screenshot non è quello. È quello che ti informa sui test troppo lunghi su GBPUSD. Poiché il test è durato troppo a lungo, il validatore lo ha bloccato.

Esegui il profilatore di codice su GBPUSD, M30 e lascialo scambiare per tre ore. Poi guardate i colli di bottiglia e correggeteli.

 
Maxim Kuznetsov:


---

Hai uno stop out su NZDUSD, hai chiuso un ordine, la logica del tuo EA se ne frega, lo selezioni ancora e mandi OrderClose, ottieni false. Questa sorprendente operazione si ripete ad ogni tick, il tutto rallenta e il controllo viene annullato. E questo nel caso più semplice.

Sul controllo delle condizioni commerciali - vedi le 14 pagine precedenti.

Maxim, stai leggendo il codice con molta disattenzione.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

La condizione menzionata nel marcatore non permetterà alla funzione OrderClose() di scappare se l'ordine è chiuso, questa è la prima cosa. E in secondo luogo, se almeno un ordine è aperto su NZDUSD, il validatore non restituisce "no trade".

Artyom Trishkin:

...

Esegui il profilatore di codice su GBPUSD, M30 e lascialo scambiare per tre ore. Poi guardate i colli di bottiglia e correggeteli.

Ok, Artyom. Farò un tentativo.

 
Andrey Kaunov:

Maxim, hai letto il codice con molta disattenzione.

La condizione specificata dal marcatore non lascerà scappare la funzione OrderClose(), questa è la prima cosa. E in secondo luogo, se almeno un ordine è stato aperto su NZDUSD, il validatore non restituisce "no trade".


Francamente, sono stanco di fare il debugger di un codice storto e di cercare di combattere l'autostima dell'autore. Gli errori specificati sono lì, guardate voi stessi

Se non sapete cosa farne, dovrete fare qualcosa per il vostro profitto. Il validatore non ha niente a che fare con questo

 
Non ti sto chiedendo personalmente, Maxim, di fare il debug di qualcosa. Il codice è storto, bene, ma passa la convalida. La domanda è molto diversa.
 
Artyom Trishkin:

...

Esegui il profilatore di codice su GBPUSD, M30 e lascialo scambiare per tre ore. Poi guardate i colli di bottiglia e correggeteli.

Artyom, il profiler di codice non ha mostrato alcun collo di bottiglia. L'intero codice funziona senza problemi, senza processi patologicamente lunghi.

La linea di fondo di tutta questa storia è questa. Con le buone o con le cattive, ho finalmente superato la convalida. Non dipende affatto dal codice (se è corretto, senza errori evidenti, come indicato in questo articolo). Come funziona il validatore è ovviamente noto solo al suo creatore. Il codice viene controllato dopo 2 volte e poi alla terza volta. A volte passa diverse volte di seguito e a volte non lo fa affatto. Inoltre, cambio solo i parametri di input (non sono significativi) o sposto le linee che non cambiano nulla quando le riordino, o anche rimuovo o aggiungo commenti (che non dovrebbero influenzare il file di lavoro in alcun modo).

In generale, passare o fallire la convalida, dipende solo dal validatore "umorale" (tensione nella rete, qualche tipo di flusso di potenza o altro). Così il codice nel solito tester a parametri normali non si è mai bloccato e non ha dato alcun fallimento, su qualsiasi coppia e TF.