Características da linguagem mql5, subtilezas e técnicas - página 30
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Eu não percebo nada...
Eu crio um cabo de um AO padrão no indicador, mas com um período de tempo definido. Quando recebo dados da AO com um prazo que não coincide com o actual, recebo ... Eu não recebo nada - erro 4806.
Pergunta: Qual é a forma correcta de obter dados de indicadores padrão com prazos que não coincidem com o actual?
Eu não percebo nada...
Eu crio um cabo de um AO padrão no indicador, mas com um período de tempo definido. Quando recebo dados da AO com um prazo que não coincide com o actual, recebo ... Eu não recebo nada - erro 4806.
Qual é a pergunta, qual é a forma correcta de obter os dados dos indicadores padrão com prazos que não coincidem com o actual?
Sobre a obtenção dos valores do INDICADOR no INDICADOR:
Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos
Como obter dados de outro Indicador em um Indicador
Vladimir Karputov, 2016.12.27 08:41
Tendo em conta que nos indicadores MQL5, a barra com índice "0" é por defeito a barra ESQUERDA no gráfico, vamos tentar obter dados no nosso indicador a partir de outros dois indicadores - MA e Alligator(este exemplo no indicador "IndicatorFromIndicators.mql5").
Vamos tentar receber dados de MA e Alligator na barra com índices "0", "1" e "2":
//---
Comment("Проверка: time[0]=",time[0],"\n",
"rates_total-1: ",rates_total,"\n",
"BarsCalculated(iMA): ",BarsCalculated(handle_iMA),"\n",
"BarsCalculated(iAlligator): ",BarsCalculated(handle_iAlligator),"\n",
"MA[",0,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(0)),"\n",
"MA[",1,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(1)),"\n",
"MA[",2,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(2)),"\n",
"Jaws[",0,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,0)),"\n",
"Jaws[",1,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,1)),"\n",
"Jaws[",2,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,2)));
//--- return value of prev_calculated for next call
return(rates_total);
}
Vamos anexar o indicador de teste"IndicatorFromIndicators.mql5" ao gráfico e definir o retículo para a barra mais direita - ou seja, não é barra zero. Isto é o que parece:
Embora a mira esteja definida para a barra DIREITA - ou seja, definitivamente não uma barra com índice "0", ao utilizaro CopyBuffer deve estar ciente de queo CopyBuffer irá copiar dados do presente para o passado, ou seja, barra com índice "0" significa a barra actual.
CopyBuffer: Os elementos de dados a serem copiados (buffer de código com um buffer_num de índice) são contados a partir da posição inicial do presente para o passado, ou seja, a posição inicial 0 significa a barra atual (valor do código para a barra atual).
Ou seja, no código MQL5, se ele utiliza a operação CopyBuffer, é necessário inverter a matriz (ArraySetAsSeries), para que a barra mais à direita no gráfico corresponda ao índice "0" no buffer do código (agora no exemplo "iMTF_AO.mq5", a barra mais à direita no gráfico corresponde a rates_total-1).
Sobre obter valores INDICADORES no INDICADOR:
CopyBuffer: Os elementos dos dados copiados (buffer de código com um buffer_num de índice) são contados da posição inicial do presente para o passado, ou seja, a posição inicial igual a 0 significa a barra atual (valor do código para a barra atual).
Ou seja, no código MQL5, se ele utiliza a operação CopyBuffer, deve-se inverter a matriz (ArraySetAsSeries), para que a barra mais à direita no gráfico corresponda ao índice "0" no buffer do indicador (agora no exemplo "iMTF_AO.mq5", a barra mais à direita no gráfico corresponde a rates_total-1).
Eu só tenho um bar. E o indicador no período de tempo "nativo" exibe os dados normalmente. Sobre o "não-nativo" - valor em branco. Descobri empiricamente que um valor vazio será devolvido até que todo o histórico seja carregado durante o período de tempo a partir do qual recebo os dados da AO.
A questão seria então: Como evitar entrar no laço enquanto o histórico está sendo carregado durante o período de tempo? É apenas um teste, enquanto em geral o indicador realiza cálculos de acordo com o histórico de um determinado período de tempo e não há necessidade de tentar realizá-los até que não haja histórico.
Só tenho direito a um bar. E o indicador no período de tempo "nativo" exibe os dados normalmente. No "não-nativo", mostra um valor em branco. Descobri empiricamente que um valor vazio será devolvido até que todo o histórico seja carregado durante o período de tempo, a partir do qual recebo dados da AO.
Então a questão soará diferente: como não entrar no laço, enquanto o histórico para o período de tempo está carregando? Isto é apenas um teste. Em geral, o indicador executa os cálculos de acordo com o histórico de um determinado período de tempo e não há necessidade de tentar realizá-los até que não haja histórico.
O "i" não é um "0", mas um valor exorbitante. Resumindo: digamos que corremos o exemplo na M15 - temos 5000 barras neste período. Pedimos dados ao H4 - temos apenas 400 barras. Depois tentamos pedir "AO(4999)".
Ou seja, a partir do período H4 tentamos solicitar a barra com índice "4999" - mas não existe nenhuma barra desse tipo no H4, existem apenas 400 barras, mas solicitamos a barra "0", e se o indicador utilizar a operação CopyBuffer, devemos girar o array (ArraySetAsSeries) para que a barra mais à direita no gráfico corresponda ao índice "0" no buffer do indicador (agora no exemplo "iMTF_AO.mq5" a barra mais à direita no gráfico corresponde a rates_total-1).
Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação
Bugs, bugs, perguntas
fxsaber, 2017.04.12 08:38
Uma pequena ponta do chapéu. Contornar o operador de atribuiçãoResultado
Aqui..:
O "i" não é um "0", mas um valor exorbitante. Resumindo: digamos que corremos o exemplo na M15 - temos 5000 barras neste período. Pedimos dados ao H4 - temos apenas 400 barras. Depois tentamos pedir "AO(4999)".
Por exemplo, a partir do período H4, tentamos solicitar a barra com índice "4999" - mas não existe tal barra no H4, existem apenas 400 barras, mas queremos a barra "0", e se o indicador utiliza a operação CopyBuffer, devemos inverter o array (ArraySetAsSeries), para que a barra mais à direita no gráfico corresponda ao índice "0" no buffer do indicador (por exemplo "iMTF_AO.mq5" agora a barra mais à direita no gráfico corresponde a rates_total-1).
Não, claro que tentei calcular o limite:
... Mas vejo que estraguei tudo à pressa - é apropriado apenas para o actual período de tempo
Não, claro que tentei calcular o limite:
... Mas vejo que estraguei tudo à pressa - é apropriado apenas para o período de tempo actual.
Olhaste sequer para o código que te mostrei? Ou você a dirigiu?
Eu não perguntei como preencher o buffer indicador, mas porque é que se eu tirar valores de AO não da barra actual, eles devolvem valores vazios.
Eu recebi - não há histórico, ele está sendo carregado e enquanto ele está sendo carregado AO de um período de tempo não nativo retorna o erro "sem dados".
Agora a questão é: como saber se o histórico para o período de tempo necessário está totalmente carregado, de modo a não entrar no ciclo indicador?