Errori, bug, domande - pagina 119

 
Ho letto da qualche parte su un forum che i commenti durante i test non vengono scritti nel log (per risparmiare spazio su disco). Quindi, la mia domanda è: come posso fare il debug del programma nel tester? Ho provato printf e PrintFormat - niente funziona nel tester, ho anche provato Alert.
 
Scriptong:
Ho letto da qualche parte su un forum che i commenti durante i test non vengono scritti nel log (per risparmiare spazio su disco). Quindi, la mia domanda è: come posso fare il debug del programma nel tester? Ho provato printf e PrintFormat - niente funziona nel tester, ho anche provato Alert.
Guardate i log degli agenti di prova - tutto è scritto lì, ma solo per gli agenti locali. Gli agenti remoti non scrivono l'output di Print() nei log per ragioni di risparmio delle informazioni.
Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Общие функции / Print - Документация по MQL5
 

Controllato. Il mio agente è locale (almeno è elencato in Local). Dopo aver eseguito Expert Advisor in modalità"Every tick", il contenuto della scheda "Log" corrisponde al contenuto del file di log dell'agente (Expert Advisor e file di log allegati).

Sì, ho dimenticato. Il periodo di prova è "Ultimo mese".

File:
test.mq5  2 kb
 

Il tuo log dice "versione di debug di 'test.ex5', per favore ricompilalo".

Significa che EX5 destinato al debug (premendo F5 nell'editor produce EX5 con informazioni di debug) non può essere eseguito nel tester.

Faremo una ricompilazione automatica di tali EA. Nel frattempo, ricompila manualmente il tuo EA.

 
alexvd:
E puoi portare il codice completo?

E probabilmente ho tirato fuori tutta questa storia, non riesco a pensare a nessun altro motivo...

Cercherò di descrivere la situazione in modo più dettagliato.

C'è una semplice classe "CMqlTimer", il compito di questa classe è di tracciare il momento di cambiamento di diversi intervalli di tempo: ora, giorno, settimana, mese, anno.

Tutto è realizzato con primitive molto semplici, per esempio, se i minuti sono uguali a 0 allora è arrivata "una nuova ora"; se il numero del giorno della settimana non corrisponde a quello memorizzato nella variabile allora è arrivata l'alternanza del giorno ("00:00:00" secondo l'ora del server). E così via.

L'analisi viene eseguita quando il timer viene attivato, con un intervallo di 1 secondo, il lavoro viene fatto in CMqlTimer::OnTimer(). Se l'intervallo di tempo cambia, la funzione deve essere eseguita. Per esempio se è un "nuovo" giorno dovrebbe essere eseguita la funzione CMqlTimer::OnRolloverDay().


Se rimuoviamo il resto del codice e scriviamo solo OnRolloverDay(), il risultato sarà il seguente:

//Function CMqlTimer.OnRolloverDay
bool CMqlTimer::OnRolloverDay()
//Дневной ролловер
{
//----------------------------------------------------------------------------//
//Work variables
string MessageText; //Text for message
int    UserEventID; //Identifier of the user event  

bool Result; //Returned importance
//----------------------------------------------------------------------------//

Result = true;

ResetLastError();

RolloverCountDay = RolloverCountDay+1;

UserEventID = CHARTEVENT_CUSTOM+15;
MessageText = StringFormat("Rollover Day (№ %d)",RolloverCountDay); //Можно просто "Rollover Day"
//We refer user event of the work chart
EventChartCustom(0,(ushort)UserEventID-CHARTEVENT_CUSTOM,0,0,MessageText);

//Checking for presence of the errors
  if(_LastError!=0)
  //В результате работы произошла ошибка
  {
  Result = false;  
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}

Tutti gli eventi utente sono tracciati e passati per la gestione alla classe principale

Sembra qualcosa del genere

void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
//                          Processing user events                            //
//----------------------------------------------------------------------------//
  if(id>CHARTEVENT_CUSTOM)
  //User event is received
  {
  Expert.OnEvent(id,lparam,dparam,sparam);
  }
//----------------------------------------------------------------------------//  
}

Quindi, gli eventi non raggiungono OnChartEvent in modalità test, cioè l'Expert Advisor non può gestire un evento inviato usando EventChartCustom in modalità test. Controllato visualizzando tutti gli eventi nel registro.

PS

La cosa più interessante è che la demo tutti gli eventi raggiungono, ma nel tester sta lavorando rifiuti.

Prima del 319 tutto funzionava e nel tester gli eventi venivano gestiti con successo. Vero l'ultima versione in cui ha funzionato non posso dire...

 
stringo:

Il tuo log dice "versione di debug di 'test.ex5', per favore ricompilalo".

Significa che EX5 destinato al debug (premendo F5 nell'editor produce EX5 con informazioni di debug) non può essere eseguito nel tester.

Faremo una ricompilazione automatica di tali EA. Nel frattempo, ricompila manualmente il tuo EA.

Grazie. Non sapevo che ci fosse una differenza tra i file ottenuti premendo F5 e F7.
 
Interesting:

E probabilmente ho tirato fuori tutta questa storia, non riesco a pensare a nessun altro motivo...

Cercherò di descrivere la situazione in modo più dettagliato.

...
Grazie. Ci penseremo.
 

Non capisco cosa c'è di sbagliato, EA funziona nel tester senza errori e anche nella macchina di prova dell'organizzatore passa senza errori.

Quando lo eseguo su un conto demo, ottengo un errore quando cerco di aprire un ordine:

2010.09.06 13:26:50 Trades '101894' : fallito acquisto istantaneo 0,10 USDJPY a 84,179 [Modalità di riempimento non supportata]
2010.09.06 13:26:45 Trades '101894' : fallito acquisto istantaneo 0,10 USDCAD a 1,03689 [modalità di riempimento non supportata]
2010.09.06 13:26:39 Trades '101894' : fallito acquisto istantaneo 0,10 USDJPY a 84,174 [modalità di riempimento non supportata]
2010.09.06 13:26:34 Trades '101894' : fallito acquisto istantaneo 0,10 USDCAD a 1,03685 [modalità di riempimento non supportata]
2010.09.06 13:26:28 Trades '101894' : fallito acquisto istantaneo 0,10 USDJPY a 84,174 [modalità di riempimento non supportata]
2010.09.06 13:26:23 Trades '101894' : fallito acquisto istantaneo 0,10 USDCAD a 1,03688 [modalità di riempimento non supportata]
2010.09.06 13:26:18 Trades '101894' : fallito acquisto istantaneo 0,10 USDJPY a 84,181 [modalità di riempimento non supportata]

Richiesta di vendita:

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_BID);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_SELL;
         request.type_filling=ORDER_FILLING_CANCEL

Richiesta di acquisto:

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_ASK);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_BUY;
         request.type_filling=ORDER_FILLING_CANCEL;

OrderCheck non trova alcun errore.


 

Sostituita la query ORDER_FILLING_CANCEL con la query ORDER_FILLING_AON, l'esperto funziona.

Ma il problema rimane, perché c'è una tale differenza nel funzionamento del tester e del server.


Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Che scherzo se il server del campionato diventa il contrario.