Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 742

 
Klimenko_a_e:

Em código real, a função devolve um objecto.

Penso que o construtor de cópias deveria criar uma cópia temporária neste caso.

O código funciona correctamente em MQL5 build 1545.

Na nova construção, o construtor de cópias não pode redimensionar nem mesmo uma matriz unidimensional: Erro 4007.

Penso que não é correcto.

É difícil para mim fazer uma declaração definitiva neste caso. Há muito bons peritos para a sua pergunta, por isso recomendo que a dirija à filialhttps://www.mql5.com/ru/forum/1111.

Com as minhas edições o código funciona como deveria. Sem ele, não o faz. Mas se o seu código deve ou não funcionar é melhor para o ramo no link acima.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

Em código real, a função devolve um objecto.

Penso que o construtor de cópias deveria criar uma cópia temporária neste caso.

O código funciona correctamente em MQL5 build 1545.

Na nova construção, o construtor de cópias não pode redimensionar nem mesmo uma matriz unidimensional: Erro 4007.

Isto não é correcto, na minha opinião.


O erro foi corrigido na construção 1580, obrigado, tudo funciona como deveria).
 
fxsaber:

É difícil para mim dizer algo definitivo neste caso. Há muito bons especialistas na sua questão, por isso recomendo que a aborde com a filialhttps://www.mql5.com/ru/forum/1111.

Com as minhas edições o código funciona como deveria. Sem ele, não o faz. Mas se o seu código deve ou não funcionar é melhor ser direccionado para o ramo no link acima.


Obrigado pela ligação.
 

Talvez alguém me possa dar uma dica.

Não consigo descobrir como interromper a execução da EA depois de alterar manualmente as definições de entrada.

1) Executar o código EA desta forma no gráfico:

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Abrir a janela de definições e alterar o parâmetro "Setting_" para 1.

3) E aplicar as alterações.

Assim, para começar a aplicar as alterações, o OnInit deve ser executado, mas o OnInit não será executado até que os cálculos no OnTick (ou qualquer outro) parem.

Tanto quanto sei, existe apenas uma verificação paraparar o programa através de _StopFlag - bandeira para parar um programa mql5, mas é apenas para a saída completa. Mas não sei como compreender que as definições de entrada tenham mudado para parar os cálculos.

Talvez alguém tenha enfrentado uma tal situação? Talvez haja algum hack secreto?

 
Marat Sultanov:

Talvez alguém me possa dar uma dica.

Não consigo descobrir como interromper a execução da EA depois de alterar manualmente as definições de entrada.

1) Executar o código EA desta forma no gráfico:

2) Abrir a janela de definições e alterar o parâmetro "Setting_" para 1.

3) E aplicar as alterações.

Assim, para começar a aplicar as alterações, o OnInit deve ser executado, mas o OnInit não será executado até que os cálculos no OnTick (ou qualquer outro) parem.

Tanto quanto sei, existe apenas uma verificação paraparar o programa através de _StopFlag - bandeira para parar um programa mql5, mas é apenas para a saída completa. Mas não sei como compreender que as definições de entrada tenham mudado para parar os cálculos.

Talvez alguém tenha enfrentado uma tal situação? Talvez haja algum hack secreto?

Verificar o código de desinicialização no OnInit()

Causas de desinicialização

Códigos de razão de desinicialização do Expert Advisor devolvidos por UninitializeReason(). Podem ter qualquer um dos seguintes valores:

Constante .

Valor

Descrição

RAZÃO_PROGRAMA

0

Expert parou o seu trabalho ao chamar ExpertRemove()

REASON_REMOVE

1

Programa retirado do gráfico

RACIOCÍNIO_RECOMPILAR

2

Programa recompilado

REASON_CHARTCHANGE

3

O símbolo ou período do gráfico foi alterado

REASON_CHARTCLOSE

4

O gráfico está fechado

PARÂMETROS_DE_RAZÃO

5

Os parâmetros de entrada foram alterados pelo utilizador

RAZÃO_COUNTURA

6

Outra conta foi activada ou reconectada ao servidor de negociação porque as definições da conta foram alteradas

REASON_TEMPLATE

7

Foi aplicado outro modelo de gráfico

REASON_INITFAILED

8

Um sinal de que o manipulador OnInit() devolveu um valor não nulo

RAZÃO_CLOSE

9

O terminal foi encerrado

 
Artyom Trishkin:

Verificar o código de desinicialização no OnInit()

...

Um... Você não me entendeu :)

É preciso saber dentro da função (por exemplo noOnTick), que o utilizador alterou os parâmetros de entrada, ou seja, para saber que está na altura de terminar e deixar o programa ir para o OnDeinit.

 
Marat Sultanov:

Um... Não me entendeu bem :)

É preciso saber dentro da função (por exemplo, noOnTick) que o utilizador alterou os parâmetros de entrada, ou seja, saber que está na altura de lhe chamar um dia e deixar o programa sair para o OnDeinit.

Assim que um utilizador chama a janela de definições EA (F7) e clica aí no botão OK, OnDeinit() é chamado imediatamente e este, por sua vez, escreve o valor REASON_PARAMETERS no código de desinicialização. Então OnInit() é chamado, onde usandoUninitializeReason() pode verificar o código de desinicialização e, se o seu valor for igual aREASON_PARAMETERS, decidir o que fazer a seguir.
 
Artyom Trishkin:
Assim que um utilizador chama a janela de definições EA (F7) e clica aí no botão OK, OnDeinit() é imediatamente chamado, e este, por sua vez, escreve no código de desinicialização o valor de REASON_PARAMETERS. Então OnInit() é chamado, onde usando UninitializeReason() pode verificar o código de desinicialização e, se o seu valor for igual aREASON_PARAMETERS, decidir o que fazer a seguir.

Muito bem.

Por favor:

1) Primeiro executei o meu código, que dei no meu primeiro posto. Não o pus lá por uma questão de beleza. Pode executá-lo em qualquer gráfico.

2) Chamar a janela de definições da EA.

3) Alterar o parâmetro e premir OK.

Se olhar cuidadosamente para o meu código, então o resultado não o surpreenderá: OnDeinit() não será chamado.

 

Não só isso, acrescentei uma impressão no deinit, tanto a razão como o parâmetro, para que se possa certificar de que o perito NÃO atinge o deinit.

Por favor note a peça mais importante do código:

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

É uma emulação clara de um cálculo longo que não será interrompido por uma alteração nos parâmetros de entrada. E preciso de o interromper e a questão é como? :)

Só quero ter a certeza de que não estou a perder nada na MQL5 e não há realmente mais nada na língua a não ser_StopFlag, o que infelizmente não resolve esta situação.

Grosso modo, preciso de apanhar o momento em que os parâmetros de entrada mudam durante um cálculo pesado.

 
Marat Sultanov:

Não só isso, acrescentei uma impressão no deinit, tanto a razão como o parâmetro, para que se possa certificar de que o perito NÃO atinge o deinit.

Por favor note a peça mais importante do código:

É uma emulação clara de um cálculo longo que não será interrompido por uma alteração nos parâmetros de entrada. E preciso de o interromper e a questão é como? :)

Só quero ter a certeza de que não estou a perder nada na MQL5 e não há realmente mais nada na língua a não ser_StopFlag, o que infelizmente não resolve esta situação.

Grosso modo, preciso de apanhar o momento em que os parâmetros de entrada mudam durante um cálculo pesado.

Grosseiramente falando - releia cuidadosamente o que lhe escrevi e largue o loop infinito do seu código.

Tem a certeza de que conduzir o Expert Advisor para um loop infinito é a solução certa?