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 ); } } }
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.
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.
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 =.
...
Pergunta: como automatizar totalmente uma solução desse tipo?
...
Uma abordagem fundamentalmente diferente para a programação da EA.
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"?
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.
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?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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: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.