標準のインジケーターが上書きされるのか!? - ページ 2

 
ロシュ(・∀・)さんの言うとおりです。書きたかっただけなのに、先を越されてしまいました(いつものことですが)。でも。私のインジケータは関係ない、別の問題がある。通貨ペアごとに異なる描画で(データは常にUSDCHFから取得し、常にバーの最初、00分に)、リアルタイムで表示されます。小節番号は常に1です。だから、バグがあるんです。はい、あります。そして、それが修正されるまでは、そのようなものをリスクなくテストして使うことはできません。

実は、私の指標はさらに単純化することができます。単純にUSDCHFのOpen[0]を別ウィンドウで作成し、このインディケータをEURUSDとAUDUSDに接続します。しばらくすると(1時間足チャートでは数時間後)ダイバージェンスが現れ始めるでしょう。
 
ロシュ(・∀・)さんの言うとおりです。書きたかっただけなのに、先を越されてしまいました(いつものことですが)。でも。私のインジケータは関係ない、別の問題がある。通貨ペアごとに異なる描画で(データは常にUSDCHFから取得し、常にバーの最初、00分に)、リアルタイムで表示されます。小節番号は常に1です。だから、バグがあるんです。はい、あります。そして、それが直るまでは、そのようなものをリスクなくテストして使うことはできない。<br /> translate="no">です。
実は、私の指標はさらに単純化することができます。単純にUSDCHFのOpen[0]を別ウィンドウで作成し、このインディケータをEURUSDとAUDUSDに接続します。しばらくすると(1時間足チャートでは数時間後)乖離が現れ始める。


あなたの作品を見ているだけでも楽しいです :)あなたのスタイルは変わっておらず、明確に書いている...。自分のために :)
 
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の2つのペアを持っています。そこで気づいたのですが、Quarkは経験豊富なユーザーであるため、エラーをより深く隠してしまったのです :) 指数移動平均の計算式を確認しましたが、正しいです。でも... このコードでは、新しいバーが GBPJPY(インジケータがホバリングしている場所)で開かれると、新しいバーがUSDCHF(Open[]が読み込まれる場所)で開かれると仮定しています。
本当にそうなのでしょうか? そのため、誤差が数日単位で徐々に現れてくるのですが、これは差が蓄積される時間が必要なためです。すべて明確に説明したつもりですが?
 
そして、これがビジュアル結果です。

 
3つのグラフを使ったバージョンはさらにわかりやすくなっています。

 
ロッシュ、脱帽です。そして、約束通り、謝罪します。特に開発者の方々へ。
諺にもあるように、「怒った、間違った、全部取り消す」。;о)
本当に「穴」を責める。ところで、あなたの例では、「穴」は2001.12.25の1つだけですが、2005.03.14はすべてのバーが存在しているのが興味深いです。
なぜ8時間分の引用が消えてしまったのか、まだ推測の域を出ませんが、それはまた別の話です。
いずれにせよ、どうもありがとうございました。:о)
 
問題はここで少し異なっている :)<br / translate="no"> 私は2つのペアを持っている - GBPUSD M5とGBPJPY M5。そこで気づいたのですが、Quarkは経験豊富なユーザーであるため、エラーをより深く隠してしまったのです :) 指数移動平均の計算式を確認しましたが、正しいです。でも... このコードでは、新しいバーがGBPJPY(インジケータがホバリングしている場所)で開かれると、新しいバーがUSDCHF(Open[]が読み込まれる場所)で開かれると仮定しています。
本当にそうなのでしょうか? そのため、誤差が数日単位で徐々に現れてくるのですが、これは差が蓄積される時間が必要なためです。すべて明確に説明したつもりですが?


私のスタイルは...どうだろう。もっとうまくやりたかったんです。どうしたんですか?批評を受け付けます。建設的である :)
ここでは、MAを一切使わない、新しいバリエーションをご紹介します。iOpen(USDCHF)とiCloseを描画しています。

さて、バーのオープン時間の 違いによる誤差の蓄積についてです。形式的には、Open[0]は何があっても同じです(hh:00で形成されます)。しかし、実際には、チャート上のバーがすでに到着していて(最初のティック、つまり)、USDCHF(指標通貨)がまだ到着していない場合はどうでしょうか。あの...適切に構築されたコードであれば、サーバーに問い合わせると思うのですが、それが行われていない場合、そう、前(1時間前)のOpen(非常に間違っている!!)か最後のティックの値(これもあまり良くない)が使用されます。だから、ロシュの言うことは正しいのかもしれない。

ただし、これで誤差が蓄積されることはありません(MAを構築しているわけではなく、建値を描画しているだけです)。

この問題を調べるために、2つのチャートにiCloseも描画する新しいインジケータを設置しました。

この場合でも、乖離がある可能性があることをお断りしておきます。例えば、ある通貨の最後のティックが非常に遅れていて、チャート上のOpenが、その通貨のCloseよりも早く来る場合です。

この問題を調査するために、私は前のバーのOpenを描画するインジケータに3つ目のバッファを追加しました。これらのデータは、常に時計上で同期されることは誰もが認めるところでしょう。一方の通貨が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時間後くらいに掲載します。

 
クオーク、聞いてなかったのか?
 
<br /> 翻訳="no"> クォーク、聞こえなかったのか。


意味がわからない、説明してくれ。