De um modo geral, é engraçado como isto se revela. Num palpite, pensei que a função OnDenit é uma espécie de destruidora e a função OnInit é uma espécie de construtora de uma EA.
De facto, verifica-se que o OnInit é um evento múltiplo (dentro da vida útil do Expert Advisor). Não é então claro, porque é que precisamos de gerar explicitamente o evento OnDenit se sabemos que a EA não termina o seu funcionamento (por exemplo, em caso de mudança de período do gráfico)?
Quando os símbolos mudam, o Expert Advisor é carregado a quente para um arranque rápido e para salvar a base informativa da sua vida anterior.
Por exemplo, o Expert Advisor está no gráfico, acumulou as suas estatísticas e lógica, e depois é alterado no tempo e tem de trabalhar a partir do zero no arranque a frio.
E há mais uma questão. A razão para a desinicialização de REASON_CHARTCHANGE - um símbolo ou um período gráfico foi alterado. Explique por favor como é que um símbolo gráfico pode ser alterado sem eliminar um EA nele?
Yedelkin, Interessante, Renat Obrigado pelos esclarecimentos.
Penso que também faz sentido incluir uma lista explícita de reinícios "quentes" e "frios" na documentação.
Se não houver reinicialização em cada OnInit, para a EA multicast teremos de usar uma muleta, que é uma bandeira global. :( Publicarei o código um pouco mais tarde.
O Expert Advisor em qualquer caso não será apagado durante a inicialização normal, apenas será permitido negociar sob certas configurações de terminal (mas para isso o Expert Advisor deve compreender que o símbolo foi alterado...).
A propósito, isso faz-me lembrar. Tenho andado para perguntar aos programadores sobre essas configurações.
Renat, por favor faça duas caixas de verificação diferentes para desactivar o comércio ao alterar o prazo e o símbolo. Estas são duas alterações fundamentalmente diferentes.
Não gostaria que os meus EAs parassem de negociar quando mudam de prazo - é absolutamente desnecessário - de qualquer forma estão a processar cada carraça e não há problemas com ela.
Mas a mudança do símbolo é fundamentalmente importante. Gostaria de manter este bloqueio... mas agora estes dois ajustamentos estão, por alguma razão, sincronizados e regulados em conjunto.
Estou a resolver este problema de forma programática (armazenar o símbolo original numa variável estática e controlar as alterações no inite). Mas seria melhor se isto pudesse ser bloqueado a nível terminal.
Melhor ainda seria a possibilidade de mudar o calendário ou símbolo com um Expert Advisor em funcionamento. Porquê parar de negociar devido à estupidez-esquecimento?
Ou seja, seria muito melhor bloquear a comutação de prazos e/ou símbolos (separadamente!), se for especificado em configurações que é proibido quando o Expert Advisor está presente num gráfico.
// Com a transmissão de uma mensagem correspondente ao tentar fazê-lo.
Na verdade, isto também pode ser resolvido de forma programática (colocando à força o símbolo ou o prazo de volta no lugar), mas penso que você mesmo está interessado em configurações realmente fáceis de usar a nível de terminal.
Renat, por favor faça duas caixas de verificação diferentes para bloquear o comércio de alterações de prazos e de símbolos. Estas são duas alterações fundamentalmente diferentes.
Não quero que os meus EAs parem de negociar quando mudam de prazo - é absolutamente desnecessário - de qualquer forma, estão a processar cada carraça e não há problemas com isso.
Apoio a ideia, deve fazer duas carraças e uma separação nos códigos de razão da desinicialização (seria conveniente assim).
Mas bloquear a possibilidade de alterar o prazo, não sei como (sobre o símbolo), é demasiado para mim.
Isso faz-me lembrar. Há muito tempo que quero perguntar aos programadores sobre estas definições.
Renat, por favor faça duas caixas de verificação diferentes para bloquear o comércio em caso de mudança de prazo e mudança de símbolo. Estas são duas alterações fundamentalmente diferentes.
Sim, parece que a condição de alterar o símbolo e o prazo foram combinados para nada.
Eu também sou a favor de os dividir em duas condições. O bilhete já foi colocado no balcão de serviço.
Na verdade, estou a anexar o código para definir as ferramentas de trabalho para o multicooker. As críticas são bem-vindas. :)
inputuint inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундахinputstring inWorkSymbols = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструментыbool Initialize;
intOnInit() {
//...
Initialize = true;
//...
}
voidOnTick() {
staticulong LastScan = 0;
if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;
staticstringSymbol[];
// static int Forecast[];// static int Volatile[];if (Initialize) {
Comment("Опрос рабочих инструментов...");
int SymbolCount_1 = 0;
for (int i = 0; i < SymbolsTotal(false); i++)
if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
SymbolCount_1++;
if (!SymbolCount_1) return;
if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;
int SymbolCount_2 = 0;
for (int i = 0; i < SymbolsTotal(false); i++)
if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
Symbol[SymbolCount_2++] = SymbolName(i, false);
if (SymbolCount_1 != SymbolCount_2) return;
//if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;//if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;
Initialize = false;
}
//...
}
Cada vez que um Expert Advisor tenta obter uma lista de instrumentos de trabalho. A actualização da lista de instrumentos de trabalho ocorre em duas condições: 1) OnInit é accionada, 2) após o tempo que foi definido no parâmetro de entrada da EA. Como vemos, uma muleta sob a forma de uma variável global(bool Initialize) é utilizada para detectar a próxima inicialização. Se houvesse uma inicialização da estática, esta não seria necessária.
Considero variáveis globais como o mal, bem como o operador incondicional do goto no seu tempo.
Como dica, trazer Symbol para o nível global e zerá-lo no OnInit. Se a matriz estiver vazia, então é altura de inicializar.
E sem bandeiras adicionais.
Acho que estou paranóico. Não gosto de variáveis públicas (globais). Considero-o um muveton. É possível especificar a activação do OnInit no interior do OnTick? Por exemplo, posso declarar uma variável estática dentro do OnTick que armazena o número de inicializações da EA (se existir tal ou semelhante propriedade na MQL5)?
As variáveis globais são más, como o era o operador de goto incondicional nos tempos antigos.
Devo ser paranóico. Não gosto de variáveis públicas (globais). Acho que é um muveton.
1. Porquê? É necessário livrar-se de sintomas nocivos, e de forma decisiva.
2. Não nomeie variáveis, arrays e outras coisas com palavras-chave de linguagem consonantes ou semelhantes (mas o "Symbol" array é muito marcante, não se pode dizer se é um array ou outra coisa no seu código).
Renat:
A solução é esconder tais dados dentro da classe. Se a classe morre, o ambiente também morre.
E a um nível global, deixar um mínimo de variáveis estáticas.
Boa sugestão. Está na hora de mudar já para o OOP... :)
De um modo geral, é engraçado como isto se revela.
Num palpite, pensei que a função OnDenit é uma espécie de destruidora e a função OnInit é uma espécie de construtora de uma EA.
De facto, verifica-se que o OnInit é um evento múltiplo (dentro da vida útil do Expert Advisor). Não é então claro, porque é que precisamos de gerar explicitamente o evento OnDenit se sabemos que a EA não termina o seu funcionamento (por exemplo, em caso de mudança de período do gráfico)?
Quando os símbolos mudam, o Expert Advisor é carregado a quente para um arranque rápido e para salvar a base informativa da sua vida anterior.
Por exemplo, o Expert Advisor está no gráfico, acumulou as suas estatísticas e lógica, e depois é alterado no tempo e tem de trabalhar a partir do zero no arranque a frio.
E há mais uma questão.
A razão para a desinicialização de REASON_CHARTCHANGE - um símbolo ou um período gráfico foi alterado.
Explique por favor como é que um símbolo gráfico pode ser alterado sem eliminar um EA nele?
Yedelkin, Interessante, Renat
Obrigado pelos esclarecimentos.
Penso que também faz sentido incluir uma lista explícita de reinícios "quentes" e "frios" na documentação.
Se não houver reinicialização em cada OnInit, para a EA multicast teremos de usar uma muleta, que é uma bandeira global. :(
Publicarei o código um pouco mais tarde.
O Expert Advisor em qualquer caso não será apagado durante a inicialização normal, apenas será permitido negociar sob certas configurações de terminal (mas para isso o Expert Advisor deve compreender que o símbolo foi alterado...).
A propósito, isso faz-me lembrar. Tenho andado para perguntar aos programadores sobre essas configurações.
Renat, por favor faça duas caixas de verificação diferentes para desactivar o comércio ao alterar o prazo e o símbolo. Estas são duas alterações fundamentalmente diferentes.
Não gostaria que os meus EAs parassem de negociar quando mudam de prazo - é absolutamente desnecessário - de qualquer forma estão a processar cada carraça e não há problemas com ela.
Mas a mudança do símbolo é fundamentalmente importante. Gostaria de manter este bloqueio... mas agora estes dois ajustamentos estão, por alguma razão, sincronizados e regulados em conjunto.
Estou a resolver este problema de forma programática (armazenar o símbolo original numa variável estática e controlar as alterações no inite). Mas seria melhor se isto pudesse ser bloqueado a nível terminal.
Melhor ainda seria a possibilidade de mudar o calendário ou símbolo com um Expert Advisor em funcionamento. Porquê parar de negociar devido à estupidez-esquecimento?
Ou seja, seria muito melhor bloquear a comutação de prazos e/ou símbolos (separadamente!), se for especificado em configurações que é proibido quando o Expert Advisor está presente num gráfico.
// Com a transmissão de uma mensagem correspondente ao tentar fazê-lo.
Na verdade, isto também pode ser resolvido de forma programática (colocando à força o símbolo ou o prazo de volta no lugar), mas penso que você mesmo está interessado em configurações realmente fáceis de usar a nível de terminal.
MetaDriver:
Renat, por favor faça duas caixas de verificação diferentes para bloquear o comércio de alterações de prazos e de símbolos. Estas são duas alterações fundamentalmente diferentes.
Não quero que os meus EAs parem de negociar quando mudam de prazo - é absolutamente desnecessário - de qualquer forma, estão a processar cada carraça e não há problemas com isso.
Apoio a ideia, deve fazer duas carraças e uma separação nos códigos de razão da desinicialização (seria conveniente assim).
Mas bloquear a possibilidade de alterar o prazo, não sei como (sobre o símbolo), é demasiado para mim.
Isso faz-me lembrar. Há muito tempo que quero perguntar aos programadores sobre estas definições.
Renat, por favor faça duas caixas de verificação diferentes para bloquear o comércio em caso de mudança de prazo e mudança de símbolo. Estas são duas alterações fundamentalmente diferentes.
Sim, parece que a condição de alterar o símbolo e o prazo foram combinados para nada.
Eu também sou a favor de os dividir em duas condições. O bilhete já foi colocado no balcão de serviço.
Na verdade, estou a anexar o código para definir as ferramentas de trabalho para o multicooker. As críticas são bem-vindas. :)
Cada vez que um Expert Advisor tenta obter uma lista de instrumentos de trabalho.
A actualização da lista de instrumentos de trabalho ocorre em duas condições: 1) OnInit é accionada, 2) após o tempo que foi definido no parâmetro de entrada da EA.
Como vemos, uma muleta sob a forma de uma variável global(bool Initialize) é utilizada para detectar a próxima inicialização. Se houvesse uma inicialização da estática, esta não seria necessária.
Considero variáveis globais como o mal, bem como o operador incondicional do goto no seu tempo.
Na ausência de reinicialização em cada OnInit, para os multilaterais deve ser utilizada uma "muleta" sob a forma de bandeira global. :(
É melhor escrever o código cuidadosamente desde o início, sem deixar muletas sob a forma de variáveis estáticas intermédias.
Como solução, esconder tais dados dentro de uma classe. Se a turma está morta, o ambiente também está morto.
E, a nível global, deixar um mínimo de variáveis estáticas.
Na verdade, estou a anexar o código para definir as ferramentas de trabalho para o multicooker. As críticas são bem-vindas. :)
Como dica - colocar Symbol a nível global e zerá-lo no OnInit. Se a matriz estiver vazia, então é altura de inicializar.
E sem bandeiras adicionais.
Como dica, trazer Symbol para o nível global e zerá-lo no OnInit. Se a matriz estiver vazia, então é altura de inicializar.
E sem bandeiras adicionais.
Acho que estou paranóico. Não gosto de variáveis públicas (globais). Considero-o um muveton.
É possível especificar a activação do OnInit no interior do OnTick?
Por exemplo, posso declarar uma variável estática dentro do OnTick que armazena o número de inicializações da EA (se existir tal ou semelhante propriedade na MQL5)?
As variáveis globais são más, como o era o operador de goto incondicional nos tempos antigos.
Devo ser paranóico. Não gosto de variáveis públicas (globais). Acho que é um muveton.
1. Porquê? É necessário livrar-se de sintomas nocivos, e de forma decisiva.
2. Não nomeie variáveis, arrays e outras coisas com palavras-chave de linguagem consonantes ou semelhantes (mas o "Symbol" array é muito marcante, não se pode dizer se é um array ou outra coisa no seu código).
Renat:
A solução é esconder tais dados dentro da classe. Se a classe morre, o ambiente também morre.
E a um nível global, deixar um mínimo de variáveis estáticas.