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

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

期貨量化交易軟件:開發(fā)回放系統(tǒng)市場模擬第 03 部分調(diào)整設(shè)置

2023-09-05 16:59 作者:bili_45793681098  | 我要投稿

規(guī)劃

這個規(guī)劃步驟非常簡單,因為如果您查看上一篇文章中系統(tǒng)的工作原理,就會很清楚我們需要做什么。 赫茲量化需要創(chuàng)建一個控制窗體,在其中我們可以暫停、播放,最重要的是,選擇一個特定的時間來開始研究。

在當(dāng)前視圖中,我們將始終從第一次交易跳價開始。 假設(shè)我們想自市場的第五個小時開始研究,即從 14:00(假設(shè)市場在 9:00 開盤)。 在這種情況下,我們將不得不等待回放 5 個小時,然后才執(zhí)行必要的分析。 這是完全不可能的,因為如果我們試圖停止回放,它將關(guān)閉,我們將不得不從第一次交易跳價重新開始。

現(xiàn)在很清楚我們需要馬上做什么,因為它現(xiàn)在的工作方式令人沮喪,即使這個想法本身很有趣。

現(xiàn)在我們有了大致的方向,我們就可以繼續(xù)實現(xiàn)。

實現(xiàn)

實現(xiàn)會非常有趣,因為我們將不得不經(jīng)歷從最簡單到最多樣化的不同路徑,從而創(chuàng)建真正的控制系統(tǒng)。 不過,如果您仔細(xì)閱讀解釋,所有步驟都很容易理解,并按發(fā)布順序遵循文章所說,無需跳過任何步驟,也無需嘗試向前跨出若干步。


與許多人的想法相左,赫茲量化不會在系統(tǒng)中使用 DLL。 我們只使用純 MQL5 語言實現(xiàn)回放系統(tǒng)。 這個思路是充分利用赫茲量化,并展示在創(chuàng)建必要功能時我們可以在平臺內(nèi)走多遠(yuǎn)。 求助于外部實現(xiàn)會剝奪使用 MQL5 的很多樂趣,給人的印象是 MQL5 無法滿足我們的需求。

如果您查看上一篇文章中所用的代碼,您可以看到系統(tǒng)使用服務(wù)來創(chuàng)建回放。 它還包括啟動它的腳本。 此腳本允許服務(wù)發(fā)送自定義交易品種的跳價,從而創(chuàng)建回放。 我們用到了一個簡單的切換機(jī)制。 然而,這種方法不適合更有效的控制。 我們必須走一條更困難的道路。


創(chuàng)建超基本 EA

赫茲量化來嘗試?yán)?EA 實現(xiàn)控制。 該 EA 將控制服務(wù)何時應(yīng)該或不應(yīng)該為柱線生成跳價。 為什么是 EA? 我們可以使用指標(biāo)替代 EA,其工作方式相同。 不過,我想使用 EA,因為我們稍后需要它來創(chuàng)建訂單模擬系統(tǒng)。 此外,我們將嘗試使用我在另一系列文章稱為“從頭開始開發(fā)交易 EA”中介紹的訂單系統(tǒng)。 我們現(xiàn)在不必?fù)?dān)心訂單系統(tǒng),因為在我們開始之前我們還有很多工作要做。

我們基本 EA 的完整代碼如下所示:

#property copyright "Daniel Jose" #property version ? "1.00" //+------------------------------------------------------------------+ #include <Market Replay\C_Controls.mqh> //+------------------------------------------------------------------+ C_Controls ? ? ?Control; //+------------------------------------------------------------------+ int OnInit() { ? ? ? ?Control.Init(); ? ? ? ? ? ? ? ? ? ? ? ?return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ void OnDeinit(const int reason) {} //+------------------------------------------------------------------+ void OnTick() {} //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { ? ? ? ?Control.DispatchMessage(id, lparam, dparam, sparam); } //+------------------------------------------------------------------+

代碼非常簡單,但足以控制服務(wù)的操作。 現(xiàn)在我們來看一下代碼的某些部分,即上面高亮顯示的控制對象類。 在開發(fā)的早期階段,代碼并不是很復(fù)雜。 我們只實現(xiàn)一個按鈕來播放和暫停回放服務(wù)。 如此,我們來看看這個當(dāng)前開發(fā)階段的類。

首先要注意的,如下所示:

#property copyright "Daniel Jose" //+------------------------------------------------------------------+ #include <Market Replay\Interprocess.mqh> //+------------------------------------------------------------------+ #define def_ButtonPlay ?"Images\\Market Replay\\Play.bmp" #define def_ButtonPause "Images\\Market Replay\\Pause.bmp" #resource "\\" + def_ButtonPlay #resource "\\" + def_ButtonPause //+------------------------------------------------------------------+ #define def_PrefixObjectName "Market Replay _ "

第一個要點是 《藍(lán)色高亮 的頭文件。 赫茲量化稍后會詳細(xì)查看它。 然后,我們有一些位圖對象的定義,這些對象將表示播放和暫停按鈕。 這里沒有什么太復(fù)雜的。 一旦定義了這些要點,我們就能邁進(jìn)類代碼,它們非常緊湊。 完整代碼如下所示。

class C_Controls { ? ? ? ?private : //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?string ?m_szBtnPlay; ? ? ? ? ? ? ? ?long ? ? ? ? ? ?m_id; //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?void CreateBtnPlayPause(long id) ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?m_szBtnPlay = def_PrefixObjectName + "Play"; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectCreate(id, m_szBtnPlay, OBJ_BITMAP_LABEL, 0, 0, 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectSetInteger(id, m_szBtnPlay, OBJPROP_XDISTANCE, 5); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectSetInteger(id, m_szBtnPlay, OBJPROP_YDISTANCE, 25); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectSetInteger(id, m_szBtnPlay, OBJPROP_STATE, false); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectSetString(id, m_szBtnPlay, OBJPROP_BMPFILE, 0, "::" + def_ButtonPause); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectSetString(id, m_szBtnPlay, OBJPROP_BMPFILE, 1, "::" + def_ButtonPlay); ? ? ? ? ? ? ? ? ? ? ? ?} //+------------------------------------------------------------------+ ? ? ? ?public ?: //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?C_Controls() ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?m_szBtnPlay = NULL; ? ? ? ? ? ? ? ? ? ? ? ?} //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?~C_Controls() ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ObjectDelete(ChartID(), m_szBtnPlay); ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?void Init(void) ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (m_szBtnPlay != NULL) return; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CreateBtnPlayPause(m_id = ChartID()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GlobalVariableTemp(def_GlobalVariableReplay); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ChartRedraw(); ? ? ? ? ? ? ? ? ? ? ? ?} //+------------------------------------------------------------------+ ? ? ? ? ? ? ? ?void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam) ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?u_Interprocess Info; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?switch (id) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case CHARTEVENT_OBJECT_CLICK: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (sparam == m_szBtnPlay) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Info.s_Infos.isPlay = (bool) ObjectGetInteger(m_id, m_szBtnPlay, OBJPROP_STATE); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GlobalVariableSet(def_GlobalVariableReplay, Info.Value); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ?} //+------------------------------------------------------------------+ };

這里我們有兩個主要函數(shù):Init 和 DispatchMessage。它們在這個早期階段實現(xiàn) EA 操作所需的所有工作。 為了更好地解釋其中的一些細(xì)節(jié),我們來看看下面的這兩個函數(shù)。 我們從 Init 開始。

void Init(void) { ? ? ? ?if (m_szBtnPlay != NULL) return; ? ? ? ?CreateBtnPlayPause(m_id = ChartID()); ? ? ? ?GlobalVariableTemp(def_GlobalVariableReplay); ? ? ? ?ChartRedraw(); }

調(diào)用 Init 時,它首先檢查之前是否已創(chuàng)建控制元素。 如果這已經(jīng)發(fā)生,那么它就返回。 這很重要,因為如果您更改圖表周期,或進(jìn)行任何需要 EA 重新加載圖表的更改(這種情況經(jīng)常發(fā)生),回放服務(wù)的狀態(tài)將不會更改。 那么,如果服務(wù)正在運(yùn)行,也就是說,如果它暫停了,就按原樣繼續(xù);如果它正在運(yùn)行,它將繼續(xù)發(fā)送跳價。

如果是第一次調(diào)用,則創(chuàng)建主控制,目前只是播放和暫停按鈕。 接下來,我們創(chuàng)建一個全局終端值,該值將用于 EA 和服務(wù)之間的通信。 此刻,赫茲量化只是創(chuàng)建一個變量,且不為其分配任何值。

=之后,我們必須在屏幕上應(yīng)用對象。這很重要,因為如果不進(jìn)行強(qiáng)制更新,EA 將被加載,但服務(wù)就會停止,如此令您認(rèn)為系統(tǒng)崩潰了。 但事實上,我們將等待赫茲量化為我們更新圖表,以便繪制對象,并運(yùn)行市場回放。

您有沒有注意到它是多么容易? 現(xiàn)在我們來看看 DispatchMessage 函數(shù)的代碼,其在此階段也非常簡單。 下面是它的代碼:

void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam) { ? ? ? ?u_Interprocess Info; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?switch (id) ? ? ? ?{ ? ? ? ? ? ? ? ?case CHARTEVENT_OBJECT_CLICK: ? ? ? ? ? ? ? ? ? ? ? ?if (sparam == m_szBtnPlay) ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Info.s_Infos.isPlay = (bool) ObjectGetInteger(m_id, m_szBtnPlay, OBJPROP_STATE); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GlobalVariableSet(def_GlobalVariableReplay, Info.Value); ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ?break; ? ? ? ?} }

赫茲量化利用赫茲量化 來管控一切。 我們使用 u_Interprocess 聯(lián)合來設(shè)置全局終端值,從而檢查位圖按鈕的狀態(tài)。故此,我們調(diào)整終端全局變量,如此將其傳遞給負(fù)責(zé)創(chuàng)建回放的服務(wù)進(jìn)程。

由此,赫茲量化將始終以暫停狀態(tài)啟動重播系統(tǒng)。 一旦 EA 及其所有對象加載到圖表上,我們就可以隨時播放它,或暫停市場回放。 這會令事情變得更加有趣。



期貨量化交易軟件:開發(fā)回放系統(tǒng)市場模擬第 03 部分調(diào)整設(shè)置的評論 (共 條)

分享到微博請遵守國家法律
佛山市| 平山县| 水城县| 卢氏县| 会东县| 普定县| 美姑县| 凤山县| 广南县| 田东县| 京山县| 巴东县| 沂源县| 福安市| 巴彦淖尔市| 纳雍县| 赣榆县| 肥西县| 崇礼县| 永靖县| 玉溪市| 石渠县| 婺源县| 道真| 宣汉县| 卓资县| 民和| 大英县| 岳池县| 莱阳市| 永清县| 定兴县| 沙坪坝区| 建昌县| 会理县| 天水市| 东乡县| 淳化县| 北宁市| 汉川市| 禹城市|