Errori, bug, domande - pagina 2859

 
fxsaber:

In generale, quali sono i vostri pensieri su una possibile implementazione?

Ci sono molte possibili implementazioni

ma tutto si riduce al compito di scambio di dati tra gli EA

il modo più semplice è controllare il permesso per l'inizializzazione ed eseguire l'inizializzazione stessa in OnTick() - permetterebbe di evitare di ripristinare i grafici e poi eseguire l'EA su di essi, e il salvataggio dell'EA prima della chiusura sarebbe possibile farlo in OnDeinit()

nonè importante chi gestirà questo zoo - o l'EA principale o un servizio

 

Nel registro del tester

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

Cosa significa?

 
Aleksey Vyazmikin:

Nel registro del tester

Cosa significa?

Significa che quando si riceve il prossimo valore di m1 ohlc (o lo stato della barra quando si verifica con i prezzi aperti), il campo del tempo contiene 0

funzione non definita significa che il problema si è verificato al di fuori delle funzioni predefinite (OnTick, OnTimer ecc.), cioè nel ciclo principale del tester

 
Slava:

Significa che quando si ottiene il prossimo valore m1 ohlc (o lo stato della barra quando si prova con i prezzi aperti) il campo del tempo contiene 0

funzione indefinita significa che il problema si è verificato al di fuori delle funzioni predefinite (OnTick, OnTimer ecc.), cioè nel ciclo principale del tester

Tutto funzionava bene per tutto il giorno e poi è iniziato. Cosa posso fare come utente?

 
Slava:

Significa che quando si ottiene il prossimo valore m1 ohlc (o lo stato della barra quando si prova con i prezzi aperti) il campo del tempo contiene 0

funzione non definita significa che il problema si è verificato al di fuori delle funzioni predefinite (OnTick, OnTimer ecc.), cioè nel ciclo principale del tester

Non capisco, c'è un errore nel mio codice o è un errore nel terminale? Ho cancellato tutta la cronologia - non è servito.

Aggiunto:

Ho trovato una funzione nel mio codice, disabilitandola si evita l'errore, ma in un altro EA questa funzione funziona correttamente! Come mai? Posso lasciarlo nel mio messaggio privato.

Anche quando questa funzione buggata è abilitata, OnTick() gira completamente sulla prima barra e poi quell'errore.

Su diversi terminali l'errore è confermato.

L'ho eseguito per zecche - nessun errore...

Ma la stranezza è nel registro:

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

Sui ticks se guardare lo strumento, il primo tick era esattamente alle 10:00, e la sessione di trading è ancora chiuso in questo momento. Questo è in modalità visiva, senza tick la prima stampa arriva a ore 10.

 
Igor Makanu:

Il modo più semplice è controllare il permesso di inizializzazione all'inizio di ogni EA in OnTick()

Questo è il principale punto critico del problema.
 
fxsaber:
Questo è il problema principale del compito.

Cerca di prestare attenzione agli ID dei grafici e corri per anzianità. Ma questo non annulla l'interazione degli EA. O fare un file o forse un database SQLite con gli ID dei grafici nella sequenza di lancio.

Qualcosa come, alla prima inizializzazione, se non c'è nessun Chart_ID() nella lista, allora viene inserito nella lista. Se non è chiuso a causa della chiusura del terminale, allora viene rimosso dalla lista. In questo modo sarà possibile configurare l'interazione degli EA.

 
fxsaber:
Questo è il principale punto critico del problema.

abbozzando come la vedo io... ha creato 2 EA con questo codice:

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

e un controllo EA, che funziona in timer (5 secondi)

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


Controllato, tutto funziona, l'unica cosa, o non ha funzionato con GlobalVariableSetOnCondition() per fare un record nelle variabili globali

 
fxsaber:
Questo è il problema principale del compito.

GlobalVariableSetOnCondition è tutto ciò che serve per risolvere il problema.

L'operazione è consentita solo quando GlobalVariableSetOnCondition ha restituito true.
Dopo l'inizializzazione riuscita e il rilascio delle risorse, riporta la variabile principale al suo stato originale e inizia un altro EA.

In DeInit - cancellazione incondizionata della variabile, per non incorrere nel terminale senza EAs (se il caricamento precedente non è stato completato correttamente).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Grazie per le raccomandazioni. Guarderò GlobalVariableSetOnCondition.

Motivazione: