最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

股票量化交易軟件:使用 OpenCL 測試燭形形態(tài)

2023-07-13 16:02 作者:bili_45793681098  | 我要投稿


赫茲股票量化需要依賴一些東西來確保使用OpenCL實(shí)現(xiàn)的測試器是正確工作的。首先,我們需要開發(fā)一個 MQL5 EA,然后我們將會比較使用常規(guī)測試器優(yōu)化和測試與使用OpenCL的測試器的結(jié)果。 測試的目標(biāo)是一個根據(jù)以下燭形形態(tài)來進(jìn)行交易的簡單EA:

  • 看跌針桿(pin bar)

  • 看漲針桿 (pin bar)

  • 看跌吞噬

  • 看漲吞噬

策略非常簡單:

  • 看跌針桿或者看跌吞噬 ?— 賣出

  • 看漲針桿或者看漲吞噬 — 買入

  • 同時開啟的倉位數(shù)量 — 沒有限制

  • 最大倉位持有時間 — 有限,由用戶定義

  • 獲利和止損水平 — 固定, 由用戶定義

只在完全關(guān)閉的柱上檢查是否有形態(tài)的出現(xiàn),換句話說, 赫茲股票量化在新柱出現(xiàn)的時候就檢查前面三個柱是否形成形態(tài), 形態(tài)的偵測條件如下:

編輯切換為居中

圖 1. "看跌針桿" (a) 和 "看漲針桿" (b) 形態(tài)

對于看跌針桿 (圖 1, a):

  • 第一個柱的上影線 ("tail") 大于指定的參考數(shù)值: tail>=Reference

  • 第零柱是上漲的: Close[0]>Open[0]

  • 第二個柱是下跌的: Open[2]>Close[2]

  • 第一個柱的最高價(jià)是局部的最大值: High[1]>MathMax(High[0],High[2])

  • 第一個柱的主體部分小于上影線: MathAbs(Open[1]-Close[1])<tail

  • tail = High[1]-max(Open[1],Close[1])

對于看漲針桿 (圖 1, b):


  • 第一個柱的下影線 ("tail") 大于指定的參考值: tail>=Reference

  • 第零柱是下跌的: Open[0]>Close[0]

  • 第二個柱是上漲的: Close[2]>Open[2]

  • 第一個柱的最低價(jià)是局部的最小值: Low[1]<MathMin(Low[0],Low[2])

  • 第一個柱的主體部分小于它的下影線: MathAbs(Open[1]-Close[1])<tail

  • tail = min(Open[1],Close[1])-Low[1]



編輯切換為居中

圖 2. "看跌吞噬" (a) 和 "看漲吞噬" (b)

對于看跌吞噬 (圖 2, a):

  • 第一個柱是上漲的,它的主體大于指定的參考值: (Close[1]-Open[1])>=Reference

  • 第零柱的最高價(jià)低于第一柱的收盤價(jià): High[0]<Close[1]

  • 第二柱的開盤價(jià)高于第一個柱的收盤價(jià): Open[2]>Close[1]

  • 第二個柱的收盤價(jià)低于第一個柱的開盤價(jià): Close[2]<Open[1]

對于看漲吞噬 (圖 2, b):

  • 第一個柱是下跌的,它的主體大于指定的參考值: (Open[1]-Close[1])>=Reference

  • 第零柱的最低價(jià)高于第一個柱的收盤價(jià): Low[0]>Close[1]

  • 第二個柱的開盤價(jià)低于第一個柱的收盤價(jià): Open[2]<Close[1]

  • 第二個柱的收盤價(jià)高于第一個柱的開盤價(jià): Close[2]>Open[1]

1.1搜索形態(tài)下面提供的是形態(tài)定義的代碼。

ENUM_PATTERN Check(MqlRates &r[],uint flags,double ref) ?{ //--- 看跌針桿 ? ? if((flags&PAT_PINBAR_BEARISH)!=0) ? ? {// ? ? ?double tail=H(1)-MathMax(O(1),C(1)); ? ? ?if(tail>=ref && C(0)>O(0) && O(2)>C(2) && H(1)>MathMax(H(0),H(2)) && MathAbs(O(1)-C(1))<tail) ? ? ? ? return PAT_PINBAR_BEARISH; ? ? } //--- 看漲針桿 ? if((flags&PAT_PINBAR_BULLISH)!=0) ? ? {// ? ? ?double tail=MathMin(O(1),C(1))-L(1); ? ? ?if(tail>=ref && O(0)>C(0) && C(2)>O(2) && L(1)<MathMin(L(0),L(2)) && MathAbs(O(1)-C(1))<tail) ? ? ? ? return PAT_PINBAR_BULLISH; ? ? } //--- 看跌吞噬 ? if((flags&PAT_ENGULFING_BEARISH)!=0) ? ? {// ? ? ?if((C(1)-O(1))>=ref && H(0)<C(1) && O(2)>C(1) && C(2)<O(1)) ? ? ? ? return PAT_ENGULFING_BEARISH; ? ? } //--- 看漲吞噬 ? if((flags&PAT_ENGULFING_BULLISH)!=0) ? ? {// ? ? ?if((O(1)-C(1))>=ref && L(0)>C(1) && O(2)<C(1) && C(2)>O(1)) ? ? ? ? return PAT_ENGULFING_BULLISH; ? ? } //--- 沒有找到 ? ? return PAT_NONE; ?}

這里赫茲股票量化應(yīng)當(dāng)注意 ENUM_PATTERN 枚舉,它的值是標(biāo)志,可以組合并使用 bitwise OR(位或) 作為一個參數(shù)來傳遞:

enum ENUM_PATTERN ?{ ? PAT_NONE=0, ? PAT_PINBAR_BEARISH = (1<<0), ? PAT_PINBAR_BULLISH = (1<<1), ? PAT_ENGULFING_BEARISH = (1<<2), ? PAT_ENGULFING_BULLISH = (1<<3) ?};

另外, 引入了下面的宏定義來更方便地記錄:

#define O(i) (r[i].open) #define H(i) (r[i].high) #define L(i) (r[i].low) #define C(i) (r[i].close)

Check() 函數(shù)是從 IsPattern() 函數(shù)中調(diào)用的,意義是檢查在新柱開啟時是否存在指定的形態(tài):

ENUM_PATTERN IsPattern(uint flags,uint ref) ?{ ? MqlRates r[]; ? if(CopyRates(_Symbol,_Period,1,PBARS,r)<PBARS) ? ? ?return 0; ? ArraySetAsSeries(r,false); ? return Check(r,flags,double(ref)*_Point); ?}


1.2構(gòu)建 EA 交易

首先,需要定義輸入?yún)?shù),赫茲股票量化在形態(tài)定義條件中有一個參考值,這是針桿的“tail”的最小長度,或者是吞噬中的主體相交區(qū)域的最小長度,我們將以點(diǎn)數(shù)指定它: input int ? ? ?inp_ref=50; 另外,赫茲股票量化還有一系列形態(tài)的參數(shù),為了更加方便,我們將不會在輸入?yún)?shù)中使用標(biāo)志,而是把它分成了四個 bool 類型的參數(shù): input bool ? ? inp_bullish_pin_bar = true; input bool ? ? inp_bearish_pin_bar = true; input bool ? ? inp_bullish_engulfing = true; input bool ? ? inp_bearish_engulfing = true; 然后再在初始化函數(shù)中把它們組合成一個無符號整型變量: ? p_flags = 0; ? ?if(inp_bullish_pin_bar==true) ? ? ? p_flags|=PAT_PINBAR_BULLISH; ? ?if(inp_bearish_pin_bar==true) ? ? ? p_flags|=PAT_PINBAR_BEARISH; ? ?if(inp_bullish_engulfing==true) ? ? ? p_flags|=PAT_ENGULFING_BULLISH; ? ?if(inp_bearish_engulfing==true) ? ? ? p_flags|=PAT_ENGULFING_BEARISH; 下面, 我們設(shè)置可以接收的倉位持有時間, 以小時表示, 獲利和止損水平, 以及交易量手?jǐn)?shù): input int ? ? ?inp_timeout=5; input bool ? ? inp_bullish_pin_bar = true; input bool ? ? inp_bearish_pin_bar = true; input bool ? ? inp_bullish_engulfing = true; input bool ? ? inp_bearish_engulfing = true; input double ? inp_lot_size=1; 對于交易, 我們將使用來自標(biāo)準(zhǔn)庫CTrade 類,為了定義測試器的速度, 赫茲股票量化將使用 CDuration 類, 它可以衡量程序中兩個控制點(diǎn)的時間間隔的毫秒數(shù), 并且以方便的形式顯示它們。在這種情況下,我們將測量在 OnInit()OnDeinit() 函數(shù)之間的時間。類的完整代碼包含在附加的 Duration.mqh 文件中。 CDuration time; ?int OnInit() ? { ? ?time.Start(); ? ?// ... ?return(INIT_SUCCEEDED); ? } ?void OnDeinit(const int reason) ? { ? ?time.Stop(); ? ?Print("測試結(jié)束 "+time.ToStr()); ? } 這個EA的工作非常簡單,包含以下內(nèi)容:OnTick() 函數(shù)的主要任務(wù)是處理開啟的倉位。如果倉位的持有時間超過了在輸入?yún)?shù)中指定的數(shù)值,就關(guān)閉該倉位。然后,檢查是否有新柱開啟,如果檢查通過,就使用 IsPattern () 函數(shù)來檢查形態(tài)是否存在。當(dāng)找到形態(tài)時,根據(jù)策略開啟一個買入或者賣出倉位。完整的 OnTick() 函數(shù)代碼在下面提供: void OnTick() ? { //--- 處理開啟的倉位 int total= PositionsTotal(); ? ?for(int i=0;i<total;i++) ? ? ?{ ? ? ? PositionSelect(_Symbol); ? ? ? datetime t0=datetime(PositionGetInteger(POSITION_TIME)); ? ? ? if(TimeCurrent()>=(t0+(inp_timeout*3600))) ? ? ? ? { ? ? ? ? ?trade.PositionClose(PositionGetInteger(POSITION_TICKET)); ? ? ? ? } ? ? ? else break; ? ? ?} ? ?if(IsNewBar()==false) ? ? ? return; //--- 檢查形態(tài)是否存在 ? ?ENUM_PATTERN pat=IsPattern(p_flags,inp_ref); ? ?if(pat==PAT_NONE) ? ? ? return; //--- 開啟倉位 double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); ? ?double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); ? ?if((pat&(PAT_ENGULFING_BULLISH|PAT_PINBAR_BULLISH))!=0)//買入 ? ? ? ? ? ?trade.Buy(inp_lot_size,_Symbol,ask,NormalizeDouble(ask-inp_sl*_Point,_Digits),NormalizeDouble(ask+inp_tp*_Point,_Digits),DoubleToString(ask,_Digits)); ? ?else//賣出 ? ? ? trade.Sell(inp_lot_size,_Symbol,bid,NormalizeDouble(bid+inp_sl*_Point,_Digits),NormalizeDouble(bid-inp_tp*_Point,_Digits),DoubleToString(bid,_Digits)); ? }

1.3測試

首先,運(yùn)行優(yōu)化以尋找對EA來說交易獲利或者至少開啟倉位的最佳輸入?yún)?shù)值。赫茲股票量化將優(yōu)化兩個參數(shù) — 形態(tài)使用的參考值和止損水平點(diǎn)數(shù)。把獲利水平設(shè)為50個點(diǎn),并在測試中選擇所有形態(tài)。

優(yōu)化是在 EURUSD M5 上進(jìn)行的,時間段為: 01.01.2018 ?— 01.10.2018. 快速優(yōu)化 (遺傳算法), 交易模式: "1 分鐘 OHLC".

優(yōu)化參數(shù)的數(shù)值在大范圍內(nèi)和大量的梯度中選擇:


編輯

圖 3. 優(yōu)化參數(shù)


在優(yōu)化結(jié)束之后,結(jié)果根據(jù)利潤排序:


編輯切換為居中

圖 4. 優(yōu)化結(jié)果


赫茲股票量化可以看到,獲得1000.50 利潤的最佳結(jié)果是在參考值為60個點(diǎn)而止損水平為350個點(diǎn)的時候取得的。在使用這些參數(shù)時運(yùn)行測試并注意它的執(zhí)行時間。



編輯

圖 5. 使用內(nèi)建測試器的單次通過測試時間


記住這些數(shù)值,在繼續(xù)不使用常規(guī)測試器來測試相同的策略。讓我們使用 OpenCL 的特性開發(fā)一個自定義的測試器。


股票量化交易軟件:使用 OpenCL 測試燭形形態(tài)的評論 (共 條)

分享到微博請遵守國家法律
全椒县| 班玛县| 南康市| 安义县| 亳州市| 安仁县| 右玉县| 西丰县| 洪洞县| 长沙县| 宜黄县| 措勤县| 苏尼特左旗| 从化市| 洪洞县| 普定县| 闽侯县| 珲春市| 霸州市| 沐川县| 岳阳县| 邹平县| 淄博市| 濉溪县| 连山| 木兰县| 沙田区| 陆良县| 四子王旗| 和平县| 句容市| 上饶市| 遂平县| 陇南市| 长岭县| 上蔡县| 潜江市| 南丰县| 尼勒克县| 营口市| 乡宁县|