기준 지표를 다시 그리다?!

 
안녕하세요!
다음 문제에 대해 조언해 주십시오.
다음은 전문가 코드입니다.
정수 핸들;
문자열 파일 이름="test_expert_log.csv";

정수 초기화()
  {
   핸들= 파일열기(파일명,FILE_CSV|FILE_WRITE,';');
  if(핸들<1)
   {
    Print("파일을 찾을 수 없습니다, 마지막 오류 ", GetLastError());
    반환(거짓);
   }
   리턴(0);
  }
정수 시작()
  {
이중 test1, test2, test3;
정수 나;

  (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("쓰기 오류!");
      }

   리턴(0);
  }


EA는 형성된 막대에 대한 빠른 시뮬레이션과 함께 EURUSD 쌍 에서 시작됩니다. 다른 통화 쌍에서 확률적 판독값을 읽고 결국 다음과 같은 보고서를 생성합니다.

2006.10.22 22:00;1;76.79738562
2006.10.20 20:00;2;78.13504823
2006.10.20 16:00;3;78.65853659
2006.10.20 12:00;4;80.50139276
2006.10.20 08:00;5;80.25974026
2006.10.20 04:00;6;86.36363636
2006.10.20 00:00;7;86.96969697
2006.10.19 20:00;8;80
2006.10.19 16:00;9;53.76884422
2006.10.23 00:00;1;65.15151515
2006.10.22 22:00;2;74.83660131
2006.10.20 20:00;3;76.79738562 a는 78.13504823(위 참조)
2006.10.20 16:00;4;78.13504823 a는 78.65853659(위 참조) 등이었습니다.
2006.10.20 12:00;5;78.65853659
2006.10.20 08:00;6;80.50139276
2006.10.20 04:00;7;80.25974026
2006.10.20 00:00;8;86.36363636
2006.10.19 20:00;9;86.96969697
2006.10.23 04:00;1;52.85714286
2006.10.23 00:00;2;65.15151515
2006.10.22 22:00;3;74.83660131
2006.10.20 20:00;4;76.79738562
2006.10.20 16:00;5;78.13504823
2006.10.20 12:00;6;78.65853659
2006.10.20 08:00;7;80.50139276
2006.10.20 04:00;8;80.25974026
2006.10.20 00:00;9;86.36363636
2006.10.23 08:00;1;21.83406114
2006.10.23 04:00;2;52.85714286
2006.10.23 00:00;3;65.15151515
2006.10.22 22:00;4;74.83660131
2006.10.20 20:00;5;76.79738562
2006.10.20 16:00;6;78.13504823
2006.10.20 12:00;7;78.65853659
2006.10.20 08:00;8;80.50139276
2006.10.20 04:00;9;80.25974026

새로운 실행에서 동일한 막대에서 표시기의 값이 다른 것을 쉽게 알 수 있습니다.
나는 이 고문의 실제적인 사용이 의심스럽다는 것을 이해합니다 :o) 그러나 목표는 문제를 보여주는 것이었습니다. 왜냐하면 실제로는 다음과 같이 보입니다. 터미널에서는 표시기가 올바르게 표시되지만 Expert Advisor에서 호출하면 잘못된 다른 데이터가 표시됩니다. 임팩트가 없는 것은 다 잘라낸 결과입니다. 나는 아마 이미 엄청나게 멍청하지만, 내 실수가 어디에 있는지 이해할 수 없습니다.
그건 그렇고, 통화 쌍을 현재 통화 쌍으로 변경하면 모든 것이 정상입니다.
도움을 주셔서 미리 감사드립니다.

 
약간 변경된 deinit()
//+------------------------------------------------------------------+
//|                                         TestSymbolStochastic.mq4 |
//|                                                           satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

int handle;
string filename="test_expert_log.csv";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';');
  if(handle<1)
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double test1,test2,test3;
int i;

  for (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Ошибка записи!");
      }

//----
   return(0);
  }
//+------------------------------------------------------------------+



모든 것이 나를 위해 작동합니다 (전체 파일을 확인하지는 않았지만)

 
사탄...:o)
물론 문제 는 파일을 닫는 데 있지 않습니다. 왜냐하면 내가 말했듯이 처음에는 터미널에서 그리고 Expert Advisor에서 호출할 때 다른 표시기 값이 발생했기 때문입니다. 그리고 나서야 이 "현상"을 연구하기 위해 파일로 출력했습니다.
사실, 모든 것이 내 다른 컴퓨터에서도 작동했습니다. 다만, 당분간...
통화 쌍을 하나 더 추가하기에 충분했습니다 ...
 test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       test2=iStochastic("EURGBP",Period(),5,3,3,0,0,0,i);


상황이 어떻게 된거야
2006.10.22 22:00;1;74.83660131;19.04761905
2006.10.20 20:00;2;76.79738562;13.91304348
2006.10.20 16:00;3;78.13504823;25.26315789
2006.10.20 12:00;4;78.65853659;48.7804878
2006.10.20 08:00;5;80.50139276;81.57894737
2006.10.20 04:00;6;80.25974026;79.74683544
2006.10.20 00:00;7;86.36363636;74.66666667
2006.10.19 20:00;8;86.96969697;76.54320988
2006.10.19 16:00;9;80;79.22077922
2006.10.23 00:00;1;65.15151515;29.78723404
2006.10.22 22:00;2;74.83660131;19.67213115
2006.10.20 20:00;3;76.79738562;19.04761905
2006.10.20 16:00;4;78.13504823;13.91304348
2006.10.20 12:00;5;78.65853659;25.26315789
2006.10.20 08:00;6;80.50139276;48.7804878
2006.10.20 04:00;7;80.25974026;81.57894737
이러한 조건(!)에서 첫 번째 쌍은 잘 작동하지만 두 번째 쌍은 ...
나에게는 다른 것이 이상합니다. 문제는 체계적이지 않습니다. 비슷한 조건의 동일한 코드는 다른 결과를 제공합니다. 터미널 도처에 198. 두 개의 다른 브로커에서 테스트되었습니다. 그 중 하나가 MIG입니다.
친애하는 각하, 개발자가 이 재앙을 처리하는 방법을 알려줄까요?

 
결과적으로 문제는 확률론이 아니라 지표가 전혀 아닙니다. 사실은 어떤 이유로 MT4가 현재 막대가 아니라 이전 막대가 "슬립"한다는 것입니다.
이런식으로 선택을 하자면
 문자열시간1, 시간2, 시간3;

  (i=1;i<10;i++)
      {
      time1=TimeToStr(iTime("GBPUSD",Period(),i));
      time2=TimeToStr(iTime("EURGBP",Period(),i));
      time3=TimeToStr(iTime("EURUSD",Period(),i));
       if (FileWrite (handle,TimeToStr(Time[i]),i,time1,time2,time3)<=0) Print("쓰기 오류!");
      }


그러면 다음을 얻습니다.

2006.10.22 22:00;1;2006.10.22 22:00;2006.10.20 20:00;2006.10.22 22:00
2006.10.20 20:00;2;2006.10.20 20:00;2006.10.20 16:00;2006.10.20 20:00
2006.10.20 16:00;3;2006.10.20 16:00;2006.10.20 12:00;2006.10.20 16:00
2006.10.20 12:00;4;2006.10.20 12:00;2006.10.20 08:00;2006.10.20 12:00
2006.10.20 08:00;5;2006.10.20 08:00;2006.10.20 04:00;2006.10.20 08:00
2006.10.20 04:00;6;2006.10.20 04:00;2006.10.20 00:00;2006.10.20 04:00
2006.10.20 00:00;7;2006.10.20 00:00;2006.10.19 20:00;2006.10.20 00:00
2006.10.19 20:00;8;2006.10.19 20:00;2006.10.19 16:00;2006.10.19 20:00
2006.10.19 16:00;9;2006.10.19 16:00;2006.10.19 12:00;2006.10.19 16:00
2006.10.23 00:00;1;2006.10.23 00:00;2006.10.23 00:00;2006.10.23 00:00
2006.10.22 22:00;2;2006.10.22 22:00;2006.10.22 22:00;2006.10.22 22:00
2006.10.20 20:00;3;2006.10.20 20:00;2006.10.20 20:00;2006.10.20 20:00
더 이상 정상입니다.
때로는 하나의 통화에서 실패가 발생하고 때로는 두 개의 통화에서 오류가 발생합니다. 시스템을 찾지 못했습니다. 그것이 기계의 힘에 달려 있는지 (상당히 빠른 기계에서 시작되었지만) 또는 다른 것에 의존하는지 ...
그러나 사실은 테스트가 불가능합니다. 첫 번째 호출에서 MT는 잘못된 데이터를 제공합니다.
문제는 남아 있습니다. 이것이 버그인지 기능인지입니다. :o) 그것이 기능이라면, 그것을 다루는 방법. 누군가 비슷한 문제에 직면했을 수도 있습니다.

 
깊이 탐구하지 않고, 나는 당신이 역사가 있는 무언가(또는 아마도 가격 모델링의 특성과 관련이 있을 수 있음)를 가지고 있다고 제안하고, 당신이 표시하는 시간과 지수에 주의를 기울이십시오.
첫 번째 인쇄에서 인덱스 1이 있는 막대가 인덱스 3이 되고 막대 2가 인덱스 4가 된 것을 볼 수 있습니다. 게다가 분명히 H4에서 Expert Advisor를 시작했으며 시간 22:00은 아무 말도 하지 않습니다.
아마도 테스터에서 모델링에 대한 기사를 다시 읽을 것입니다. 아마도 "및"
행운을 빕니다. 여기에서 결과를 보고하는 것을 잊지 마세요 ;)

추신 또는 다른 시뮬레이션 옵션을 시도하고 결과를 볼 수 있으며 이미 몇 가지 결론을 도출할 수 있습니다.
 
사실 모든 것이 그렇게 간단하지는 않습니다. 모든 것은 역사에 따라 순조롭게 진행됩니다. 이 막대가 있으며 모든 것이 정상인 것 같습니다. 다시 위에서 썼듯이 테스트는 서로 다른 기록을 가진 두 브로커(FIBO, MIG)의 두 터미널에서 수행되었습니다.
또한, 이러한 그림은 다른 TF(1Н, 30М, 15М 등)에서도 관찰되며 다른 가격 모델링 옵션(세 가지 모두)은 여전히 언급된 오류로 이어집니다.
그리고 22:00의 4시간 바에는 초자연적인 것이 없습니다. 일반적인 "일요일" 바입니다. 실제로는 22:00에 열립니다. 예를 들어 모든 중개인이 Alpari와 같이 역사를 자르는 것은 아닙니다. ;에 대한)
그러나 문제는 훨씬 더 현지화되었습니다. 이러한 유형의 Expert Advisor는 모든 브로커에 대해 오류를 생성하지 않는 것으로 나타났습니다. 즉, "일요일" 데이터가 있는 사람들입니다. 특히 Alpari는 잘 작동하지만 FIBO와 MIG에는 오류가 있습니다. 또한 "일요일" 막대를 볼 때만 오류가 생성됩니다.
나는 그것이 "기능"이라고 생각하지 않습니다. 버그에 가깝습니다. 오류가 동일한 쌍에 나타나지 않기 때문입니다. 한 순간에는 한 쌍에, 다른 순간에는 다른 순간에, 세 번째 순간에는 한 번에 두 개가 될 수 있습니다.
나는 여전히이 문제에 대한 개발자의 관심을 끌고 그들로부터 답을 얻으려는 희망을 잃지 않습니다. 이것은 어떤 종류의 불행이며 어떻게 처리해야합니까? o) (단순히 "Alpari와 협력하십시오"라고 말하지 마십시오. 영형))

PS 어쨌든 Profi_R의 참여에 감사드립니다. 하지만 보시다시피 간단한 솔루션은 도움이 되지 않습니다. 분명히 깊이 파고들어야 할 것입니다. :에 대한)
 
나는 지금 똑같은 것을 알아 내려고 노력하고 있습니다. 지시자:

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_minimum -1
#property indicator_maximum 1

// indicator parameters
extern int nPeriod = 9;
extern int nPeriod_1 = 6;

// indicator buffers
double dUsdChf, dUsdChfPrev;

double arrGroupBuffer[];
double arrGroupMaBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
	string strIndicatorShortName = "Group(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_NONE);
	SetIndexShift(0, 0);
		
	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrGroupBuffer);
	SetIndexBuffer(1, arrGroupMaBuffer);

	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	// last counted bar will be recounted
//	if(nExtCountedBars > 0) 
//		nExtCountedBars--;
		
	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		if(!IsTesting())
		{
			dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
			dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);
		}

		arrGroupBuffer[nPos - 1] = 0;
			
		if(dUsdChfPrev - dUsdChf > 0)
			arrGroupBuffer[nPos - 1] += 1;
		else if(dUsdChfPrev - dUsdChf < 0)
			arrGroupBuffer[nPos - 1] -= 1;

		if(nPeriod_1 == 1)
			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1];
		else 
		{
			dPr = 2.0 / (nPeriod_1 + 1);

			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1] * dPr + 
				arrGroupMaBuffer[nPos] * (1 - dPr);
		}
		
		nPos--;
	}

	return(0);
}



백테스트할 수 없기 때문에 실용적인 용도는 거의 없습니다(두 번째 통화는 두 기록의 막대가 동기화되지 않으면 환상적인 수익을 창출합니다. 이미 이에 대해 썼습니다). 하지만 그게 아닙니다.

코드에서 볼 수 있듯이 지표는 차트에 첨부된 통화에 의존하지 않습니다. 항상 USDCHF에서 작동합니다. 제 경우에는 AUDUSD와 EURUSD라는 두 개의 차트 에 지표를 첨부 했지만 아무거나 사용할 수 있다고 생각합니다. 우리는 며칠 동안 떠납니다. 그리고 우리는 그래프가 다르다는 것을 알 수 있습니다. 같은 지표. 실시간. 같은 MT. 우리는 강제로 다시 그립니다(후크 해제 - 부착) - 그들은 동일해집니다. 몇 시간 동안.

지금 이 사건을 추적하고 있는데, 뭔가를 찾으면 알려 드리겠습니다. 저만 그럴수도 있어요 :)

 
잘. "내"지표가 경멸 될 수 있으므로 논리에 문제가 있다고 말하므로 "도우미 통화"를 테스트하기 위해 단순화 된 지표를 작성했습니다.

코드(아래 참조)는 USDCHF, H1에서 데이터(표시기가 연결된 창에 관계없이)를 가져와 차트를 그립니다. a) Open, MA(Open, 6) 및 MA(Open, 6, 호출하지 않고 수동으로 계산) 표준 표시기 ).

지표는 EURUSD H1 및 AUDUSD H1에 첨부되었습니다. 12시간의 작업 후에 차트에 차이가 표시됩니다(데이터는 USDCHF에서 가져왔으며 차이가 없어야 함을 상기시킵니다). 또한 차이점은 MA가 아니라 Open 라인에 있습니다(MA에서도 물론이지만 Open 때문에 이차적임).

따라서 다른 통화의 데이터 사용과 관련된 버그가 있습니다. 남. 개발자?

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Aqua
#property indicator_color3 Red


// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrMa[];
double arrMyMa[];

int nExtCountedBars = 0;

double dUsdChf, dUsdChfPrev;

////////////////////////
int init()
{
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexShift(0, 0);

	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	SetIndexStyle(2, DRAW_LINE);
	SetIndexShift(2, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrOpen);
	SetIndexBuffer(1, arrMa);
	SetIndexBuffer(2, arrMyMa);
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
		dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);

		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrMa[nPos - 1] = dUsdChf;

		arrMyMa[nPos - 1] = arrOpen[nPos - 1] * dPr + 
				arrMyMa[nPos] * (1 - dPr);

		nPos--;
	}

	return(0);
}
 
숲으로 깊숙이 들어갈수록 당파는 더 두꺼워집니다.
첫째, 기록이 많을수록 오류가 더 많이 발생합니다.
둘째, 다음은 코드입니다(서투른 코드에 대해 즉시 사과드립니다).
#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=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";
string Para;
int TF;
int handle,handle2;
int init()
  {
   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);

   string Para=Symbol();
   int TF=Period();
   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);
   }
   return(0);
  }
int deinit()
  {
   FileClose(handle);
   return(0);
  }
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       ExtMapBuffer1[i]=iTime(Currency1,Period(),i);
       Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),i);
       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]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
       )<=0) Print("нифига не пишет!!");
        }
        FileFlush(handle);
      if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }
   return(0);
  }


EURUSD 및 GBPUSD 통화 쌍에서 EURGBP에서 4시간 동안 출시되면 2000개 이상의 오류가 발생합니다.
15M에서 - 26500 이상.
또한 15M의 경우 교대는 하나의 막대가 아니라 훨씬 더 많습니다(100(!) 막대 이상).
다음은 로그의 일부입니다.
2006년 6월 15일 1:45 2006년 6월 16일 0시 45분 2006년 6월 16일 0시
2006년 6월 15일 1:30 2006년 6월 16일 0시 30분 2006년 6월 15일 23:45
2006년 6월 15일 1:15 2006년 6월 16일 0시 15분 2006년 6월 15일 23시 30분
2006-06-15 1:00 2006-06-16 0:00 2006-06-15 23:15
2006년 6월 15일 0:45 2006년 6월 15일 23:45 2006년 6월 15일 23:00
2006년 6월 15일 0시 30분 2006년 6월 15일 23시 30분 2006년 6월 15일 22시 45분
2006년 6월 15일 0시 15분 2006년 6월 15일 23시 15분 2006년 6월 15일 22시 30분
2006-06-15 0:00 2006-06-15 23:00 2006-06-15 22:15
2006년 6월 14일 23:45 2006년 6월 15일 22:45 2006년 6월 15일 22:00
2006년 6월 14일 23:30 2006년 6월 15일 22:30 2006년 6월 15일 21:45
2006년 6월 14일 23:15 2006년 6월 15일 22:15 2006년 6월 15일 21:30
2006년 6월 14일 23:00 2006년 6월 15일 22:00 2006년 6월 15일 21:15
2006년 6월 14일 22:45 2006년 6월 15일 21:45 2006년 6월 15일 21:00
2006년 6월 14일 22:30 2006년 6월 15일 21시 30분 2006년 6월 15일 20시 45분
이 로그는 새로 다운로드한 터미널과 새로운 기록의 Alpari 서버에서 가져왔습니다(2005년 10월 3일까지 세 통화 쌍 모두에 대해 15M에서).
이 모든 연구의 의미는 개발자로부터 이 현상에 대한 이해하기 쉬운 설명을 얻는 것입니다.
더욱이 친애하는 여러분, 일주일 동안 아무 말도 하지 않은 것이 부끄럽습니다.
나는 더 이상 문제의 심각성을 증명하는 방법을 알지 못하므로 주의를 기울이십시오.
상황과 코드의 투명한 단순성으로 인해 평범한 오류에 대해 생각할 수 없습니다. 따라서 다시 한 번 개발자에게 연락합니다.
신사 숙녀 여러분! 이 스레드에 주의를 기울이고 귀하 측의 최소한의 의견을 제시해 주시기를 진심으로 요청합니다. 이것이 내 실수라면 업무에 사용하지 마십시오. 적어도 찾을 위치를 알려주십시오. 그리고 그 경우에 나는 그녀에게 사과할 것이다. 이것이 MT4의 실수라면, 이 소중한 자원을 직접 사용하지 않는 현재 상황을 발견하고 관심을 끌기 위해 소비하는 사람들(저만 그런 것이 아닙니다)의 시간을 존중할 가치가 있다고 생각합니다. 직무.
건설적인 대화를 존중하고 희망하며... :o)

 
알다시피, 당신은 자신을 혼란스럽게했습니다 :)
거의 20년 전, 나는 호스텔에 앉아 숟가락으로 동그랗게 차를 저으면서 깔때기를 통한 이미지가 왜곡되었음을 발견했습니다. 나는 즉시 간단한 설명을 잊었지만, 이 확인에서 원을 그리며 움직이는 물 덩어리는 중력의 국부적 변화를 일으키고(이는 버뮤다 삼각지대에서 배가 사라지는 것을 설명함) 그에 따라 파도의 굴절( 빛). 이 일식은 소용돌이 치는 물에서 얻은 평범한 렌즈라는 것을 깨닫기 전에 몇 분 동안 지속되었습니다. :)

코드를 약간 변경했습니다.
//+------------------------------------------------------------------+
//|                                             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=20;   //кол-во считаемых баров, если 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(),Currency1,Currency2);
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift(Currency1,Period(),TimeMain));
       //Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift(Currency2,Period(),TimeMain));
       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]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+
 
귀하의 코드는 다른 기기 에서 동일한 인덱스를 가진 막대가 항상 동일한 시간 간격을 반영하는 것은 아니라는 사실을 보여주었습니다.
즉, 질문은 실제로 다음과 같이 들립니다. 왜 동일하지 않은지, 왜 역사에 구멍이 있습니까? GBPJPY H4에서 이 표시기를 실행하고 두 개의 결과 파일을 열었습니다.
두 곳에서 시간이 중단되고 두 번째 파일에 많은 "오류"가 표시된다는 것이 즉시 분명합니다.




PS 지수 알파리.