其實在Mql5中,已經提供了很多現成的指標了,但是創建自行訂義的指標,仍是有其必要性。
在上一篇中,我們提到了OnCalculate函數,而在自訂義指標中所有必要的運算,都在預定義的OnCalculate函數中。
以下我們將試著,利用OnCalculate函數提供的資料,簡略的自行計算及定義指標值,並傳遞至另一函數中計算ATR指標。
ATR的公式如下:
寫成程式碼如下
TR = MathMax(TXHigh[i],TXClose[i-1])-MathMin(TXLow[i],TXClose[i-1]);
完成設計後,利用Alert()函數,設定ATR指標值達到條件後提出警式
範例程式碼:
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
double TR,AvgTR;
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
//將陣列資料傳遞給CaleATR函數
CaleATR(rates_total,prev_calculated,Open,High,Low,Close);
return(rates_total);
}
void CaleATR(const int TXrates_total,
const int TXprev_calculated,
const double &TXOpen[],
const double &TXHigh[],
const double &TXLow[],
const double &TXClose[])
{
//rates_total的數量應等於所有的價格數組元素。
//prev_calculated first value為0
for(int i=TXrates_total-1; i>=TXrates_total-3; i--)
{
//先求出TR值(True Range),公式為TR=MAX(H,前日收)-MIN(L,前日收)
TR+=TR;
TR = MathMax(TXHigh[i],TXClose[i-1])-MathMin(TXLow[i],TXClose[i-1]);
}
AvgTR=TR/3;
if (AvgTR>=0.000125){Alert("ATR波動幅度大於0.0003,現在波動",AvgTR);}
}
留言列表