sim, mas porque é que a geleia é reiniciada no TF baixo?
há muitas variantes, não conhecemos a implementação
houve uma discussão semelhante sobre o MT4 no ano passado, disse um dos criadores (penso que Slava), que cada acesso à "TF mais antiga" inicia a sincronização de dados, se for necessário....
Penso que em MT5 o terminal também constrói TF por si só, se necessário, mas se houve atrasos na rede ou ..... a implementação é desconhecida... então o terminal, antes de dar os dados ao indicador num TF sénior, sincroniza os dados históricos com o servidor, quando acontece instantaneamente, e quando, talvez, demora muito tempo, é quando provavelmente será pré_calculado = 0
Se o download alterar os dados históricos do TF baixo, o contador do TF baixo será forçado a zero pelo terminal, por isso não invente problemas a partir do nada
Eu não sou...camarada do programador. Não é uma confirmação, é uma dica, não retorne 0. É todo o seu problema. Você mesmo está a causar um recálculo completo do indicador.
pré_calculado não aumenta; será sempre o mesmo que no final do cálculo
return(rates_total);
i.e., o que recebemos à saída de OnCalculated() será devolvido no próximo tick em prev_calculated (excepto prev_calculated == 0, o terminal faz isto ao lançar o indicador ou ao sincronizar TF......)
Andrei Trukhanovich:
se o descarregamento alterar os dados do histórico da TF baixa, o contador da TF baixa será forçosamente zerado pelo terminal, não crie problemas a partir do nada
Tenho estado a escrever-lhe pelo segundo dia - pegue nos indicadores de Mladen e estude-os - eles funcionam, e sem qualquer sincronização complicada entre as TFs, e aqui ... estamos a poupar recursos e não deixamos que o terminal forme as chamadas TF
Eu ... não sou amigo do codificador. Isto não é uma confirmação, mas uma dica, não retorne 0. É isso que causa todos os seus problemas. Você mesmo está a causar um recálculo completo do indicador.
Pode ser um idiota para dar uma dica, mas nem todos podem ajudá-lo a compreender e a explicar.
2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indicador sobre o período 3 ainda não calculado
2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 seg, 1 barra calculada, 50047 barras total
2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 seg, calculado 1 barras, total de barras 50001
2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 seg, calculado 1 barras, total de barras 50002
agora tudo está a funcionar como planeado, os indicadores só foram totalmente calculados uma vez na primeira corrida e mais uma vez apenas uma vez por cada nova barra.
O código final do segundo indicador, espero que seja útil a alguém:
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
ulong t = GetMicrosecondCount ();
if (rates_total == prev_calculated) return rates_total;
if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
{
if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
{
Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
return prev_calculated;
}
}
else
{
Print ("Период ", OldTF, " не синхронизирован.");
return prev_calculated;
}
ArraySetAsSeries (high, true);
ArraySetAsSeries (time, true);
int limit = rates_total - prev_calculated - 1;
double buff [];
int ind = 0;
for (int i = limit; i >= 0; i--)
{
ind = iBarShift (Symbol (), OldTF, time [i], false);
if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
{
IBuffer [i] = buff [0];
}
else
{
Print ("Ошибка копирования буфера ", GetLastError ());
return0;
}
}
//----------------------------------------------------------------double e = (GetMicrosecondCount () - t) / 1000000.0;
Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
return(rates_total);
}
o meu código irá "martelar em cada tique" apenas o seu indicador #1, onde escreveu :
permitirá ao terminal construir independentemente o "horizonte temporal mais elevado".
Para mim - é "mais barato" do que fazer um recálculo completo do indicador 1, que acontece no seu código ao sincronizar o histórico na "TF superior".
Sim, mas porque é que a pré-falha é reiniciada no TF inferior?
sim, mas porque é que o giz prev previne a reinicialização no TF inferior?
sim, mas porque é que a geleia é reiniciada no TF baixo?
há muitas variantes, não conhecemos a implementação
houve uma discussão semelhante sobre o MT4 no ano passado, disse um dos criadores (penso que Slava), que cada acesso à "TF mais antiga" inicia a sincronização de dados, se for necessário....
Penso que em MT5 o terminal também constrói TF por si só, se necessário, mas se houve atrasos na rede ou ..... a implementação é desconhecida... então o terminal, antes de dar os dados ao indicador num TF sénior, sincroniza os dados históricos com o servidor, quando acontece instantaneamente, e quando, talvez, demora muito tempo, é quando provavelmente será pré_calculado = 0
há muitas opções, não conhecemos a implementação
Se o download alterar os dados históricos do TF baixo, o contador do TF baixo será forçado a zero pelo terminal, por isso não invente problemas a partir do nada
estás a provar o meu ponto de vista, camarada.
Eu não sou...camarada do programador. Não é uma confirmação, é uma dica, não retorne 0. É todo o seu problema. Você mesmo está a causar um recálculo completo do indicador.
Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial
Insectos, insectos, perguntas
Andrey Dik, 2021.05.28 17:26
Pré_calculado não aumenta em 1 na barra seguinte.
pré_calculado não aumenta; será sempre o mesmo que no final do cálculo
return(rates_total);i.e., o que recebemos à saída de OnCalculated() será devolvido no próximo tick em prev_calculated (excepto prev_calculated == 0, o terminal faz isto ao lançar o indicador ou ao sincronizar TF......)
se o descarregamento alterar os dados do histórico da TF baixa, o contador da TF baixa será forçosamente zerado pelo terminal, não crie problemas a partir do nada
Tenho estado a escrever-lhe pelo segundo dia - pegue nos indicadores de Mladen e estude-os - eles funcionam, e sem qualquer sincronização complicada entre as TFs, e aqui ... estamos a poupar recursos e não deixamos que o terminal forme as chamadas TF
substituir
para
e testá-lo.
Não o faça... Ele não vai acreditar de qualquer maneira.
Eu ... não sou amigo do codificador. Isto não é uma confirmação, mas uma dica, não retorne 0. É isso que causa todos os seus problemas. Você mesmo está a causar um recálculo completo do indicador.
Pode ser um idiota para dar uma dica, mas nem todos podem ajudá-lo a compreender e a explicar.
substituir
para
e testá-lo.
Obrigado, Andrei. É a única pessoa que penetrou completamente na questão.
2021.05.28 21:22:54.394 LitTF (EURUSD,M2) O indicador para o período 3 ainda não foi calculado
2021.05.28 21:22:54.396 LitTF (EURUSD,M2) O indicador do período 3 ainda não foi calculado
2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 seg, 50046 barras calculadas, total 50046 barras
2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 seg, 50000 barras calculadas, 50000 barras totais
2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indicador sobre o período 3 ainda não calculado
2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 seg, 1 barra calculada, 50047 barras total
2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 seg, calculado 1 barras, total de barras 50001
2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 seg, calculado 1 barras, total de barras 50002
agora tudo está a funcionar como planeado, os indicadores só foram totalmente calculados uma vez na primeira corrida e mais uma vez apenas uma vez por cada nova barra.
O código final do segundo indicador, espero que seja útil a alguém:
Qualquer tolo pode dar-lhe uma dica, mas nem todos podem ajudá-lo a compreender e ajudá-lo em pormenor.
Conta quantos tolos te aconselham... Só um tipo esperto não consegue ouvir ninguém e teimosamente...............
Criou o seu próprio problema e está a tentar apresentar o seu ...código como um bug mql.