기준 지표를 다시 그리다?! - 페이지 2

 
Rosh(b)가 맞습니다. 나는 그것에 대해 쓰고 싶었지만 그는 (항상 그렇듯이) 나를 앞서갔습니다. 하지만. 내 표시기는 이것과 아무 관련이 없으며 다른 문제가 있습니다. 다른 통화 쌍에서 다르게 그려집니다(데이터는 항상 USDCHF에서 가져오고 항상 막대 시작, 00분에). 막대 번호는 항상 1입니다. 따라서 버그가 있습니다. 있다. 그리고 그것이 나을 때까지는 위험없이 그러한 것들을 테스트하고 사용할 수 없습니다.

사실, 내 지표는 더 단순화 될 수 있습니다. USDCHF에 대한 별도의 Open[0] 창을 구축하고 이 지표를 EURUSD 및 AUDUSD에 연결합니다. 얼마 후(시간별 차트에서 - 몇 시간), 차이가 나타나기 시작합니다.
 
Rosh(b)가 맞습니다. 나는 그것에 대해 쓰고 싶었지만 그는 (항상 그렇듯이) 나를 앞서갔습니다. 하지만. 내 표시기는 이것과 아무 관련이 없으며 다른 문제가 있습니다. 다른 통화 쌍에 대해 다르게 그려집니다(데이터는 항상 USDCHF에서 가져오고 항상 막대 시작 부분인 00분에). 막대 번호는 항상 1입니다. 따라서 버그가 있습니다. 있다. 그리고 그것이 나을 때까지는 위험없이 그러한 것들을 테스트하고 사용할 수 없습니다.

사실, 내 지표는 더 단순화 될 수 있습니다. USDCHF에 대한 별도의 Open[0] 창을 구축하고 이 지표를 EURUSD 및 AUDUSD에 연결합니다. 얼마 후(시간별 차트에서 - 몇 시간), 차이가 나타나기 시작합니다.


나는 당신의 창작물을 보고 있을 뿐입니다 :) 당신의 스타일은 변하지 않았고 당신은 명확하게 쓰기도 했습니다 ... 당신 자신을 위해 :)
 
Quark의 변형, 재작업:
//+------------------------------------------------------------------+
//|                                                     QuarkBug.mq4 |
//|                                                            Quark |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Quark"
#property link      "http://www.metaquotes.ru/forum/7790/"


#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;

////////////////////////
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexBuffer(0,arrOpen);
	SetIndexLabel(0,"arrOpen");

	SetIndexStyle(1, DRAW_LINE);
	SetIndexBuffer(1,arrMa);
	SetIndexLabel(1,"arrMa");

	SetIndexStyle(2, DRAW_LINE);
	SetIndexBuffer(2,arrMyMa);
	SetIndexLabel(2, "arrMyMa");

	IndicatorDigits(MarketInfo("USDCHF",MODE_DIGITS));		
	// indicator buffers mapping
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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.0);
	
	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--;
		if (nPos<2) Print("nPos=",nPos);
   	}

   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
여기에 칩이 다른 칩에 약간 묻혀 있습니다. :)
나는 GBPUSD M5와 GBPJPY M5의 두 쌍에 전화를 끊고 살펴보기 시작했습니다. 차이가 없는 것 같습니다. 그러다 문득 깨달았습니다. Quark는 경험이 있는 사용자로서 오류를 더 깊이 숨겼습니다. :) 지수 이동 평균 공식을 확인했습니다. 맞습니다. 하지만... 코드는 GBPJPY에서 새 막대 가 열리면(지표가 정지된) USDCHF에서 새 막대가 열립니다(Open[] 판독값을 가져온 곳에서).
진짜야 ? 그렇기 때문에 불일치가 누적되는 데 시간이 걸리기 때문에 며칠에 걸쳐 점진적으로 오류가 발생합니다. 모든 것이 명확하게 설명된 것 같습니까?
 
다음은 시각적 결과입니다.

 
3개의 그래프가 있는 옵션이 더욱 명확해집니다.

 
로쉬, 모자를 벗겠습니다. 그리고 약속대로 사과드립니다. 특히 개발자들에게.
속담에 "나는 화를 냈고, 틀렸다. 나는 내 말을 되돌렸다." ;에 대한)
실제로, 역사의 "구멍"의 잘못입니다. 그건 그렇고, 귀하의 예에서 2001년 12월 25일에 "구멍"이 하나만 있다는 것이 흥미 롭습니다. 2005년 3월 14일에 모든 막대가 표시됩니다.
무려 8시간의 인용문이 어디에서 사라졌는지 두고 볼 일이지만 그건 또 다른 이야기다.
어쨌든 많은 도움을 주셔서 감사합니다. :에 대한)
 
여기에 칩이 다른 칩에 약간 묻혀 있습니다. :)
나는 GBPUSD M5와 GBPJPY M5의 두 쌍에 전화를 끊고 살펴보기 시작했습니다. 차이가 없는 것 같습니다. 그러다 문득 깨달았습니다. Quark는 경험이 있는 사용자로서 오류를 더 깊이 숨겼습니다. :) 지수 이동 평균 공식을 확인했습니다. 맞습니다. 하지만... 코드는 GBPJPY에서 새 막대가 열리면(지표가 정지된) USDCHF에서 새 막대가 열립니다(Open[] 판독값을 가져온 곳에서).
진짜야 ? 그렇기 때문에 불일치가 누적되는 데 시간이 걸리기 때문에 며칠에 걸쳐 점진적으로 오류가 발생합니다. 모든 것이 명확하게 설명된 것 같습니까?


내 스타일은... 글쎄, 나는 모른다. 나는 최고를 원했다. 그리고 무엇이 잘못되었나요? 나는 비판을 받아들인다. 건설적인 :)
MA가 없는 새 버전이 있습니다. iOpen(USDCHF)과 iClose를 그립니다.

이제 막대 가 열리는 시간이 다르기 때문에 오류가 누적된다는 사실에 대해 알아보겠습니다. 형식적으로 Open[0]은 무엇이든 동일합니다(hh:00에 형성됨). 그러나 실제로 차트의 막대가 이미 도착했지만(첫 번째 눈금, 즉) USDCHF(지표 통화)에 아직 도착하지 않은 경우 어떻게 합니까? 흠... 잘 짜여진 코드가 서버를 요청한다고 생각할 수도 있겠지만, 그렇지 않다면 예, 이전(1시간 전) Open(매우 잘못된 !!!) 또는 마지막 틱 값(매우 좋지도 않음)이 잘 사용됩니다. 그래서 아마도 Roche가 옳을 것입니다.

그러나 오류 누적은 없을 것입니다(MA를 구축하지 않고 단순히 시가를 도출함).

이 문제를 조사하기 위해 두 개의 차트에 새로운 지표를 두었습니다. 이 지표도 iClose를 그립니다.

이 경우에도 불일치가 발생할 수 있습니다. 예를 들어, 통화 중 하나에 대한 마지막 틱이 매우 지연되고 차트의 Open이 지표 통화의 Close보다 이른 경우입니다.

이 문제를 조사하기 위해 표시기에 세 번째 버퍼를 추가하여 이전 막대의 열기를 그립니다. 이 데이터가 시계에서 항상 동기화된다는 데 모두가 동의할 것이라고 생각합니다. Open[0]이 한 통화에 대해 도착했지만 Open[1]이 다른 통화에 대해 아직 도착하지 않았다고 상상하기 어렵습니다.

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

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

// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrClose1[];
double arrOpen1[];

int nExtCountedBars = 0;

////////////////////////
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, arrClose1);
	SetIndexBuffer(2, arrOpen1);	
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	while(nPos > 0)
	{
		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrClose1[nPos - 1] = iClose("USDCHF", 0, nPos);
		arrOpen1[nPos - 1] = iOpen("USDCHF", 0, nPos);		

		nPos--;
	}

	return(0);
}



위의 추론이 맞다면 다른 통화의 데이터를 사용할 때 매우 조심해야 합니다. 개발자가 (도움말이나 다른 곳에서) 몇 가지 권장 사항을 작성하면 좋을 것입니다.

12시간 안에 나는 시험에서 나온 것을 쓸 것이다.

 
쿼크, 내 말 못 들었어.
 

쿼크, 내 말 못 들었어.


이해가 안되요, 설명 부탁드립니다.