OnCalculate()函數只在自定義指標中調用,需要通過計算得出指標值。通常在收到指數計算的交易品種的新訂單號時發生。該指標不需要附在交易品種的價格圖表上。
OnCalculate()函數的返回值是int。有兩種可能的定義。壹個指標中不能有兩個函數版本。
壹個是在單個數據緩沖區中用於計算的索引。例如,自定義移動平均指標。
int on calculate(const int rates _ total,//price[]數組的大小。
Const int prev_calculated,//上壹次調用處理的列。
Const int begin,//有效數據開始位置
const double & amp價格[] //計算數組
);
在price []數組中,可以傳輸時間序列和壹些計算出來的索引緩沖區。ArrayGetAsSeries()函數決定了price []數組的索引方向。為了不依賴默認值,您需要無條件地為工作數組調用ArraySetAsSeries()函數。
在price []數組中,當指標在Parameters選項卡中啟動時,選擇適當的時間序列或指標。因此,您需要在“應用於”字段的下拉列表中指定必要的項目。
選擇時間序列以計算指標
要從其他mql5程序接收自定義指標值,您應該使用iCustom()函數返回到嵌入式指標處理程序。您可以指定適當的price []數組或另壹個指示器處理程序。該參數最終在自定義指標輸入變量列表中傳輸。
示例:
void OnStart()
{
// -
string TERMINAL _ PATH = TERMINAL info string(STATUS _ TERMINAL _ PATH);
int handle _ customMA = iCustom(Symbol(),PERIOD_CURRENT,“自定義移動平均線”,13,0,MODE_EMA,PRICE _ TYPICAL);
if(handle _ customMA & gt;0)
Print("handle_customMA = ",handle _ customMA);
其他
Print("無法打開或不是EX5文件' "+terminal _ path+" \ \ MQL5 \ \ Indicators \ \ "+" Custom Moving average . EX5 ' ");
}
在本例中,最後傳遞的參數是PRICE_TYPICAL value(從ENUM_APPLIED_PRICE count開始),表示可以用獲得的典型價格(高價+低價+平倉)/3建立自定義指標。如果未確定該參數,則根據PRICE_CLOSE的值建立指標,如每列的收盤價。
另壹個例子顯示了根據指定的price []數組的最後壹個參數傳遞指示器處理程序,該數組由函數iCustom()描述。
另壹種形式旨在為所有其他指標計算更多的時間序列。
int on calculate(const int rates _ total,//輸入時間序列大小。
Const int prev_calculated,//上壹次調用處理的列。
常數日期時間和時間。時間[],//時間
const double & ampOpen[],//開盤價
const double & amp高[],//最高價
const double & amp低[],//最低價格
const double & amp收盤[],//收盤價
const long & ampTick_volume[],//訂單交易量
const long & amp成交量[],//實際交易量
const int & amp展開[] //展開
);
開盤價[]、最高價[]、最低價[]和收盤價[]參數由當前明細表的開盤價、最高價、最低價和收盤價數組組成。時間參數[]包括開始時間值的數組,擴展參數[]具有包括擴展歷史的數組(如果為交易安全提供了擴展)。volume[]和tick_volume[]參數分別包括交易和交易量歷史。
確定時間[],開盤價[],最高價[],最低價[],收盤價[],成交量[],成交量[],漲幅[],的指標方向,需要調用ArrayGetAsSeries()函數。如果不想依賴默認值,需要無條件調用工作數組的函數ArraySetAsSeries()。
首先,rates_total參數包括列數,可用於計算指標,與圖表中現有的列數壹致。
要註意OnCalculate()的返回值和第二個輸入參數prev_calculated之間的聯系。調用函數時,prev_calculated參數包括OnCalculate()在最後壹次調用中返回的值。這使得用戶定義的指數可以通過經濟算法來計算,並避免重復計算。
返回rates_total參數的值就足夠了,包括當前調用的函數的列數。如果自從最後壹次調用OnCalculate()函數以來,價格數據已經改變(下載深度歷史或填充歷史空白期),則終端將輸入參數prev_calculated的值設置為零。
註意:如果OnCalculate返回零,則指標值不能顯示在客戶端的數據窗口中。
為了更好地理解,使用下面的代碼啟動指示器是很有用的。
指標示例:
#屬性指示器_圖表_窗口
#屬性指示器_緩沖區1
#房產指標_地塊1
//-圖表的線條
#房產指標_label1 "行"
# property indicator _ type 1 DRAW _ LINE
# property indicator _ color 1 clr dark blue
#屬性indicator _ STYLE 1 STYLE _ SOLID
#房產指標_width1 1
//-指示器緩沖器
雙線緩沖區[];
//+ - +
//|用戶自定義指示器初始化函數|
//+ - +
int OnInit()
{
//-指示器緩沖器的圖紙
SetIndexBuffer(0,LineBuffer,INDICATOR _ DATA);
// -
返回(INIT _ successed);
}
//+ - +
//|自定義指示器重復功能|
//+ - +
int OnCalculate(const int rates _ total,
const int prev_calculated,
常數日期時間和時間。時間[],
const double & amp打開[],
const double & amp高[],
const double & amp低[],
const double & amp關閉[],
const long & amptick_volume[],
const long & amp卷[],
const int & amp傳播[])
{
//-獲取當前交易品種和圖表周期的有效列數。
int bars=Bars(Symbol(),0);
Print("Bars = ",Bars,",rates_total = ",rates_total,",prev_calculated = ",prev _ calculated);
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates _ total-1]);
//-返回下壹次調用的prev_calculated值。
return(rates _ total);
}
//+ - +