Inizializza e reinizializza automaticamente l'EA da un file

 
Compito: ripristinare l'ambiente EA (dati di posizione, contatori, ecc.) dopo la reinizializzazione, il riavvio in caso di crash del sistema, ecc.

Soluzione: salviamo ogni cambiamento nelle variabili dinamiche dell'EA in un file. Durante OnInit(), tutta questa roba viene caricata di nuovo nel file.

Tuttavia, lo stato passato delle variabili non può essere caricato dal file se:
  • La struttura del file è cambiata (versione diversa, nuova build dell'Expert Advisor). È elementare da controllare, nessun problema.
  • Il bot si è bloccato l'ultima volta. Diciamo che è andato in crash su uno stopout o si è bloccato o è andato oltre il limite di errore, allora ci potrebbero essere variabili nel file che causano un errore immediatamente. Questo è in parte molto facile da controllare (limite di errore da considerare, record di errore critico...), ma non è una soluzione completa.
  • Il file è troppo "polveroso". Supponiamo che l'ultima volta l'EA sia stato caricato X giorni fa o addirittura oggi, ma le informazioni in esso contenute sono già superate. Come controllarlo - il fudge lo sa.

Ora l'ho fatto: analizzare la causa di OnDeinit(), se il programma si chiude, allora cancello il terminale globale (come una bandiera di reinizializzazione).

Quando non c'è questo flag durante OnInit(), devo chiedere all'utente ogni volta con una stupida casella di messaggio "restore variables from file?

Questo è un modo follemente stupido e scomodo!


Domanda: come automatizzare completamente una tale soluzione?

Come si fa a capire quando un file non può essere caricato e quando può essere scaricato?

Almeno ridurre al minimo la chiamata di questa casella di messaggistica.

 

MQL4 o MQL5?

SeMQL5, allora:

Nel controllo OnInit():

1. Posizione

if ( PositionSelect(_Symbol) )
{
}
else
{
}

2) Ordini:

(se qualcosa va storto, cancello semplicemente tutti gli ordini senza controllare da dove vengono. )

//+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
  int orders_total = OrdersTotal();
//---  
  if ( orders_total > 0 )
  {
    for ( int i = ( orders_total - 1 ); i >= 0; i-- )
    {
      ulong temp_order_ticket = OrderGetTicket( i );
      
      if ( OrderSelect( temp_order_ticket ) )
      {
        string temp_symbol = OrderGetString( ORDER_SYMBOL );
        
        if ( ( temp_symbol == sec_symbol ) || ( temp_symbol == _Symbol ) )
        {
          RemoveOldOrder( temp_order_ticket );
        }
      }
    }
  }
}

3. Variabili globali del terminale:

  if ( !GlobalVariableCheck( "trans_count" ) )
  {
    datetime a_time = GlobalVariableSet( "trans_count", 0 );
    
    if ( ulong( a_time ) == 0 )
    {
      MessageBox( "Глобальная переменная терминала 'Счётчик транзакций' не создана!", "Ошибка", MB_OK | MB_ICONHAND );
      return( INIT_FAILED );
    }
  }

4. Variabili da salvare

a) Caricamento:

//+------------------------------------------------------------------+
//| Expert Load setings function                                     |
//+------------------------------------------------------------------+
void LoadSettings()
{
  string file_name = _Symbol + ".dat";
  int file_handle;
//---  
  if ( FileIsExist( file_name, 0 ) )
  {
    file_handle = FileOpen( file_name, FILE_READ|FILE_BIN );
    
    if ( file_handle != INVALID_HANDLE )
    {
      e_high = FileReadLong( file_handle );
      a_profit = FileReadLong( file_handle );
      e_low = FileReadLong( file_handle );
      ord_delta_high = FileReadLong( file_handle );
      ord_delta_low = FileReadLong( file_handle );
      order_delta = FileReadLong( file_handle );
      exit_delta = FileReadLong( file_handle );
      FileClose( file_handle );
    }
  } 
}

b) Salvataggio ( OnDeInit() )

//+------------------------------------------------------------------+
//| Expert Save settings function                                    |
//+------------------------------------------------------------------+
void SaveSettings()
{
  string file_name = _Symbol + ".dat";
  int file_handle;
  bool file_found = true;
//---  
  if ( FileIsExist( file_name, 0 ) )
  {
    if ( FileDelete( file_name, 0 ) ) file_found = false;
  }
  else
  {
    file_found = false;
  }
//---
  if ( !file_found )
  {
    file_handle = FileOpen( file_name, FILE_WRITE|FILE_BIN );
    
    if ( file_handle != INVALID_HANDLE )
    {
      FileWriteLong( file_handle, e_high );
      FileWriteLong( file_handle, a_profit );
      FileWriteLong( file_handle, e_low );
      FileWriteLong( file_handle, ord_delta_high );
      FileWriteLong( file_handle, ord_delta_low );
      FileWriteLong( file_handle, order_delta );
      FileWriteLong( file_handle, exit_delta );
      FileClose( file_handle );
    }
  } 
}
 
Fry_Антон:
Il compito: ripristinare l'ambiente dell'EA (dati di posizione, contatori, ecc.) dopo la reinizializzazione, il riavvio in caso di guasto del sistema, ecc.

La contro-domanda è Perché?

Imho, ripristinare l'ambiente da un file è sempre un suicidio a lungo termine. Quando si riavvia, si dovrebbe sempre ricalcolare i dati in base all'ambiente di trading MetaTrader.

 
Fry_Антон:
Compito: ripristinare l'ambiente EA (dati di posizione, contatori, ecc.) dopo la reinizializzazione, il riavvio in caso di guasto del sistema, ecc.
Ricalcolo di
 
Vasiliy Sokolov:

La contro-domanda è Perché?

Imho, ripristinare l'ambiente da un file è sempre un suicidio a lungo termine. Si dovrebbe sempre ricalcolare i dati in base all'ambiente di trading MetaTrader quando si riavvia.

Caratteristiche del mercato dei futures.

Non tutto può essere ricalcolato. Naturalmente aggiorno quello che posso dall'ambiente, ma... Bene, ecco un esempio:

Alla cancellazione di una posizione e gli ordini sono chiusi/aperti. Il terminale blocca il trade e cancella gli ordini per il giorno (e gli ordini sono proibiti dal broker fino alla cancellazione). Devo creare nuovi ordini.

E ho bisogno del prezzo iniziale di apertura di una posizione, del tempo iniziale di impostazione di una posizione e degli ordini.

Così, devo tenere la mia contabilità di tali parametri.

Ci sono anche contatori di richieste al secondo/minuto/ora/giorno, contatori di azioni errate non fatali, ecc. ecc.

Rinuncerei volentieri al file! Se fosse reale. =(

C'è una situazione come questa: il terminale è andato in crash (le build di oggi sono stabili, e prima era sempre così, e non il fatto che ci saranno sempre e solo release stabili).

Dopo il crash del terminale: riavvio rapido e autorun - ripristino da file e tutto funziona.

Funziona molto stabile, perché salvo sempre il file di inizializzazione all'evento OnTrade() (con un timer per un secondo o due, per non tormentare il disco).


Quindi per me la domanda è molto rilevante: come non caricare le variabili da un file che è obsoleto o pericoloso da caricare?

 
Михаил:

MQL4 o MQL5?

Se èMQL5, allora:

Nel controllo OnInit():

1. Posizione

2) Ordini:

(se qualcosa va storto, cancello semplicemente tutti gli ordini senza controllare da dove vengono. )

3. Variabili globali del terminale:

4. Variabili da salvare

a) Caricamento:

b) Salvataggio ( OnDeInit() )

L'ho fatto quasi come questo. Ma salvo il file a OnTrade() con un timer.

Ho anche un casino di segni diversi e altre variabili, e il codice è in continua evoluzione, quindi era molto scomodo memorizzarli uno per uno.

Ho creato una struttura di base che contiene tutto ciò di cui ho bisogno per il file (tranne alcuni valori di stringa).

L'ho chiamato con una sola lettera, quindi il codice è abbastanza corto (b.volume è quasi come volume). Ed è comodo salvare l'intera struttura in una volta sola con l'operatore =.

 
Fry_Антон:

...

Domanda: come automatizzare completamente una tale soluzione?

...

Un approccio fondamentalmente diverso alla programmazione EA.

 
Dmitry Fedoseev:

Un approccio fondamentalmente diverso alla programmazione EA.

Espandi la risposta a un pensiero ragionevolmente utile e te ne sarei grato.

Quali sono i principi di base che rendono il codice EA "migliore"?

 
Fry_Антон:

Espandi la risposta a un pensiero ragionevolmente utile e te ne sarei grato.

Quali sono i principi di base che rendono il codice EA "migliore"?

È già stato scritto qui - ricalcolare tutto di nuovo. Cioè analizzare la situazione con gli ordini. Che alcuni dati siano memorizzati in file o in qualche altro modo (forse in variabili globali), non è di fondamentale importanza. Il punto principale è che se alcuni dati sono necessari, vengono memorizzati in binding per ordinare i biglietti, e in questo caso non c'è nessun problema con i dati obsoleti - abbiamo ordine - abbiamo dati, nessun ordine - non abbiamo dati. Ci possono essere dati non legati a un ordine specifico, ma dobbiamo pensare a ogni caso ed è un problema risolvibile.

La compensazione è davvero il problema più complicato. Ma non è un problema di memorizzazione dei dati a lungo termine (o la sua obsolescenza), possiamo memorizzare i dati in semplici variabili nell'Expert Advisor (un po' rischioso, ma solo per 5 minuti). La difficoltà qui è come affrontarla dopo. Possiamo creare un gruppo di variabili terminali globali per ogni ordine e memorizzare il prezzo di apertura in esse. Poi, quando appaiono gli ordini non marcati (o all'apertura di un nuovo giorno), guardiamo gli ultimi ordini chiusi nella storia, li abbiniamo in base alle caratteristiche che possono essere utilizzate (per esempio, il lotto), e resettiamo tutte le variabili globali dall'ordine chiuso al nuovo ordine.

 

Anton!

Ti stai "agitando" troppo per questo problema.

È chiaro che si vuole ripristinare correttamente il lavoro dell'esperto dopo l'emergenza

situazione. Anch'io mi sono scervellato all'inizio.

Ma poi ha deciso che tali situazioni sono estremamente rare

(dalla mia esperienza di trading reale MT5 semestrale), quindi ho deciso che non vale la pena

per "preoccuparsi" degli ordini piazzati e semplicemente "inchiodare" tutto ciò che esiste dopo la caduta.

Gli ordini sono stati dati prima della caduta, se sono stati eseguiti allora non si può fare nulla, e se

Se sono ancora "in giro", allora uccidendoli e reimpostandoli in base alla situazione del trading, non si perde nulla!

Allora tutto ciò che rimane è la posizione - che ci sia o no.

Per quanto riguarda la scrittura/lettura di variabili da un file.

Ho un cambio "a caldo" (durante il lavoro) di variabili nei miei EA, quindi

Li scrivo e li leggo da un file in modo che l'Expert Advisor prenda le impostazioni "calde" ad un nuovo avvio.

Il problema che TU ti stai creando!

Pensateci!

P/S MT5 non è MT4 dove gli ordini sono molto importanti!

In MT5, devi essere guidato dalla POSIZIONE, non dagli ordini.

 
Fry_Антон:

Espandi la risposta a un pensiero ragionevole e utile e te ne sarei grato.

Quali sono i principi di base che rendono il codice EA "migliore"?

Risponde in privato.

Z.I. I tuoi esempi non sono validi. Non ci sono questi problemi su Forti. Naturalmente, si può inventare qualsiasi problema e poi cercare di risolverlo per molto tempo. Ma perché risolverlo quando è più facile non inventarlo?