Erros, bugs, perguntas - página 435

 
voix_kas:

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?

No modo de reinício a quente.
 

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.

 
Interesting:

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.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver:

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. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  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.

 
voix_kas:

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.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas:

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.

 
Renat:

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)?

 
voix_kas:

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... :)