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

 
kopeyka2:

Foi exactamente o que eu pensei. A questão do mal-entendido é a palavra "parâmetros". Então comecei a olhar para TODAS as variáveis que estão envolvidas no cabo --> CopyBuffer

1) A minha pergunta desde o início foi para mudar o período de tempo SCREEN para guardar os dados do cabo. Tal como acontece no MT4.

E, de facto, acontece que assim é:

SEMPRE e em TODOS os períodos de tempo dá o mesmo valor de 10

Não tendo nada aqui, segui em frente.

2) E passo a citar:"Obtém os dados do buffer especificado do indicador especificado no montante especificado na matriz do buffer".

Ou seja, ao estabelecera contagem à mão devemos ter um INTERVALO com os valores . E aí estão eles! MAS!!!!!! Apenas quando o período de manuseamento corresponde a

PERÍODO_H1no ecrã do monitor. Todos os valores são transmitidos claramente. Mas passando para outro período de tempo, NÃO há dados no ecrã.

NÃO são transmitidos de forma alguma!!!! E a minha pergunta era exactamente isso. E o número de barras não é tão importante aqui se NÃO estiverem lá!!!!


Olhei para o indicador sugeridoMTF_LRMA.mq5 mas é o mesmo. Passa para outro intervalo de tempo no ecrã e os dados passam pelo intervalo de tempo do ecrã. Preciso dele num aparelho de mão.

Por exemplo: iClose(NULL, PERÍODO_H1, 5); em todos os períodos de tempo dará o mesmo valor - 10 barras em H1.

Até agora, todos os exemplos estavam na correcção dacontagem do CopyBuffer. Mas o conjunto está vazio.


Está enganado. O manuseamento fornece dados a qualquer momento. Vou dar-vos um exemplo em cerca de 10 horas. Não o posso fazer no meu telemóvel.
 
Artyom Trishkin:
Está enganado. O manuseamento fornece dados a qualquer momento. Dar-vos-ei um exemplo em cerca de 10 horas. Não o conseguirei fazer a partir do meu telemóvel.

OK. Obrigado pela resposta.


Corrigi-me a mim próprio.

Напррмер: iClose(NULL, PERIOD_H1, 5); на всех таймфреймах будут давать одно и тоже значение : Закрытие на 5 баре по Н1. 

Pensei que poderia ser assim

MqlParam params[]; 
//--- create iMA("EURUSD",PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE); 
   ArrayResize(params,4); 
//--- set ma_period 
   params[0].type         =TYPE_INT; 
   params[0].integer_value=0; 
//--- set ma_shift 
   params[1].type         =TYPE_INT; 
   params[1].integer_value=0; 
//--- set ma_method 
   params[2].type         =TYPE_INT; 
   params[2].integer_value=MODE_EMA; 
//--- set applied_price 
   params[3].type         =TYPE_INT; 
   params[3].integer_value=PRICE_CLOSE; 
//--- create MA 
   h_MA=IndicatorCreate("EURUSD",PERIOD_M15,IND_MA,4,params); 
//--- release indicators (first h_MACD) 
   
  if(h_MA==INVALID_HANDLE)
     {
      Print("The iMA (",string(PERIOD_M15),") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);

Mas se mudar de ideias, esperarei pelo primeiro método para obter o valor do indicador técnico (iMA). Mas ainda não compreendo.

 
kopeyka2:

OK. Obrigado pela resposta.


Corrigi-me a mim próprio.

Pensei que poderia ser assim

Mas se mudar de ideias, esperarei pelo primeiro método para obter o valor do indicador técnico (iMA). Mas não o compreendo agora...

Mostrei acima que o número de barras em diferentes TFs é diferente, e portanto diferente número de barras a copiar, dependendo da TF onde o indicador deve ser calculado. Deve verificar o número de barras, calculado por BarsCalculated() e utilizá-lo como base.

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total==prev_calculated) return(rates_total);
//---
   int    i;
   double diff;
//--- check for rates count
   if(rates_total<=ExtPeriodRSI)
      return(0);
//---
   if(TF!=PERIOD_CURRENT)
   {
      if(handle==INVALID_HANDLE)
        {
         handle=iCustom(Symbol(),TF,ind_name,Variant,RSIPeriod,Levl_Up,Levl_Down,PERIOD_CURRENT);
         return(0);
        }
      else
        {
         int bars_calculated=BarsCalculated(handle);
                  //Print("Начнем расчет - " , bars_calculated);
         if(bars_calculated<=0) return(0);
         if(Bars(Symbol(),TF)!=bars_calculated)
           {
            for(i=rates_total-prev_calculated-1;i>=0;i--)
              {
               Delta[i]=0.0;   
              }
            return(prev_calculated);
           } 
        }
 
Aleksey Vyazmikin:

Mostrei acima que o número de barras em diferentes TFs é diferente, e por isso deve solicitar um número diferente de barras a copiar, dependendo da TF, que deve ser calculado pelo indicador. Deve verificar o número de barras, calculado por indicador via BarsCalculated() e utilizá-lo como base, aqui está um exemplo para MTF

Obrigado. Vou experimentá-lo. Mas como indicado anteriormente, o conjunto está completamente vazio. Tenho estado a fazer sdigs escritos à mão na matriz. Está tudo vazio.
 
kopeyka2:
Obrigado. Vou tentar. Mas como já foi salientado, o conjunto está completamente vazio. Tenho estado a fazer sdigs escritos à mão na matriz. Está tudo vazio.
Está a ignorar que temos de esperar pelo carregamento de dados a partir de outro período de tempo? Dei-vos exemplos. Os dados no indicador mostrado são retirados apenas de prazos mais elevados. Se definirmos um período de tempo inferior ou igual ao actual, os dados são retirados do actual. Tudo isto está no código, mas ainda não se deu ao trabalho de o analisar. Mas está a fazer uma declaração.
 
Artyom Trishkin:
Está a ignorar que tem de esperar que os dados sejam carregados a partir de um período de tempo diferente? Dei-vos exemplos. Os dados no indicador mostrado são extraídos apenas de prazos mais elevados. Se definirmos um período de tempo inferior ou igual ao actual, os dados são retirados do actual. Está tudo no código, mas ainda não o reviu. Mas está a fazer uma declaração.
Não olhei apenas, desmontei o vosso indicador em pedaços. Tive a ideia de atraso de dados desde o início. E imediatamente, desde a primeira visualização, vi o seu temporizador. Vou olhar nessa direcção.
 
kopeyka2:
Não só olhei, como desmontei o vosso indicador peça por peça. Aqui estava a ideia sobre o atraso dos dados desde o início. E imediatamente, desde a primeira visualização, vi o seu temporizador. Vou olhar nessa direcção.
O último ciclo com a conversão dos dados para o período de tempo actual comentou, e em qualquer buffer gráfico passa os dados dos buffers calculados MAshek, e verá no gráfico o que quer ver.
 

por agora

outro período de tempo (não nativo)


 
kopeyka2:

por agora

outro período de tempo (não nativo)


Comentou deliberadamente a cadeia de retorno no caso de os dados não serem recebidos? Porquê? Se desaparafusar as rodas e disser que o motor zumbe, o volante gira, mas o carro não vai, e por isso está avariado, isso é um pouco duro.
 
kopeyka2:
Vou tentar. Vou experimentá-lo. Mas como salientei anteriormente, o conjunto está vazio de todo. Usei as minhas mãos para fazer leituras da matriz. Está tudo vazio.

Anteriormente dei-lhe um código do seu indicador com impressão, tentou copiá-lo? Nada aparece no registo, nenhum erro ou número?

Razão: