Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 580

 
Olá! Por favor, me ajude com um problema. Preciso obter dados de um EA para diferentes símbolos/TF. O manual diz:"O mecanismo de acesso ao servidor de dados não depende de como uma solicitação foi iniciada - por um usuário ao navegar em um gráfico ou pelo programa na MQL4". Entretanto, na prática, se em tempo real, por exemplo, se rastrearmos o número de barras em um símbolo/TF diferente do símbolo sobre o qual a EA está rodando, acontece o seguinte O novo símbolo carrega um pequeno número de barras no primeiro acesso (cerca de 1000 para M1) e este número não muda. Eu tentei diferentes funções para acessar séries de tempos, tentei especificar o deslocamento de barras e o tempo mais profundo na história do que está carregado no momento, tentei mover o ChartNavigate(_ID, CHART_BEGIN) - novos dados não são carregados e o número de barras não muda. Entretanto, se eu abrir uma janela programática a partir do mesmo Expert Advisor (já a abri antes para a função ChartNavigate()) e mover o gráfico para a esquerda usando o botão seta/Home/PgUp, isso leva ao aumento das matrizes de série temporal, o número de barras é aumentado em tempo real, ou seja, os dados são carregados. O que precisa ser feito para carregar o histórico de forma programática sem pressionar as teclas físicas no teclado? Obrigado)
 
Ihor Herasko:

Faça dessa maneira. O código está quase correto. Falta apenas uma palavra:

Obrigado!
 
Alexandr Mordashov:
Olá! me ajude a resolver o problema. Preciso obter dados de um EA para diferentes símbolos/TF. A Ajuda diz:"O mecanismo de acesso aos dados no servidor não depende de como a solicitação foi iniciada - por um usuário ao navegar em um gráfico ou por um programa na MQL4". Entretanto, na prática, se em tempo real, por exemplo, se rastrearmos o número de barras em um símbolo/TF diferente do símbolo sobre o qual a EA está rodando, acontece o seguinte O novo símbolo carrega um pequeno número de barras no primeiro acesso (cerca de 1000 para M1) e este número não muda. Eu tentei diferentes funções para acessar séries de tempos, tentei especificar o deslocamento de barras e o tempo mais profundo na história do que está carregado no momento, tentei mover o ChartNavigate(_ID, CHART_BEGIN) - novos dados não são carregados e o número de barras não muda. Entretanto, se eu abrir uma janela programática a partir do mesmo Expert Advisor (já a abri para a função ChartNavigate()) e mover o gráfico para a esquerda usando o botão seta/Home/PgUp, isso leva ao aumento das matrizes de série temporal, o número de barras é aumentado em tempo real, ou seja, os dados são carregados. O que precisa ser feito para carregar o histórico de forma programática sem pressionar as teclas físicas no teclado? Obrigado)

Você tem que ser mais explícito sobre a questão. Se o problema não for colocado, ele não poderá ser resolvido.

 
Galim_V:
Você pode me dizer como obter os indicadores de fundo de um período de tempo diferente daquele em que a coruja está pairando?
double iRev()
{
 static int wtf;
 static int tf;  
 int xtf =Period();       // таймфрейм текущего графика 
 
                          //PERIOD_CURRENT;
 if(xtf != PERIOD_CURRENT)
 {
 Print("xtf  ",xtf);
   switch(xtf)
   {
    case 1: tf = PERIOD_H1;
    break;
    case 5: tf = PERIOD_H4; wtf = PERIOD_H1;
    break;
    case 15: tf = PERIOD_D1;
    break;
   }
     
 }
Print("tf == ",tf,"wtf ==",wtf);
 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
   if(iRa != 0) ObjectCreate("Ra",OBJ_HLINE,0,Time[0],iRa,0,0);
     
     ObjectSet("Ra",OBJPROP_TIME1,Time[0]);
     ObjectSet("Ra",OBJPROP_PRICE1,iRa);
   
   if(wRa != 0) ObjectCreate("weRa",OBJ_HLINE,0,Time[0],wRa,0,0); 
     ObjectSet("weRa",OBJPROP_TIME1,Time[0]);
     ObjectSet("weRa",OBJPROP_PRICE1,wRa); 
    
     
  Print("iRa   ",iRa,wRa);
 return(iRa);
}  
Funciona, mas nem sempre corretamente. Anexei objetos para avaliação visual. Quaisquer dicas ou onde procurar.
 
Galim_V:
Funciona, mas nem sempre corretamente. Anexei os objetos para avaliação visual. Por favor, informe ou onde procurar.

Para que serve o DRAW_LINE?

 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 
Alexey Viktorov:

Para que serve o DRAW_LINE?

Eu corrigi o código. Mas não funcionou corretamente, nem mesmo por causa de erros no código. Eu faço testes no terminal do meu corretor e nem sempre observo a conexão com o servidor. Neste caso, é muito crítico. Obrigado.
 

Olá. Como saber o preço de fechamento a M30 se a EA está no gráfico H1?

Close_M30= iClose(Symbol(),PERIOD_M30,1);
 
bij:

Olá. Como saber o preço de fechamento a M30 se a EA está no gráfico H1?

Eu gosto quando as pessoas fazem uma pergunta e respondem elas mesmas ))

Basicamente, tudo está correto. Há apenas um ponto sutil: antes de usar dados obtidos de outro período de tempo, temos que ter certeza de que esses dados existem de forma alguma.

Assim, o código totalmente correto ficaria assim

ResetLastError();
Close_M30= iClose(Symbol(),PERIOD_M30,1);
if (GetLastError() != ERR_NO_ERROR)
{
  // Значение Close_M30 использовать нельзя
}
 
Ihor Herasko:

Eu gosto quando as pessoas fazem uma pergunta e depois respondem elas mesmas ))

De modo geral, tudo está correto. Há apenas uma nuance: antes de usar dados de outra TF, você precisa ter certeza de que esses dados existem de forma alguma.

Assim, o código totalmente correto ficaria assim:

Obrigado, ação somente após o fechamento do H1, mas a condição é cumprida 30 minutos antes do fechamento do H1.

 ResetLastError();
   niz_=NormalizeDouble(iCustom(NULL,PERIOD_M30,"mand v.1",2,1),Digits);
   Close_M30=iClose(Symbol(),PERIOD_M30,1);
   if(GetLastError() != ERR_NO_ERROR)return;
   if(Close_M30>niz_)//условие
     {
      //действие
     }
 
bij:

Obrigado, a ação é somente após o fechamento do H1, mas a condição é cumprida 30 minutos antes do fechamento do H1.

Se você quiser levar a vela M30 que fechou com o último H1 fechado, ela pode ser uma vela com índice não só 1, mas também 2. Outra coisa é que então não está claro porque o preço de fechamento da M30 é tomado quando é o mesmo preço de fechamento da vela H1 anterior. Ou seja, neste caso não faz sentido interrogar o preço de fechamento de outra TF, pois coincide com o preço de fechamento da atual TF.