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

 
Maksym Mudrakov:

O erro pode estar no número de dígitos após a vírgula decimal:


Este não é o erro, os dados não são calculados sobre o histórico, mas a partir do momento em que o símbolo é criado tudo é calculado correctamente, suspeito que a função de cálculo do histórico não está a funcionar correctamente, ou seja, é um bug.
 
Boa tarde, cavalheiros.

Tenho um tal problema, comecei agora no MT5, estou a transferir os meus indicadores do MT4 e encontrei alguns problemas. Preciso de utilizar o iMA numa linha e obter o valor de um índice específico. Vi mensagens no fórum e uso a função iMAGet (bem como iATRGet semelhante, etc.). Como vejo, as funções já não funcionam, então esta pergunta: como obter graciosamente um único valor iMA? Tentei utilizar as funções acima referidas para o fazer:

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

Sei que é mau sem verificar, mas tenho de portar o velho código MT4, não consegui pensar em outra forma de o tornar mais simples (tenho dezenas de feiticeiros, e todos eles trabalham em diferentes períodos de tempo). Não posso inicializar os feiticeiros no oninit, porque o código tem três passos de aninhamento e não posso chamar o feiticeiro necessário sem problemas. Assim, em suma, o meu objectivo é transformar

Isto :

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

Em algo que funciona no MT5 sem quaisquer gestos drásticos.

 
Olga Miakhovich:
Boa tarde, cavalheiros.

Tenho um problema, acabo de iniciar o MT5 e tenho problemas com ele quando transfiro os meus indicadores do MT4. Preciso de utilizar o iMA numa linha e obter o valor de um índice específico. Vi mensagens no fórum e uso a função iMAGet (assim como iATRGet semelhante, etc.). Como vejo, as funções já não funcionam, então esta pergunta: como obter graciosamente um único valor iMA? Tentei utilizar as funções acima referidas para o fazer:


Sei que é mau sem verificar, mas tenho de portar o velho código MT4, não consegui pensar em outra forma de o tornar mais simples (tenho dezenas de feiticeiros, e todos eles trabalham em diferentes períodos de tempo). Não posso inicializar os feiticeiros no oninit, porque o código tem três passos de aninhamento e não posso chamar o feiticeiro necessário sem problemas. Assim, em suma, o meu objectivo é transformar

Isto :

Em algo que funciona no MT5 sem quaisquer gestos drásticos.

Veja os exemplos em kodobase, tais como este:https://www.mql5.com/ru/code/27161

Basicamente: criar um manípulo indicador no OnInit()

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

Depois copia o(s) elemento(s) necessário(s) para a prancheta e trabalha com ela

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

Procure exemplos na kodobase, e.g. este:https://www.mql5.com/ru/code/27161

Basicamente: Criar manípulo indicador no OnInit()

Depois copia o(s) elemento(s) necessário(s) para o amortecedor e trabalha com ele

https://www.mql5.com/ru/docs/series/copybuffer

Como já escrevi, a inicialização no OnInit não é adequada para mim. Tenho de trabalhar com todos os prazos simultaneamente, tenho de inicializar todas as máscaras em cada TF, e depois em código, onde uso algum valor, fazer algo como isto:

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

E assim com cada chamada de cada pulseira. O código transformar-se-á apenas numa diarreia confusa.

E cada novo bar terá de o actualizar de alguma forma?

Existe uma função como CopyBuffer, mas copiar não uma matriz, mas um valor por índice requerido?

 
Olga Miakhovich:

Como já escrevi, a inicialização no OnInit não é adequada para mim. Tenho de trabalhar com todos os prazos simultaneamente, tenho de inicializar todas as máscaras em cada TF, e depois em código, onde uso algum valor, fazer algo como isto:

E assim com cada chamada de cada pulseira. O código vai transformar-se apenas numa diarreia emaranhada.

E cada nova barra vai precisar de alguma forma de a actualizar?

Existe uma função como CopyBuffer, mas copiar não uma matriz, mas um único valor pelo índice certo?

Faça um conjunto de pegas noOnInit() e trabalhe com elas.

CopyBuffer(...) em função da usabilidade, alimentá-lo com manípulo indicador e índice requerido da matriz, e a função devolverá o preço

 
Vitaly Muzichenko:

Faça um conjunto de pegas noOnInit() e trabalhe com elas.

CopyBuffer(...) para uma função de fácil utilização, passe o manípulo indicador e o índice requerido do conjunto, e a função devolverá o preço

muito inconveniente, no entanto)

 
Olga Miakhovich:

(é embaraçoso, no entanto))

Mais como desconfortável ))))

 
Vitaly Muzichenko:

Faça um conjunto de pegas noOnInit() e trabalhe com elas.

CopyBuffer(....) em função de usabilidade, aí alimenta-se o manípulo indicador e o índice requerido da matriz, e a função devolverá o preço

O outro problema do CopyBuffer é que ele requer um buffer indicador para si próprio. Tenho uma centena de indicadores no total e são utilizados nos cálculos para obter um único indicador. Preciso de criar uma centena de amortecedores para armazenar estes valores?

 
Olga Miakhovich:

Outro problema com o CopyBuffer é que este requer necessariamente um tampão indicador para si próprio. Tenho menos de uma centena de indicadores no total e são utilizados nos cálculos para obter um único indicador. Preciso de criar uma centena de amortecedores para armazenar estes valores?

Procure exemplos de códigos no CodeBase do scriptor - tudo está lá.
Na verdade, é possível calcular o MA para qualquer barra.
 
Preciso de um exemplo para resolver o seguinte problema: há um indicador ¹1 no gráfico com uma dúzia de amortecedores gráficos (não ondecaps e outras coisas) e o indicador de cave ¹2 deve tirar alguns amortecedores do indicador ¹1 e mostrá-los como hixogramas (não importa como) já na cave. Obrigado antecipadamente, pelo MT5.