[英]MQL4 TEMA indicator. Indicator line gets messed up when I limit the amount of bars the indicator is processing
我有這個運行良好的 TEMA 指標。 我添加了一段代碼以限制要處理的柱線數量,但指標線以異常方式在后面弄亂了,當我將要處理的柱線數量限制為 500 等小值時,指標不會根本不能正確顯示它只是上下拋出線。
這是我使用的修改后的代碼。
有人可以幫我解釋一下。
如果我限制一個簡單的移動平均代碼的條形,我就不會遇到上面提到的這些問題。
我認為它與代碼中的 IMAOnArray() 部分有關。 我還附上了一張圖片來顯示問題。
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkBlue
#property indicator_width1 2
//---- input parameters
extern int EMA_period=14;
//code added to limit amount of bars.
extern int BarsBack=1500;
//---- buffers
double TemaBuffer[];
double Ema[];
double EmaOfEma[];
double EmaOfEmaOfEma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(4);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,TemaBuffer);
SetIndexBuffer(1,Ema);
SetIndexBuffer(2,EmaOfEma);
SetIndexBuffer(3,EmaOfEmaOfEma);
SetIndexDrawBegin(0, Bars - BarsBack);
IndicatorShortName("TEMA("+EMA_period+")");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,limit,limit2,limit3,counted_bars=IndicatorCounted();
//---++
//coded added to limit bars
if(Bars>BarsBack)
{
limit=BarsBack;
}
else
{
limit=Bars-counted_bars-1;
}
limit2=limit;
limit3=limit2;
for (i=limit;i>=0;i--) Ema[i]=iMA(NULL,0,EMA_period,0,MODE_EMA,PRICE_CLOSE,i);
for (i=limit2;i>=0;i--) EmaOfEma[i]=iMAOnArray(Ema,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) EmaOfEmaOfEma[i]=iMAOnArray(EmaOfEma,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) TemaBuffer[i]=3*Ema[i]-3*EmaOfEma[i]+EmaOfEmaOfEma[i];
//----
return(0);
}
//+------------------------------------------------------------------+
問:有人可以幫我解釋一下嗎?
三重指數移動平均線由帕特里克·穆洛伊 (Patrick Mulloy) 創建,並首次發表於 1994 年 2 月發行的《股票和商品技術分析》雜志 – 用更少的滯后平滑數據。
您不應通過減少輸入數據窗口的深度來“限制” TEMA
-三重“自”卷積的深度,因為它會導致處理損壞的值,您應該說CustomIndicator
-code,它需要多長時間采取“穩定”最左邊緣的 TEMA 值,在它的左邊緣計算值開始有意義之前:
SetIndexDrawBegin
設置繪制給定指標線必須從其開始的柱線編號(從數據開始)。
void SetIndexDrawBegin(
int index, // line index
int begin // position
);
參數 :
index [in] Line index. Must lie between 0 and 7.
begin [in] First drawing bar position number.
返回值:無。
筆記:
指標從左到右繪制。 給定柱線左側的指標數組值不會顯示在圖表或數據窗口中。 0 將被設置為默認值,並且將繪制所有數據。
您修改后的 TEMA 代碼簡單地忽略所有( Bars - BarsBack )
蠟燭並開始綠地計算,但BarsBack
(它產生所有三重自卷積偽影發生在“靠近”熱端當前條 [0] )。
刪除這部分代碼並檢查您所有的IndicatorBuffer{ 0 | 1 | 2 | 3 }
IndicatorBuffer{ 0 | 1 | 2 | 3 }
IndicatorBuffer{ 0 | 1 | 2 | 3 }
最左邊緣的行,它們“合並”它們的值有多快,並且只有在目視檢查之后,才設置:
SetIndexDrawBegin( { 0 | 1 | ... | 3 }, <_N_bars_To_Converge_STABLE_> );
或者可以保持計算避免代碼就位,
但需要增加BarsBack >> <_N_bars_To_Converge_STABLE_>
雖然 MQL4(截至 2020 年第一季度)缺乏對向量化數學的支持,但這里仍有性能改進的空間:
/*
for ( i = limit; i >= 0; i-- ) Ema[i] = iMA( NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i );
for ( i = limit2; i >= 0; i-- ) EmaOfEma[i] = iMAOnArray( Ema, 0, EMA_period, 0, MODE_EMA, i );
for ( i = limit3; i >= 0; i-- ) EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA, i );
for ( i = limit3; i >= 0; i-- ) TemaBuffer[i] = EmaOfEmaOfEma[i]
+ 3*Ema[i]
- 3*EmaOfEma[i];
*/
////////////////////////////////////////////////////////////////////
// 25% MORE EFFICIENT PROCESSING:
// PROGRESSIVE BUILDUP, AVOIDS DOUBLE limit3-DEEP RE-ITERATIONS:
////////////////////////////////////////////////////////////////////
for ( i = limit; i >= 0; i-- ) { Ema[i] = iMA( NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i ); TemaBuffer[i] = Ema[i]; }
for ( i = limit2; i >= 0; i-- ) { EmaOfEma[i] = iMAOnArray( Ema, 0, EMA_period, 0, MODE_EMA, i ); TemaBuffer[i] -= EmaOfEma[i]; TemaBuffer[i] *= 3; }
for ( i = limit3; i >= 0; i-- ) { EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA, i ); TemaBuffer[i] += EmaOfEmaOfEma[i]; }
最后但並非最不重要的一點是,這里存在更高效的TEMA
計算策略,可進一步減少納秒延遲:o)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.