股票量化交易軟件:從頭開始開發(fā)智能交易系統(tǒng)25--提供系統(tǒng)健壯性
2.0.1. 刪除 EA 背景
雖然這不會(huì)損害 EA,或?qū)е氯魏螁?wèn)題,但有些人有時(shí)希望他們的屏幕是空白的,屏幕上只顯示某些項(xiàng)目。 因此,我們將從 EA 中刪除這部分,并將其轉(zhuǎn)換為指標(biāo)。 它非常容易實(shí)現(xiàn)。 我們不會(huì)觸及任何類,但要?jiǎng)?chuàng)建以下代碼:
#property copyright "Daniel Jose" #property indicator_chart_window #property indicator_plots 0 //+------------------------------------------------------------------+ #include <NanoEA-SIMD\Auxiliar\C_Wallpaper.mqh> //+------------------------------------------------------------------+ input string ? ? ? ? ? ? ? ? ? ?user10 = "Wallpaper_01"; ? ? ? ?//Used BitMap input char ? ? ? ? ? ? ? ? ? ? ?user11 = 60; ? ? ? ? ? ? ? ? ? ?//Transparency (from 0 to 100) input C_WallPaper::eTypeImage ? user12 = C_WallPaper::IMAGEM; ? //Background image type //+------------------------------------------------------------------+ C_Terminal ? ? ?Terminal; C_WallPaper WallPaper; //+------------------------------------------------------------------+ int OnInit() { ? ? ? ?IndicatorSetString(INDICATOR_SHORTNAME, "WallPaper"); ? ? ? ?Terminal.Init(); ? ? ? ?WallPaper.Init(user10, user12, user11); ? ? ? ?return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { ? ? ? ?return rates_total; } //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { ? ? ? ?switch (id) ? ? ? ?{ ? ? ? ? ? ? ? ?case CHARTEVENT_CHART_CHANGE: ? ? ? ? ? ? ? ? ? ? ? ?Terminal.Resize(); ? ? ? ? ? ? ? ? ? ? ? ?WallPaper.Resize(); ? ? ? ?break; ? ? ? ?} ? ? ? ?ChartRedraw(); } //+------------------------------------------------------------------+
如您所見,一切都非常自然,且易于理解。 我們只是簡(jiǎn)單地從 EA 中刪除了代碼,并將其轉(zhuǎn)換為可以添加到圖表中的指標(biāo)。 而任何變化,無(wú)論是背景、透明度,甚至是從圖表中刪除它,都不會(huì)對(duì) EA 操作產(chǎn)生影響。赫茲股票交易軟件
現(xiàn)在我們將開始刪除真正導(dǎo)致 EA 性能下降的內(nèi)容。 這些就是不時(shí),或每次價(jià)格變動(dòng)都會(huì)運(yùn)作的事情,因此有時(shí)會(huì)導(dǎo)致 EA 變慢,從而阻礙它完成真正的工作 — 觀察圖表上的訂單或倉(cāng)位發(fā)生了什么。赫茲股票交易軟件
2.0.2. 把價(jià)格對(duì)應(yīng)的成交量轉(zhuǎn)換為一個(gè)指標(biāo)
盡管看起來(lái)不似這樣,但價(jià)格對(duì)應(yīng)的交易量系統(tǒng)需要時(shí)間,這對(duì) EA 來(lái)說(shuō)通常至關(guān)重要。 我指的高波動(dòng)時(shí)刻是,價(jià)格劇烈波動(dòng),但卻沒(méi)有太多的方向性情況下。 正是在這些時(shí)候,EA 需要每個(gè)可用的機(jī)器周期來(lái)完成其任務(wù)。 錯(cuò)過(guò)一個(gè)好時(shí)機(jī)會(huì)令人沮喪,因?yàn)橐恍┲笜?biāo)決定接管該項(xiàng)工作。 因此,我們將其從 EA 中刪除,并通過(guò)創(chuàng)建以下代碼將其轉(zhuǎn)換為真實(shí)的指標(biāo):赫茲股票交易軟件
#property copyright "Daniel Jose" #property indicator_chart_window #property indicator_plots 0 //+------------------------------------------------------------------+ #include <NanoEA-SIMD\Tape Reading\C_VolumeAtPrice.mqh> //+------------------------------------------------------------------+ input color ? ? ? ? ? ? user0 ? = clrBlack; ? ? ? ? ? ? ? ? ? ? //Bar color input ? char ? ? ? ? ? ?user1 ? = 20; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //Transparency (from 0 to 100 ) input color ? ? user2 = clrForestGreen; //Buying input color ? ? user3 = clrFireBrick; ? //Selling //+------------------------------------------------------------------+ C_Terminal ? ? ? ? ? ? ? ? ? ? ?Terminal; C_VolumeAtPrice VolumeAtPrice; //+------------------------------------------------------------------+ int OnInit() { ? ? ? ?Terminal.Init(); ? ? ? ?VolumeAtPrice.Init(user2, user3, user0, user1); ? ? ? ?EventSetTimer(1); ? ? ? ? ? ? ? ?return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { ? ? ? ?return rates_total; } //+------------------------------------------------------------------+ void OnTimer() { ? ? ? ?VolumeAtPrice.Update(); } //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { ? ? ? ?VolumeAtPrice.DispatchMessage(id, sparam); ? ? ? ?ChartRedraw(); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ? ? ? ?EventKillTimer(); } //+------------------------------------------------------------------+
這是最簡(jiǎn)單的部分。 我們從 EA 中刪除了代碼,并將其放入指標(biāo)之中。 如果您想將代碼放回 EA 當(dāng)中,您只需復(fù)制指標(biāo)代碼,并將其放回 EA 中即可。赫茲股票交易軟件
所以,我們先從簡(jiǎn)單的事情開始。 但現(xiàn)在事情會(huì)變得更加復(fù)雜 — 我們將從 EA 中刪除 Times & Trade。
2.0.3. 把 Times & Trade 轉(zhuǎn)換到一個(gè)指標(biāo)
如果我們的目標(biāo)是創(chuàng)建可以在 EA 和指標(biāo)中都能用的代碼,這并不那么簡(jiǎn)單。 作為在子窗口中操作的指標(biāo),將其轉(zhuǎn)換為指標(biāo)似乎很容易。 而正因?yàn)樗窃谧哟翱谥胁僮鳎鋵?shí)這并不容易。 主要問(wèn)題是,如果我們像前面的情況一樣完成所有事情,那么我們將在指標(biāo)窗口中得到以下結(jié)果:赫茲股票交易軟件

編輯
不建議將此類內(nèi)容放在指標(biāo)窗口中,因?yàn)槿绻脩粝霃钠聊恢袆h除指標(biāo),這會(huì)讓用戶感到困惑。 因此,應(yīng)該以不同的方式完成這件事情。 在這條路徑的末端,也許看起來(lái)很困惑,但實(shí)際上是一組簡(jiǎn)單的指令和一些剪輯,我們將在指標(biāo)窗口中得到以下結(jié)果。赫茲股票交易軟件

編輯
這正是用戶所期望的 — 而不是上圖中看到的混亂。
以下是 Times & Trade 指標(biāo)的完整代碼:
#property copyright "Daniel Jose" #property version ? "1.00" #property indicator_separate_window #property indicator_plots 0 //+------------------------------------------------------------------+ #include <NanoEA-SIMD\Tape Reading\C_TimesAndTrade.mqh> //+------------------------------------------------------------------+ C_Terminal ? ? ? ?Terminal; C_TimesAndTrade ? TimesAndTrade; //+------------------------------------------------------------------+ input int ? ? user1 = 2; ? ? ?//Scale //+------------------------------------------------------------------+ bool isConnecting = false; int SubWin; //+------------------------------------------------------------------+
該代碼似乎與 EA 中所用的代碼相似,除了高亮顯示的行在 EA 代碼中不存在。 那有什么收獲呢? 還是一無(wú)所獲? 實(shí)際上,有一些收獲:代碼不完全相同,其中存在差異,它并不在指標(biāo)或 EA 代碼里,而是在類代碼之中。 但在研究差別之前,我們先思考以下幾點(diǎn):我們?nèi)绾胃嬖V編譯器要編譯什么,以及不要編譯什么? 也許,在編程時(shí),您根本不擔(dān)心這一點(diǎn) — 也許,您只管簡(jiǎn)單地創(chuàng)建代碼,如果您不喜歡任何東西,直接刪掉就好了。赫茲股票交易軟件
經(jīng)驗(yàn)豐富的程序員有一條規(guī)則:只在肯定不起作用時(shí)才會(huì)刪除某些內(nèi)容,否則即使它們實(shí)際上沒(méi)有被編譯,也要保留片段。 但是,當(dāng)我們希望編寫的函數(shù)始終工作時(shí),如何在線性代碼中做到這一點(diǎn)呢? 此處的問(wèn)題是:您知道如何告訴編譯器要編譯什么,和不要編譯什么嗎? 如果答案是“否”,那就無(wú)妨。 當(dāng)我開始時(shí),我個(gè)人也不知道該怎么做。 但它有很大幫助。 故此,我們來(lái)找出如何做到這一點(diǎn)。赫茲股票交易軟件
某些語(yǔ)言具有編譯指令,根據(jù)作者的不同,這些指令也可能稱為預(yù)處理器。 但思路是一致的:告訴編譯器要編譯什么,以及如何進(jìn)行編譯。 有一種非常特殊類型的指令可用來(lái)有意隔離代碼,以便我們可以測(cè)試特定的東西。 這些就是條件編譯指令。 如果使用得當(dāng),它們?cè)试S我們?cè)诰幾g相同的代碼時(shí)走不同的途徑。 這恰恰是 Times & Trade 示例中所做到的。 我們可選擇誰(shuí)來(lái)負(fù)責(zé)生成條件編譯:EA 或指標(biāo)。 定義該參數(shù)后,創(chuàng)建 #define 指令,然后使用條件指令 #ifdef #else #endif 通知編譯器如何去編譯代碼。赫茲股票交易軟件