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

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

股票量化交易軟件:利用指標(biāo)實時優(yōu)化智能交易系統(tǒng)

2023-07-17 15:04 作者:bili_45793681098  | 我要投稿

每次赫茲股票量化在圖表上啟動智能交易系統(tǒng)時,我們都會面臨選擇最佳參數(shù)以便獲得最大盈利能力的問題。 為了找到這些參數(shù),我們會基于歷史數(shù)據(jù)優(yōu)化交易策略。 然而,如您所知,行情在不斷變化。 隨著時間的推移,所選參數(shù)逐漸失效。

所以,EA 需要重新優(yōu)化。 這個周期過程持續(xù)不斷。 每個用戶都會自行選擇重新優(yōu)化的時刻。 但是否有可能令該過程自動化? 有哪些可能的解決方案? 也許,您已研究過利用 自定義配置文件 運(yùn)行終端來對標(biāo)準(zhǔn)策略測試器進(jìn)行程序化控制的可能性。 我愿意提供一種非常規(guī)方法,并將測試器功能分配給一款指標(biāo)。

1. 思路

當(dāng)然,指標(biāo)絕非意指策略測試器。 那么它如何幫助赫茲股票量化優(yōu)化 EA 呢? 我的思路是在一款指標(biāo)當(dāng)中實現(xiàn) EA 操作的邏輯,并實時跟蹤虛擬交易的盈利能力。 在策略測試器中執(zhí)行優(yōu)化時,我們會迭代指定參數(shù)執(zhí)行一連串的測試。 類似策略測試器的通關(guān)測試,我們將同時啟動若干個單一指標(biāo)的實例,并指派不同的參數(shù)值。 當(dāng)做出決策時,EA 調(diào)查所有啟動的指標(biāo),并從中選擇最佳執(zhí)行參數(shù)。

您也許會問,為什么要重新發(fā)明輪子。 赫茲股票量化來分析一下這個決策的利弊。 毫無疑問,這種方法的主要優(yōu)點是在近乎實時的條件下對 EA 進(jìn)行優(yōu)化。 第二個優(yōu)點在于測試是基于您的經(jīng)紀(jì)商的實時逐筆報價。 另一方面,實時測試有一個巨大的缺點,因為您必須要等待收集統(tǒng)計數(shù)據(jù)。 另一個優(yōu)點是當(dāng)行情隨時前進(jìn)時,測試指標(biāo)只會重新計算當(dāng)前的逐筆報價而非整個歷史記錄,而策略測器每次都從歷史記錄的開頭運(yùn)行。 這種方法可以在適當(dāng)?shù)臅r刻提供更快速的優(yōu)化。 因此,我們幾乎可以在每根柱線上進(jìn)行優(yōu)化。

這種方法的缺點則包括基于歷史數(shù)據(jù)測試時缺乏逐筆報價。 當(dāng)然,赫茲股票量化可以利用 CopyTicksCopyTicksRange。 但是下載逐筆報價歷史需要時間,且大量數(shù)據(jù)重新計算也需要計算資源和時間。 我們不要忘記我們用的是指標(biāo),在赫茲股票量化中單一品種的所有指標(biāo)共處一個線程中運(yùn)行。 因此,此處有另一個局限 — 太多指標(biāo)可能導(dǎo)致終端減速。

為了最大限度地降低所述缺陷的風(fēng)險,我們做出以下假設(shè):


  1. 初始化測試指標(biāo)時,歷史記錄按 М1 OHLC 價格計算。 在計算訂單盈利/虧損時,首先檢查止損,隨后按最高價/最低價(取決于訂單類型)檢查止盈。

  2. 根據(jù)第 1 點,訂單僅在蠟燭開盤時下單。

  3. 要減少測試指標(biāo)的運(yùn)行總數(shù),請采用有意義的方法來選擇其中使用的參數(shù)。 您可以在此處根據(jù)指標(biāo)邏輯添加最小步幅和過濾參數(shù)。 例如,在使用 MACD 時,如果快速和慢速均線的參數(shù)范圍重疊,則測試指標(biāo)排除某一組參數(shù)重疊部分的運(yùn)行,如慢速均線周期小于或等于快速均線周期的部分,這與 EA 操作邏輯相悖。 您還可以在區(qū)間內(nèi)添加最小差值,初期丟棄大量假信號的選項。


2. 交易策略

為了測試該方法,赫茲股票量化采用基于三個標(biāo)準(zhǔn)指標(biāo) WPR、RSI 和 ADX 的簡單策略。 當(dāng) WPR 向上超過超賣等級時,觸發(fā)買入信號(等級 -80)。 RSI 不應(yīng)處于超買區(qū)域(高于等級 70)。 由于兩個指標(biāo)都是振蕩器,因此在橫盤走勢中采用它們是合理的。 ADX 指標(biāo)檢測是否存在橫盤,等級不應(yīng)超過 40。


編輯切換為居中

賣出則是該信號的鏡像。 WPR 指標(biāo)向下超過超買等級 -20,RSI 應(yīng)超過等級 30 的超賣區(qū)域。 ADX 控制橫盤的存在,就像買入時一樣。


編輯切換為居中

如前所述,出現(xiàn)信號之后在新蠟燭上執(zhí)行入場。 離場則是通過固定止損或止盈來執(zhí)行的。

出于虧損管理,同一時刻場內(nèi)只保留不多于一筆的持倉。

3. 準(zhǔn)備測試器指標(biāo)

3.1. 虛擬交易類

在定義了交易策略之后,是時候開發(fā)一個測試指標(biāo)了。 首先,赫茲股票量化需要準(zhǔn)備在指標(biāo)中跟蹤的虛擬訂單。 文章 [1] 已經(jīng)描述了一個虛擬訂單類。 我們可以利用這項工作,并補(bǔ)充一些小模塊。 前面描述的類具有 Tick 方法,該方法使用當(dāng)前的競賣價和競買價檢查平倉的時刻。 此方法僅適用于在實時狀態(tài)下工作,不適用于基于歷史數(shù)據(jù)檢查。 我們略微改動上述函數(shù),在其中添加價格和點差參數(shù)。 執(zhí)行操作后,該方法返回訂單狀態(tài)。 添加后的結(jié)果,該方法將得到以下形式。

bool CDeal::Tick(double price, int spread) ?{ ? if(d_ClosePrice>0) ? ? ?return true; //--- ? switch(e_Direct) ? ? { ? ? ?case POSITION_TYPE_BUY: ? ? ? ?if(d_SL_Price>0 && d_SL_Price>=price) ? ? ? ? ?{ ? ? ? ? ? d_ClosePrice=price; ? ? ? ? ? i_Profit=(int)((d_ClosePrice-d_OpenPrice)/d_Point); ? ? ? ? ?} ? ? ? ?else ? ? ? ? ?{ ? ? ? ? ? if(d_TP_Price>0 && d_TP_Price<=price) ? ? ? ? ? ? { ? ? ? ? ? ? ?d_ClosePrice=price; ? ? ? ? ? ? ?i_Profit=(int)((d_ClosePrice-d_OpenPrice)/d_Point); ? ? ? ? ? ? } ? ? ? ? ?} ? ? ? ?break; ? ? ?case POSITION_TYPE_SELL: ? ? ? ?price+=spread*d_Point; ? ? ? ?if(d_SL_Price>0 && d_SL_Price<=price) ? ? ? ? ?{ ? ? ? ? ? d_ClosePrice=price; ? ? ? ? ? i_Profit=(int)((d_OpenPrice-d_ClosePrice)/d_Point); ? ? ? ? ?} ? ? ? ?else ? ? ? ? ?{ ? ? ? ? ? if(d_TP_Price>0 && d_TP_Price>=price) ? ? ? ? ? ? { ? ? ? ? ? ? ?d_ClosePrice=price; ? ? ? ? ? ? ?i_Profit=(int)((d_OpenPrice-d_ClosePrice)/d_Point); ? ? ? ? ? ? } ? ? ? ? ?} ? ? ? ?break; ? ? } ? return IsClosed(); ?}

在附件中可找到完整的類代碼。

3.2. 指標(biāo)編程

接下來,赫茲股票量化編寫指標(biāo)本身。 由于我們的測試指標(biāo)以某種方式扮演 EA 的角色,因此其輸入將類似于 EA 參數(shù)。 首先,設(shè)置測試區(qū)間,以及指標(biāo)參數(shù)中的止損和止盈價位。 接著,指定應(yīng)用指標(biāo)的參數(shù)。 最后,指出統(tǒng)計數(shù)據(jù)的交易方向和平均周期。 有關(guān)每個參數(shù)的更多使用方法,會在指標(biāo)代碼中用到的地方詳述。

input int ? ? ? ? ? ? ? ? ?HistoryDepth ? ? ?= ?500; ? ? ? ? ? //歷史數(shù)據(jù)深度(柱線) input int ? ? ? ? ? ? ? ? ?StopLoss ? ? ? ? ?= ?200; ? ? ? ? ? //止損(點數(shù)) input int ? ? ? ? ? ? ? ? ?TakeProfit ? ? ? ?= ?600; ? ? ? ? ? //止盈(點數(shù)) //--- RSI 指標(biāo)參數(shù) input int ? ? ? ? ? ? ? ? ?RSIPeriod ? ? ? ? = ?28; ? ? ? ? ? ?//RSI 周期 input double ? ? ? ? ? ? ? RSITradeZone ? ? ?= ?30; ? ? ? ? ? ?//超買/超賣區(qū)域大小 //--- WPR 指標(biāo)參數(shù) input int ? ? ? ? ? ? ? ? ?WPRPeriod ? ? ? ? = ?7; ? ? ? ? ? ? // WPR 周期 input double ? ? ? ? ? ? ? WPRTradeZone ? ? ?= ?30; ? ? ? ? ? ?//超買/超賣區(qū)域大小 //--- ADX 指標(biāo)參數(shù) input int ? ? ? ? ? ? ? ? ?ADXPeriod ? ? ? ? = ?11; ? ? ? ? ? ?//ADX 周期 input int ? ? ? ? ? ? ? ? ?ADXLevel ? ? ? ? ?= ?40; ? ? ? ? ? ?//ADX 橫盤等級 //--- input int ? ? ? ? ? ? ? ? ?Direction ? ? ? ? = ?-1; ? ? ? ? ? ?//交易方向 "-1"-所有, "0"-買入, "1"-賣出 //--- input int ? ? ? ? ? ? ? ? ?AveragePeriod ? ? = ?10; ? ? ? ? ? ?//均化周期

為了與 EA 進(jìn)行計算和數(shù)據(jù)交換,請創(chuàng)建包含以下數(shù)據(jù)的九個指標(biāo)緩沖區(qū):

1. 盈利成交的概率。

double ? ? ?Buffer_Probability[];

2. 測試期間的盈利因子。

double ? ? ?Buffer_ProfitFactor[];

3. 止損和止盈等級。 可以通過創(chuàng)建匹配指標(biāo)句柄的數(shù)組,并在 EA 中指定等級,或者在執(zhí)行成交時通過其句柄請求指標(biāo)參數(shù)來排除這兩個緩沖區(qū)。 但是,目前的解決方案對我來說似乎是最簡單的解決方案。

double ? ? ?Buffer_TakeProfit[]; double ? ? ?Buffer_StopLoss[];

4. 用于計算測試區(qū)間內(nèi)執(zhí)行的成交總數(shù)及其盈利數(shù)量的緩沖區(qū)。

double ? ? ?Buffer_ProfitCount[]; double ? ? ?Buffer_DealsCount[];

5. 以下兩個緩沖區(qū)用于計算先前的數(shù)值,并且僅包含當(dāng)前柱線的類似數(shù)據(jù)。

double ? ? ?Buffer_ProfitCountCurrent[]; double ? ? ?Buffer_DealsCountCurrent[];

6. 最后但并不僅限于,緩沖區(qū)向 EA 發(fā)送信號以便執(zhí)行成交。

double ? ? ?Buffer_TradeSignal[];

除了指定的緩沖區(qū)外,還聲明一個用于存儲開倉成交的數(shù)組,一個用于記錄最后一比成交時間的變量,用于存儲指標(biāo)句柄的變量,以及從全局變量塊中的指標(biāo)獲取信息的數(shù)組。

CArrayObj ? Deals; datetime ? ?last_deal; int ? ? ? ? wpr_handle,rsi_handle,adx_handle; double ? ? ?rsi[],adx[],wpr[];

在 OnInit 函數(shù)的開頭初始化指標(biāo)。

int OnInit() ?{ //--- 獲取 RSI 指標(biāo)句柄 ? rsi_handle=iRSI(Symbol(),PERIOD_CURRENT,RSIPeriod,PRICE_CLOSE); ? if(rsi_handle==INVALID_HANDLE) ? ? { ? ? ?Print("Test Indicator",": Failed to get RSI handle"); ? ? ?Print("Handle = ",rsi_handle," ?error = ",GetLastError()); ? ? ?return(INIT_FAILED); ? ? } //--- 獲取 WPR 指標(biāo)句柄 ? wpr_handle=iWPR(Symbol(),PERIOD_CURRENT,WPRPeriod); ? if(wpr_handle==INVALID_HANDLE) ? ? { ? ? ?Print("Test Indicator",": Failed to get WPR handle"); ? ? ?Print("Handle = ",wpr_handle," ?error = ",GetLastError()); ? ? ?return(INIT_FAILED); ? ? } //--- 獲取 ADX 指標(biāo)句柄 ? adx_handle=iADX(Symbol(),PERIOD_CURRENT,ADXPeriod); ? if(adx_handle==INVALID_HANDLE) ? ? { ? ? ?Print("Test Indicator",": Failed to get ADX handle"); ? ? ?Print("Handle = ",adx_handle," ?error = ",GetLastError()); ? ? ?return(INIT_FAILED); ? ? }

接下來,將指標(biāo)緩沖區(qū)與動態(tài)數(shù)組關(guān)聯(lián)起來。

//--- 指標(biāo)緩存區(qū)映射 ? SetIndexBuffer(0,Buffer_Probability,INDICATOR_CALCULATIONS); ? SetIndexBuffer(1,Buffer_DealsCount,INDICATOR_CALCULATIONS); ? SetIndexBuffer(2,Buffer_TradeSignal,INDICATOR_CALCULATIONS); ? SetIndexBuffer(3,Buffer_ProfitFactor,INDICATOR_CALCULATIONS); ? SetIndexBuffer(4,Buffer_ProfitCount,INDICATOR_CALCULATIONS); ? SetIndexBuffer(5,Buffer_TakeProfit,INDICATOR_CALCULATIONS); ? SetIndexBuffer(6,Buffer_StopLoss,INDICATOR_CALCULATIONS); ? SetIndexBuffer(7,Buffer_DealsCountCurrent,INDICATOR_CALCULATIONS); ? SetIndexBuffer(8,Buffer_ProfitCountCurrent,INDICATOR_CALCULATIONS);

將時間序列屬性分配給所有數(shù)組。

? ArraySetAsSeries(Buffer_Probability,true); ? ArraySetAsSeries(Buffer_ProfitFactor,true); ? ArraySetAsSeries(Buffer_TradeSignal,true); ? ArraySetAsSeries(Buffer_DealsCount,true); ? ArraySetAsSeries(Buffer_ProfitCount,true); ? ArraySetAsSeries(Buffer_TakeProfit,true); ? ArraySetAsSeries(Buffer_StopLoss,true); ? ArraySetAsSeries(Buffer_DealsCountCurrent,true); ? ArraySetAsSeries(Buffer_ProfitCountCurrent,true); //--- ? ArraySetAsSeries(rsi,true); ? ArraySetAsSeries(wpr,true); ? ArraySetAsSeries(adx,true);

在函數(shù)結(jié)尾處,重置成交數(shù)組和最后一筆成交的日期,并將名稱分配給我們的指標(biāo)。


股票量化交易軟件:利用指標(biāo)實時優(yōu)化智能交易系統(tǒng)的評論 (共 條)

分享到微博請遵守國家法律
金堂县| 遂溪县| 青河县| 南岸区| 夏邑县| 如皋市| 云林县| 仁布县| 济源市| 临城县| 施甸县| 惠安县| 漳浦县| 安塞县| 阿瓦提县| 通山县| 青铜峡市| 松原市| 兴宁市| 洱源县| 肥西县| 巴彦淖尔市| 柘城县| 青铜峡市| 四子王旗| 云和县| 新津县| 那曲县| 宁化县| 淳安县| 台湾省| 三亚市| 德令哈市| 高雄县| 泌阳县| 商洛市| 榆中县| 佛山市| 麻城市| 营山县| 柘荣县|