Erros, bugs, perguntas - página 2859

 
fxsaber:

Em geral, quais são as suas ideias sobre uma possível implementação?

Há muitas implementações possíveis

mas tudo se resume à tarefa de intercâmbio de dados entre as AAs

a maneira mais fácil é verificar a permissão de inicialização e executar a própria inicialização no OnTick() - permitiria evitar restaurar os gráficos e depois executar a EA sobre eles, e salvar a EA antes de fechar seria possível fazer no OnDeinit()

nãoé importante quem irá gerir este jardim zoológico - nem a EA principal nem um serviço

 

No registo do testador

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

O que significa isto?

 
Aleksey Vyazmikin:

No registo do testador

O que significa isto?

Significa que quando o próximo valor de m1 ohlc é recebido (ou estado da barra ao testar por preços abertos), o campo de tempo contém 0

função indefinida significa que o problema ocorreu fora das funções predefinidas (OnTick, OnTimer, etc.), ou seja, no laço principal do testador

 
Slava:

Significa que ao obter o próximo valor m1 ohlc (ou estado da barra ao testar por preços abertos) o campo de tempo contém 0

função indefinida significa que o problema ocorreu fora das funções predefinidas (OnTick, OnTimer, etc.), ou seja, no laço principal do testador

Tudo funcionava bem durante todo o dia e depois começou a funcionar. O que é que posso fazer como utilizador?

 
Slava:

Significa que ao obter o próximo valor m1 ohlc (ou estado da barra ao testar por preços abertos) o campo de tempo contém 0

função indefinida significa que o problema ocorreu fora das funções predefinidas (OnTick, OnTimer, etc.), ou seja, no laço principal do testador

Não compreendo, há um erro no meu código ou é um erro no terminal? Acabou com toda a história - não ajudou.

Adicionado:

Encontrei uma função no meu código, desactivando-a evita o erro, mas noutra EA esta função funciona correctamente! Como assim? Posso deixá-lo na minha mensagem privada.

Mesmo quando esta função de buggy está activada, OnTick() corre completamente na primeira barra e depois esse erro.

Em diferentes terminais, o erro é confirmado.

Funcionou em carraças - sem erros...

Mas a estranheza está no tronco:

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

Em carrapatos se olhar para a ferramenta, o primeiro carrapato foi exactamente às 10:00, e a sessão de negociação ainda está fechada a esta hora. Isto está em modo visual, sem assinalar a primeira impressão vem às 10 horas.

 
Igor Makanu:

A forma mais fácil é verificar a permissão de inicialização no início de cada EA em OnTick()

Este é o principal ponto de atrito do problema.
 
fxsaber:
Este é o principal problema da tarefa.

Tente prestar atenção às identificações dos gráficos e geridas por antiguidade. Mas isto não cancela a interacção dos EAs. Ou fazer um ficheiro ou talvez uma base de dados SQLite com IDs de gráficos na sequência de lançamento.

Algo como, na primeira inicialização, se não houver Chart_ID() na lista, então é inserido na lista. Se não for fechado devido ao encerramento do terminal, então é retirado da lista. Desta forma, será possível configurar a interacção dos EAs.

 
fxsaber:
Este é o principal ponto de atrito do problema.

esboçando como o vejo... criou 2 EA com este código:

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

e uma EA de controlo, que funciona em temporizador ( 5 seg )

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


Verificou-o, tudo funciona, a única coisa, ou não funcionou com GlobalVariableSetOnCondition() para fazer um registo em variáveis globais

 
fxsaber:
Este é o principal problema da tarefa.

GlobalVariableSetOnCondition é tudo o que é necessário para resolver o problema.

O funcionamento só é permitido quando a GlobalVariableSetOnCondition tiver regressado à realidade.
Após inicialização e liberação de recursos bem sucedida, devolve-se a variável principal ao seu estado original e inicia-se outra EA.

No DeInit - eliminação incondicional da variável, de modo a não correr para o terminal sem EAs (se o carregamento anterior não foi completado correctamente).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Obrigado pelas recomendações. Vou analisar a GlobalVariableSetOnCondition.