Errori, bug, domande - pagina 480

 
papaklass:
Ora aggiornato e cercando di capire di nuovo. Ho messo stampe su quasi tutte le linee. Riferirò i risultati.

Ecco la corsa con il tuo inserto, nel momento in cui lo stop loss è stato fissato:

2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 Posizione lunga di EURUSD da chiudere di stop-loss
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 -----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27 oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 CSampleExpert::Trade
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 ordine eseguito vendere 0,15 a 1,33328 [#63 vendere 0.15 EURUSD a 1,33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 operazione eseguita [#63 vendere 0,15 EURUSD a 1,33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss attivato comprare 0,15 EURUSD 1,32127 sl: 1,33328 tp: 1,35139 [#63 vendere 0.15 EURUSD a 1,33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 Posizione lunga di EURUSD da modificare trailing
 
Ovviamente il risultato diverso è una diversa elaborazione in OnTrade, io cerco solo i trade, solo quelli mi interessano, tu invece mi sembra di capire che stai elaborando tutti gli eventi classificandoli e qui c'è qualcosa di incasinato da qualche parte.
 
Immagino che anche il mercato delle scommesse sui futures sia una demo? Ne ho preso uno vero dalla MMVB, i lotti non corrispondono.
 
papaklass:

Piazzo ordini pendenti con una durata di 1 ora. Dopo un'ora, gli ordini che non sono stati attivati vengono chiusi alla scadenza dell'ordine. Se diversi ordini vengono chiusi simultaneamente e prima della chiusura la funzione HistoryOrdersTotal() aveva un valore diverso da zero, allora perde alcuni ordini. Per esempio, prima della chiusura di 8 ordini, la funzione aveva un valore di 4, ma dopo la chiusura, ha un valore di 10. Due ordini sono persi.


Cosa intende per "gli ordini sono stati persi"? Va tenuto presente che i messaggi che arrivano a OnTrade() possono portare informazioni su più di un evento di compravendita. Inoltre, se diversi messaggi vengono inviati simultaneamente, quando si elabora il primo messaggio, la cache storica potrebbe essere già cambiata, e si potrebbe avere una sensazione di "eventi persi".

Si prega di leggere l'articolo Eventi commerciali in MetaTrader 5:

Conclusione

Tutte le operazioni nella piattaforma di trading MetaTrader 5 sono asincrone, e l'invio di messaggi su tutti i cambiamenti nel conto di trading sono fatti indipendentemente l'uno dall'altro, quindi non cercare di tracciare un singolo evento secondo la regola "Una richiesta - Un evento di trading". Se volete determinare esattamente cosa è cambiato dopo l'evento Trade, dovete analizzare tutte le transazioni, posizioni e ordini ad ogni chiamata del gestore OnTrade e confrontarle con lo stato che avevamo prima che l'evento apparisse.
 
papaklass:
Ho specificamente richiesto il valore di HistoryOrdersTotal(), che era uguale a 4, prima di chiudere gli ordini. Dopo aver chiuso 8 ordini, il valore di HistoryOrdersTotal() avrebbe dovuto essere uguale a 12 (4 + 8), ma era uguale a 10. Ho allegato un file di log, possiamo vedere situazioni simili in esso più di una volta. Ho anche allegato l'Expert Advisor, con il quale questo è ottenuto. Fatelo voi stessi e vedrete tutto.

Provate a cambiare la funzione, cosa succederà?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
Il rapporto HTML dell'esecuzione del tester non viene sempre salvato in un file!
 
zigan:
Il rapporto HTML dell'esecuzione del tester non viene sempre salvato in un file!

Descrivere più precisamente. In quali circostanze.

 
alexvd:

Descrivere più precisamente. In quali circostanze.

Raramente, circa una volta su 20-30 corse del tester - aprire la scheda "Risultati

clicco su salva rapporto XML - ottengo il file del rapporto, tutto è OK!

clicco su salva rapporto HTML - la finestra per salvare il file si apre, si blocca con una ProgressBar vuota per un po' (brevemente), poi la ProgressBar si riempie rapidamente e la finestra si chiude... Ma non viene creato nessun file di report!

Non posso specificare un modello per quando esattamente questo accade.

 
Rosh:

Provate a cambiare la funzione, cosa succederà?

Non credo che questo possa aiutare. OnTrade, per una questione di principio, non può funzionare come papaklass.

La chiave è"dovete analizzare tutte le compravendite, le posizioni e gli ordini su ogni chiamata al gestore OnTrade e confrontarlo con lo stato in cui si trovava prima della sua comparsa" . Nell'esempio di su con ordini in sospeso, questo si applica solo agli ordini nella storia. Per evitare di perdere gli ordini, cambierei il codice in questo modo:

Introdurre una variabile globale int oldHistoryOrders; e in Ontrade, qualcosa come questo:

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
File:
 
papaklass:

Non è così che lavoro con OnTrade() come hai descritto. Nel mio codice allegato, ho rimosso tutto, lasciando solo la parte che evidenzia il bug della funzione. Non ho praticamente nessun loop nel mio EA. L'EA gestisce un singolo simbolo su un singolo tick. Pertanto, non ho bisogno di cicli. Io elaboro tutti i simboli entro 12 tick.

PS: OnTrade() mi informa di un evento commerciale e quale evento si è verificato è definito dalle mie funzioni senza loop.

Bene, ok, mi riferivo solo al tuo esempio che dimostra, presumibilmente, la perdita di ordini da parte della funzione OnTrade. OnTrade lavora in modo asincrono, non per tick, quindi non si preoccupa di quanti simboli elaborate in un tick. Hai un mucchio di ordini vuoti che scadono in una sola volta, quindi non puoi fare a meno del workaround. Ho cambiato il tuo codice per mostrare che OnTrade non perde nulla. L'ho anche eseguito nel tester e tutto sembra essere a posto. I ticker di tutti gliordini cancellati stampati dalla stampante di OnTrade sono presenti nel registro. Avete provato la mia versione?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5