标准指标超标? - 页 2

 
罗氏()是对的。我只是想写一写,但他比我先写了(和往常一样)。但是。我的指标与此无关,它有另一个问题。它在不同的货币对上以不同的方式实时绘制(数据总是取自美元兑瑞郎,并且总是在条形图的开头,即00分钟)。酒吧号码总是1。所以,有一个错误。是的,有。而在它被修复之前,你不能毫无风险地测试和使用这种东西。

事实上,我的指标还可以进一步简化。我们只需在一个单独的窗口中为USDCHF创建Open[0],并将该指标与EURUSD和AUDUSD连接起来。一段时间后(在小时图上--几个小时),分歧将开始出现。
 
罗氏()是对的。我只是想写一写,但他比我先写了(和往常一样)。但是。我的指标与此无关,它有另一个问题。它在不同的货币对上以不同的方式实时绘制(数据总是取自美元兑瑞郎,并且总是在条形图的开头,即00分钟)。酒吧号码总是1。所以,有一个错误。是的,有。而在它被修复之前,我们不能毫无风险地测试和使用这种东西。<br / translate="no">。
事实上,我的指标还可以进一步简化。我们只需在一个单独的窗口中为USDCHF创建Open[0],并将该指标与EURUSD和AUDUSD连接起来。一段时间后(在小时图上--几个小时),分歧将开始出现。


只是在看你的创作 :)你的风格没有改变,你写得很清楚...为自己:)
 
夸克的版本,经过重新加工。
//+------------------------------------------------------------------+
//|                                                     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[]是从那里读取的)。
真的是这样吗? 这就是为什么错误会在几天内逐渐出现,因为差异需要时间来积累。我想我已经清楚地解释了一切?
 
下面是视觉上的结果

 
有三个图形的版本更加清晰

 
Rosh,我向你致敬。而且,正如承诺的那样,我向大家道歉。特别是对开发商而言。
俗话说:"我生气了,我错了,我把它全部收回来"。;о)
真的要责怪故事中的 "漏洞"。有趣的是,在你的例子中,我只有一个 "洞"--2001年12月25日,但2005年3月14日,所有条形都存在。
我还在猜测,为什么8个小时的报价消失了,但这是另一个故事。
无论如何,非常感谢您的帮助。:о)
 
这里的问题有点不同:)<br / translate="no">我有两个货币对 - GBPUSD M5 和 GBPJPY M5。然后我意识到--Quark作为一个有经验的用户,把错误隐藏得更深了:) 我检查了指数移动平均线的方程式 - 它是正确的。但是... 该代码假设,如果GBPJPY上有一个新的条形图打开(指标在那里徘徊),那么USDCHF上也会有一个新的条形图打开(Open[]是从那里读取的)。
真的是这样吗? 这就是为什么错误会在几天内逐渐出现,因为差异需要时间来积累。我想我已经清楚地解释了一切?


我的风格是...我不知道。我想做得更好。它有什么问题?接受批评。有建设性的 :)
这里有一个新的变体,完全没有MA。它绘制了iOpen(USDCHF)和iClose。

现在说说由于不同的酒吧开放时间 而导致的错误积累。从形式上看,Open[0]无论如何都是一样的(它是在hh:00形成的)。但在实践中,如果我们的图表上的一个柱子已经到了(第一个刻度,也就是),而USDCHF(指标货币)还没有到,怎么办?嗯...人们认为正确的代码会询问服务器,但如果没有这样做,那么是的,将使用前一个(一小时前)开放的值(非常错误!!!)或最后一个刻度值(这也不是很好)。因此,也许罗氏是对的。

然而,这样做不会有任何错误积累(我们又不是在建立MA,我们只是在画开盘价)。

为了调查这个问题,我在两个图表上放了一个新的指标,也画了iClose。

请允许我指出,即使在这种情况下,也可能存在分歧。例如,如果其中一种货币的最后一个刻度是非常延迟的,而图表上的开盘比指标货币的收盘早。

为了研究这个问题,我在指标中加入了第三个缓冲区,画出了前一个条形的开盘。我想大家都同意,这些数据将永远在手表上同步。很难想象,一种货币有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 / translate="no"> 夸克,你没有听到我的话。


我不明白,请解释。