量化交易軟件下載:赫茲量化里快速開發(fā)并調(diào)試交易策略
創(chuàng)建瞬時(shí)報(bào)價(jià)指標(biāo)
在 MetaEditor 里運(yùn)行 MQL 向?qū)? 設(shè)置名稱和兩個(gè)輸入?yún)?shù):
ticks — 計(jì)算標(biāo)準(zhǔn)差時(shí)所用的瞬時(shí)報(bào)價(jià)數(shù)量
gap — 獲取標(biāo)準(zhǔn)差的間隔系數(shù)。
接下來, 勾選 "指標(biāo)位于單獨(dú)窗口" 并指定 2 塊圖形作圖板, 它們將在子窗口里顯示信息: 一條瞬時(shí)報(bào)價(jià)線和有關(guān)價(jià)格尖峰出現(xiàn)的彩色信號(hào)箭頭。

編輯
在結(jié)果草案里用黃色標(biāo)記變化
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TickSpikeHunter.mq5 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 版權(quán)所有 2016, MetaQuotes 軟件公司| //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "版權(quán)所有 2016, MetaQuotes 軟件公司" #property link ? ? ?"https://www.mql5.com" #property version ? "1.00" #property indicator_separate_window #property indicator_buffers 3 #property indicator_plots ? 2 //--- 繪制瞬時(shí)報(bào)價(jià) #property indicator_label1 ?"瞬時(shí)報(bào)價(jià)" #property indicator_type1 ? DRAW_LINE #property indicator_color1 ?clrGreen #property indicator_style1 ?STYLE_SOLID #property indicator_width1 ?1 //--- 繪制信號(hào) #property indicator_label2 ?"信號(hào)" #property indicator_type2 ? DRAW_COLOR_ARROW #property indicator_color2 ?clrRed,clrBlue,C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0' #property indicator_style2 ?STYLE_SOLID #property indicator_width2 ?1 //--- 輸入?yún)?shù) input int ? ? ?ticks=50; ? ? ? ? // 計(jì)算所用瞬時(shí)報(bào)價(jià)數(shù)量 input double ? gap=3.0; ? ? ? ? ?// 通道寬度的標(biāo)準(zhǔn)差 //--- 指標(biāo)緩存區(qū) double ? ? ? ? TickPriceBuffer[]; double ? ? ? ? SignalBuffer[]; double ? ? ? ? SignalColors[]; //--- 價(jià)格變化計(jì)數(shù)器 int ticks_counter; //--- 第一次指標(biāo)調(diào)用 bool first; //+------------------------------------------------------------------+ //| 自定義指標(biāo)初始化函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ int OnInit() ?{ //--- 指標(biāo)緩存區(qū)映射 ? SetIndexBuffer(0,TickPriceBuffer,INDICATOR_DATA); ? SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA); ? SetIndexBuffer(2,SignalColors,INDICATOR_COLOR_INDEX); //--- 設(shè)置空值, 在繪圖時(shí)應(yīng)被忽略 ? ? PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); ? PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); //--- 信號(hào)將作為圖標(biāo)輸出 ? PlotIndexSetInteger(1,PLOT_ARROW,159); //--- 初始化全局變量 ? ticks_counter=0; ? first=true; //--- 程序初始化成功 ? return(INIT_SUCCEEDED); ?} //+------------------------------------------------------------------+ //| 自定義指標(biāo)迭代函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ 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 &tick_volume[], ? ? ? ? ? ? ? ?const long &volume[], ? ? ? ? ? ? ? ?const int &spread[]) ?{ //--- ? //--- 返回 prev_calculated 的數(shù)值用于下次調(diào)用 ? return(rates_total); ?} //+------------------------------------------------------------------+
現(xiàn)在, 將其它部分代碼加入接收瞬時(shí)報(bào)價(jià)的 OnCalculate() 預(yù)定義處理器。在首次調(diào)用函數(shù)期間要明確將指標(biāo)緩存區(qū)清零, 并且出于便利, 將它們標(biāo)記為序列 — 因此, 它們將會(huì)從右至左索引。這樣就可以使用索引 0 來調(diào)用最近的指標(biāo)緩存區(qū)數(shù)值, 即最后的瞬時(shí)報(bào)價(jià)值將會(huì)保存在 TickPriceBuffer[0]。
另外, 主要的瞬時(shí)報(bào)價(jià)處理將移至單獨(dú)的 ApplyTick() 函數(shù):
//+------------------------------------------------------------------+ //| 自定義指標(biāo)迭代函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ 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 &tick_volume[], ? ? ? ? ? ? ? ?const long &volume[], ? ? ? ? ? ? ? ?const int &spread[]) ?{ //--- 在首次調(diào)用期間將指標(biāo)緩存區(qū)清零并標(biāo)記為序列 ? if(first) ? ? { ? ? ?ZeroMemory(TickPriceBuffer); ? ? ?ZeroMemory(SignalBuffer); ? ? ?ZeroMemory(SignalColors); ? ? ?//--- 序列數(shù)組向后定位, 在這種情況下最方便 ? ? ?ArraySetAsSeries(SignalBuffer,true); ? ? ?ArraySetAsSeries(TickPriceBuffer,true); ? ? ?ArraySetAsSeries(SignalColors,true); ? ? ?first=false; ? ? } //--- 使用當(dāng)前的收盤價(jià)作為價(jià)格 ? double lastprice=close[rates_total-1]; //--- 瞬時(shí)報(bào)價(jià)計(jì)數(shù) ? ticks_counter++; ? ApplyTick(lastprice); // 執(zhí)行計(jì)算和緩存區(qū)移位 //--- 返回 prev_calculated 的數(shù)值用于下次調(diào)用 ? return(rates_total); ?} //+------------------------------------------------------------------+ //| 應(yīng)用瞬時(shí)報(bào)價(jià)進(jìn)行計(jì)算 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ void ApplyTick(double price) ?{ ? int size=ArraySize(TickPriceBuffer); ? ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,size-1); ? ArrayCopy(SignalBuffer,SignalBuffer,1,0,size-1); ? ArrayCopy(SignalColors,SignalColors,1,0,size-1); //--- 保存最后的價(jià)格值 ? TickPriceBuffer[0]=price; //--- ?}
目前, ApplyTick() 執(zhí)行最簡(jiǎn)單地操作 — 將所有緩存區(qū)數(shù)值向后挪一位并將最后的瞬時(shí)報(bào)價(jià)寫入 TickPriceBuffer[0]。在調(diào)試模式里運(yùn)行指標(biāo)并觀察一段時(shí)間。

編輯切換為居中
正如可以看到的那樣, 供給價(jià)用作當(dāng)前蠟燭的基準(zhǔn)收盤價(jià)一般保持不變, 所以圖表上繪出了一片 "高地"。稍微調(diào)整代碼, 以便僅得到 "鋸齒" - 這更加直觀。
//--- 只在價(jià)格變化時(shí)計(jì)算 ? if(lastprice!=TickPriceBuffer[0]) ? ? { ? ? ?ticks_counter++; ? ? ?// 瞬時(shí)報(bào)價(jià)計(jì)數(shù) ? ? ?ApplyTick(lastprice); // 執(zhí)行計(jì)算和緩存區(qū)移位 ? ? }
如此, 指標(biāo)的第一個(gè)版本已經(jīng)創(chuàng)建, 現(xiàn)在價(jià)格沒有零增量。
