Inicializar e reinicializar automaticamente a EA a partir de um arquivo

 
Tarefa: restaurar o ambiente EA (dados de posição, contadores, etc.) após a reinicialização, reinicialização em caso de falha do sistema, etc.

Solução: salvamos cada mudança nas variáveis dinâmicas da EA em um arquivo. Durante o OnInit(), todo este material é carregado de volta ao arquivo.

Entretanto, o estado passado das variáveis não pode ser carregado a partir do arquivo se:
  • A estrutura do arquivo foi alterada (versão diferente, nova construção do Expert Advisor). É elementar para verificar, sem problemas.
  • O bot bot bot bot avariou da última vez. Digamos que o bot caiu em uma parada ou pendurou ou ultrapassou o limite de erro, então pode haver variáveis no arquivo que causam um erro imediatamente. Isto é em parte muito fácil de verificar (limite de erro a considerar, registro de erro crítico...), mas não é uma solução completa.
  • O arquivo é muito "empoeirado". Suponha que da última vez a EA foi carregada há X dias ou mesmo hoje, mas as informações nela contidas já estão desatualizadas. Como verificar - o fudge sabe.

Agora o fiz: analisar a causa do OnDeinit(), se o programa fechar, então eu excluo o terminal global (como uma bandeira de reinicialização).

Quando não há esta bandeira durante o OnInit(), tenho que perguntar ao usuário cada vez com a caixa de mensagens burra "restaurar variáveis do arquivo...".

Esta é uma maneira insanamente estúpida e inconveniente!


Pergunta: como automatizar totalmente uma solução desse tipo?

Como você pode saber quando um arquivo não pode ser carregado e quando ele pode ser baixado?

Ao menos reduza ao mínimo a chamada desta caixa de mensagens.

 

MQL4 ou MQL5 ?

Se forMQL5, então:

Na verificação OnInit():

1. Posição

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

2) Ordens:

(se algo der errado, eu simplesmente apago todos os pedidos sem verificar de onde eles vêm. )

//+------------------------------------------------------------------+
//| 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. Variáveis globais do terminal:

  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. Variáveis a serem salvas

a) Carregamento:

//+------------------------------------------------------------------+
//| 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) Economia ( 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_Антон:
Objetivo: Restaurar o ambiente da EA (dados de posição, contadores, etc.) após a reinicialização, reiniciar em caso de falha do sistema, etc.

A pergunta contrária é Por quê?

Imho, restaurar o ambiente a partir de um arquivo é sempre suicida a longo prazo. Ao reiniciar, você deve sempre recalcular seus dados com base no ambiente comercial do MetaTrader.

 
Fry_Антон:
Tarefa: Restaurar o ambiente EA (dados de posição, contadores, etc.) após a reinicialização, reinicialização em caso de falha do sistema, etc.
Recalculando
 
Vasiliy Sokolov:

A pergunta contrária é Por quê?

Imho, restaurar o ambiente a partir de um arquivo é sempre suicida a longo prazo. Você deve sempre recalcular seus dados com base no ambiente comercial do MetaTrader ao reiniciar.

Características do mercado de futuros.

Nem tudo pode ser recalculado. É claro que atualizo o que posso do meio ambiente, mas... Bem, aqui está um exemplo:

Ao limpar uma posição e as ordens são fechadas/abertas. O terminal bloqueia o comércio e elimina as ordens do dia (e as ordens são proibidas pelo corretor até que sejam canceladas). Tenho que criar novas encomendas.

E preciso do preço inicial de abrir uma posição, do tempo inicial de definir uma posição e dos pedidos.

Portanto, tenho que manter minha própria contabilidade de tais parâmetros.

Há também contadores de pedidos por segundo/minuto/hora/dia, contadores de ações errôneas não fatais, etc., etc.

Desistiria de bom grado do arquivo! Se fosse real. =(

Há uma situação como esta: o terminal caiu (as construções de hoje são estáveis, e antes era sempre assim, e não o fato de que sempre haverá apenas liberações estáveis).

Após o crash terminal: reinicialização rápida e autorun - restauração a partir do arquivo e tudo funciona.

Funciona muito estável, porque sempre salvo o arquivo de inicialização no evento OnTrade() (com temporizador por um segundo ou dois, para não atormentar o disco).


Então para mim a questão é muito relevante: como não carregar variáveis de um arquivo que é obsoleto ou perigoso de carregar?

 
Михаил:

MQL4 ou MQL5 ?

Se forMQL5, então:

Na verificação OnInit():

1. Posição

2) Ordens:

(se algo der errado, eu simplesmente apago todos os pedidos sem verificar de onde eles vêm. )

3. Variáveis globais do terminal:

4. Variáveis a serem salvas

a) Carregamento:

b) Economia ( OnDeInit() )

Fez com que ficasse quase assim. Mas eu salvo o arquivo no OnTrade() com um temporizador.

Eu também tenho uma carga de sinais diferentes e outras variáveis, e o código está em constante evolução, então foi muito inconveniente armazená-los um a um.

Criei uma estrutura básica que contém tudo o que preciso para o arquivo (exceto alguns valores de string).

Nomeei a estrutura com uma letra, então o código é bem curto (b.volume é quase como volume). E é conveniente salvar toda a estrutura de uma só vez com operador =.

 
Fry_Антон:

...

Pergunta: como automatizar totalmente uma solução desse tipo?

...

Uma abordagem fundamentalmente diferente para a programação da EA.

 
Dmitry Fedoseev:

Uma abordagem fundamentalmente diferente para a programação da EA.

Expanda a resposta a um pensamento útil razoável e eu ficaria grato a você.

Quais são os princípios básicos que tornam o código EA "melhor"?

 
Fry_Антон:

Expandir a resposta a um pensamento útil razoável e eu apreciaria isso.

Quais são os princípios básicos que tornam o código EA "melhor"?

Já foi escrito aqui - recalcule tudo novamente. Isto é, analisar a situação com os pedidos. Se alguns dados são armazenados em arquivos, ou de alguma outra forma (talvez em variáveis globais), não é de importância fundamental. O ponto principal é que, se alguns dados forem necessários, eles são armazenados em encadernação com as notas de encomenda, e neste caso não há problema com dados desatualizados - temos encomenda - temos dados, não temos encomenda - não temos dados. Pode haver dados não vinculados a uma ordem específica, mas temos que pensar em cada caso e é um problema resolúvel.

A limpeza é realmente o problema mais complicado. Mas não é um problema de armazenamento de dados a longo prazo (ou sua obsolescência), podemos armazenar dados em variáveis simples no Expert Advisor (um pouco arriscado, mas apenas por 5 minutos). A dificuldade aqui é como lidar com isso mais tarde. Podemos criar um grupo de variáveis terminais globais para cada pedido e armazenar o preço de abertura nelas. Então, quando as ordens não marcadas aparecem (ou na abertura de um novo dia), vemos as últimas ordens fechadas na história, comparamos de acordo com as características que podem ser usadas (por exemplo, lote) e redefinimos todas as variáveis globais desde a ordem fechada até a nova ordem.

 

Anton!

Você está ficando muito "nervoso" com este problema.

É claro que você quer restaurar adequadamente o trabalho do especialista após a emergência

situação. Também eu, no início, me arrebentei.

Mas depois decidiu que tais situações são extremamente raras

(a partir de minha própria experiência de comércio real semestral MT5), então decidi que não valeria a pena

para "incomodar" com pedidos feitos e apenas "pregar" tudo o que existe após a queda.

As ordens foram colocadas antes da queda, se foram executadas, então nada pode ser feito, e se

Se eles ainda estiverem "pendurados", então matando-os e reestabelecendo-os de acordo com a situação comercial, você não perderá nada!

Então tudo o que resta é a posição - esteja ela lá ou não.

Quanto a variáveis de escrita/leitura a partir de um arquivo.

Eu tenho mudanças "quentes" (durante o trabalho) de variáveis em meus EAs, então eu

Eu os escrevo e leio de um arquivo para que o Expert Advisor tome as configurações "quentes" em um novo começo.

O problema que VOCÊ está criando para si mesmo!

Pense sobre isso!

P/S MT5 não é MT4 onde os pedidos são muito importantes!

No MT5, você tem que se orientar pela POSIÇÃO, não por ordens.

 
Fry_Антон:

Expandir a resposta a um pensamento útil razoável e eu apreciaria isso.

Quais são os princípios básicos que tornam o código EA "melhor"?

Respondido em particular.

Z.I. Seus exemplos não são válidos. Não existem tais problemas em Forts. É claro, você pode inventar qualquer problema e depois tentar resolvê-lo por um longo tempo. Mas por que resolvê-lo quando é mais fácil não o inventar?