Rosh, estou apenas tentando descobrir se o erro ocorre porque a barra USDCHF começa mais tarde. Para rastrear isso, removi o MA (ele só atrapalha), e introduzi adicionalmente Fechar[1] e Abrir[1]. O que significa que Open[1] será sempre correto, e se este for o problema, a discrepância estará em Open[0] e Open[1] não será. Verificação agora. O que eu perdi?
Bem, anexei 2 figuras, que mostram que quando uma nova barra aparece no GBPJPY você está se referindo aos dados antigos do gráfico USDCHF inalterado, e portanto seu algoritmo calcula incorretamente. Ele contará corretamente apenas em um caso - se você colocá-lo no "quadro" nativo - mas o objetivo é o oposto.
Eu concordo. Mas somente se os testes com Open[1] demonstrarem que não há erros. Nesse caso, terei certeza de que sim, não há nenhum bug em MT. Há uma certa... e, por assim dizer, subavaliação.
Além disso, o desafio é encontrar uma forma de contornar a limitação. Digamos, proibir o redesenho do indicador EURUSD até a chegada dos dados do USDCHF. Agora estou testando a seguinte variante
Mas tudo depende de como a MT calcula o IndicatorCounted. Se por hora de chegada - não vai funcionar, se pelo fato de re-desenhar o bar - vai funcionar. Vamos ver.
Eu concordo. Mas somente se тестирование com Open[1] mostrar que não ocorre nenhum erro. Nesse caso, terei certeza de que sim, não há nenhum bug em MT. Há uma certa... reticência ou algo assim.
Além disso, o desafio é encontrar uma forma de contornar a limitação. Digamos, proibir o redesenho do indicador EURUSD até a chegada dos dados do USDCHF. Agora estou testando a seguinte variante
Mas aqui tudo depende de como a MT calcula o IndicatorCounted. Se por hora de chegada - não vai funcionar, se pelo fato de um novo traçado de barra - vai funcionar. Vamos ver.
Pare, pare. Aqui é onde você escreve :
Como você pode ver pelo código, o indicador não depende da moeda a que está anexado. Funciona sempre por USDCHF. Anexamos o indicador a dois gráficos, no meu caso AUDUSD e EURUSD, mas suponho que você possa anexá-lo a qualquer gráfico. Deixamo-lo por alguns dias. E vemos que os gráficos são DIFERENTES. O mesmo indicador. Em tempo real. O mesmo MT. Rastejar de novo à força (Desconectar - Conectar) - eles se tornam os mesmos. Por algum tempo.
Portanto, estamos falando de trabalho on-line, e agora saltamos para um testador. Eu não tenho tempo para isso.
Caro Rosh, poderia explicar como é possível a seguinte situação? Eu o enviei para o segundo arquivo da lista de barras para poder ver as dropdowns.
//+------------------------------------------------------------------+
//| RedrawIndicators.mq4 |
//| Satori |
//| http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link "http://www.metaquotes.ru/forum/7790/"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int BarsCount=0; //кол-во считаемых баров, если 0 - то все
extern string Currency1="EURUSD";
extern string Currency2="GBPUSD";
int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexLabel(0,Currency1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexLabel(1,Currency2);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtMapBuffer3);
handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';');
handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';');
if(handle<1 || handle2<1 )
{
Print("Файл не обнаружен, последняя ошибка ", GetLastError());
return(false);
}
else
{
FileWrite (handle,"index",Symbol(),"index",Currency1,"index",Currency2);
FileWrite (handle2,"index",Currency1,Currency2,Symbol());
}
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
FileClose(handle);
FileClose(handle2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int i;
int test1,test2;
datetime tt1,tt2,TimeMain;
BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
Print (Bars," ",iBars(Currency1,Period())," ",iBars(Currency2,Period()));
Print (BarsCount);
for (i=0;i<BarsCount-counted_bars;i++)
{
TimeMain=Time[i];
test1=iBarShift(Currency1,Period(),TimeMain);
test2=iBarShift(Currency2,Period(),TimeMain);
ExtMapBuffer1[i]=iTime(Currency1,Period(),test1);
ExtMapBuffer2[i]=iTime(Currency2,Period(),test2);
ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
tt1=Time[i]-ExtMapBuffer1[i];
tt2=Time[i]-ExtMapBuffer2[i];
if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0)
{
if (FileWrite (handle,
i,TimeToStr(Time[i]),iBarShift(Currency1,Period(),TimeMain),TimeToStr(ExtMapBuffer1[i]),iBarShift(Currency2,Period(),TimeMain),TimeToStr(ExtMapBuffer2[i])
)<=0) Print("нифига не пишет!!");
}
FileFlush(handle);
if (FileWrite (handle2,i,
TimeToStr(iTime(Currency1,Period(),test1)),
TimeToStr(iTime(Currency2,Period(),test2)),
TimeToStr(Time[i])
)<=0) Print("нифига не пишет!!");
FileFlush(handle2);
}//----
return(0);
}
//+------------------------------------------------------------------+
Nós o executamos no EURGBP 4H em duas outras corretoras, não na Alpari (MIG, FIBO). A imagem é quase a mesma para ambos, vou mostrar um exemplo na MIG. índice EURGBP índice EURUSD índice GBPUSD 15 30.10.2006 0:00 16 29.10.2006 23:00 16 29.10.2006 23:00 46 23.10.2006 0:00 47 22.10.2006 23:00 47 22.10.2006 23:00 77 16.10.2006 0:00 78 15.10.2006 23:00 78 15.10.2006 23:00 108 09.10.2006 0:00 109 08.10.2006 23:00 109 08.10.2006 23:00 139 02.10.2006 0:00 139 02.10.2006 0:00 140 01.10.2006 23:00
Veja, por exemplo, as barras 46-47. No segundo arquivo: 45 23.10.2006 4:00 23.10.2006 4:00 23.10.2006 4:00 46 22.10.2006 23:00 22.10.2006 23:00 23.10.2006 0:00 47 22.10.2006 23:00 22.10.2006 23:00 22.10.2006 23:00 48 20.10.2006 20:00 20.10.2006 20:00 20.10.2006 20:00
Parece estar tudo bem... Mas aqui está o problema - a barra 23.10.2006 00:00 está presente na história em todas as três moedas! Isto é, está no gráfico, está no arquivo de citações. Mas parece estar ausente do indicador. E o último truque - se você tentar colocar uma linha vertical nesta barra, ela passará para a próxima barra. :о) Tentei marcá-lo com uma linha vertical, mas não funcionou.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Além disso, o desafio é encontrar uma forma de contornar a limitação. Digamos, proibir o redesenho do indicador EURUSD até a chegada dos dados do USDCHF. Agora estou testando a seguinte variante
while(nPos > 1 ||| (nPos == 1 && Time[0] <= iTime("USDCHF", 0, 0)))Mas tudo depende de como a MT calcula o IndicatorCounted. Se por hora de chegada - não vai funcionar, se pelo fato de re-desenhar o bar - vai funcionar. Vamos ver.
Open[1] EURUSD H1 é 1,2755
Open[1] USDCHF H1 é 1,2443
Uma nova barra de uma hora aparece no EUR, nada mudou ainda no franco. O que fará seu algoitm?
Além disso, o desafio é encontrar uma forma de contornar a limitação. Digamos, proibir o redesenho do indicador EURUSD até a chegada dos dados do USDCHF. Agora estou testando a seguinte variante
while(nPos > 1 ||| (nPos == 1 && Time[0] <= iTime("USDCHF", 0, 0)))Mas aqui tudo depende de como a MT calcula o IndicatorCounted. Se por hora de chegada - não vai funcionar, se pelo fato de um novo traçado de barra - vai funcionar. Vamos ver.
Pare, pare. Aqui é onde você escreve :
Portanto, estamos falando de trabalho on-line, e agora saltamos para um testador. Eu não tenho tempo para isso.
Aberto[1] USDCHF H1 é 1,2443
Uma nova barra horária aparece no EUR, nada mudou ainda no FRANCO. O que fará seu algoitm?
Sim, você está certo. Você tem que observar a hora do bar, não o seu número.
Sem testador. Somente online.
Eu o enviei para o segundo arquivo da lista de barras para poder ver as dropdowns.
//+------------------------------------------------------------------+ //| RedrawIndicators.mq4 | //| Satori | //| http://www.metaquotes.ru/forum/7790/ | //+------------------------------------------------------------------+ #property copyright "Satori" #property link "http://www.metaquotes.ru/forum/7790/" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 Blue #property indicator_color3 Yellow //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; extern int BarsCount=0; //кол-во считаемых баров, если 0 - то все extern string Currency1="EURUSD"; extern string Currency2="GBPUSD"; int handle,handle2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); SetIndexLabel(0,Currency1); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexLabel(1,Currency2); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,ExtMapBuffer3); handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';'); handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';'); if(handle<1 || handle2<1 ) { Print("Файл не обнаружен, последняя ошибка ", GetLastError()); return(false); } else { FileWrite (handle,"index",Symbol(),"index",Currency1,"index",Currency2); FileWrite (handle2,"index",Currency1,Currency2,Symbol()); } return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- FileClose(handle); FileClose(handle2); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i; int test1,test2; datetime tt1,tt2,TimeMain; BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period())))); Print (Bars," ",iBars(Currency1,Period())," ",iBars(Currency2,Period())); Print (BarsCount); for (i=0;i<BarsCount-counted_bars;i++) { TimeMain=Time[i]; test1=iBarShift(Currency1,Period(),TimeMain); test2=iBarShift(Currency2,Period(),TimeMain); ExtMapBuffer1[i]=iTime(Currency1,Period(),test1); ExtMapBuffer2[i]=iTime(Currency2,Period(),test2); ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]); tt1=Time[i]-ExtMapBuffer1[i]; tt2=Time[i]-ExtMapBuffer2[i]; if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) { if (FileWrite (handle, i,TimeToStr(Time[i]),iBarShift(Currency1,Period(),TimeMain),TimeToStr(ExtMapBuffer1[i]),iBarShift(Currency2,Period(),TimeMain),TimeToStr(ExtMapBuffer2[i]) )<=0) Print("нифига не пишет!!"); } FileFlush(handle); if (FileWrite (handle2,i, TimeToStr(iTime(Currency1,Period(),test1)), TimeToStr(iTime(Currency2,Period(),test2)), TimeToStr(Time[i]) )<=0) Print("нифига не пишет!!"); FileFlush(handle2); }//---- return(0); } //+------------------------------------------------------------------+Nós o executamos no EURGBP 4H em duas outras corretoras, não na Alpari (MIG, FIBO).
A imagem é quase a mesma para ambos, vou mostrar um exemplo na MIG.
índice EURGBP índice EURUSD índice GBPUSD
15 30.10.2006 0:00 16 29.10.2006 23:00 16 29.10.2006 23:00
46 23.10.2006 0:00 47 22.10.2006 23:00 47 22.10.2006 23:00
77 16.10.2006 0:00 78 15.10.2006 23:00 78 15.10.2006 23:00
108 09.10.2006 0:00 109 08.10.2006 23:00 109 08.10.2006 23:00
139 02.10.2006 0:00 139 02.10.2006 0:00 140 01.10.2006 23:00
Veja, por exemplo, as barras 46-47.
No segundo arquivo:
45 23.10.2006 4:00 23.10.2006 4:00 23.10.2006 4:00
46 22.10.2006 23:00 22.10.2006 23:00 23.10.2006 0:00
47 22.10.2006 23:00 22.10.2006 23:00 22.10.2006 23:00
48 20.10.2006 20:00 20.10.2006 20:00 20.10.2006 20:00
Parece estar tudo bem... Mas aqui está o problema - a barra 23.10.2006 00:00 está presente na história em todas as três moedas! Isto é, está no gráfico, está no arquivo de citações.
Mas parece estar ausente do indicador.
E o último truque - se você tentar colocar uma linha vertical nesta barra, ela passará para a próxima barra. :о) Tentei marcá-lo com uma linha vertical, mas não funcionou.