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

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

股票量化交易軟件:如何基于HTML和CSV報(bào)表可視化多幣種交易歷史

2023-07-11 17:43 作者:bili_45793681098  | 我要投稿

自推出以來,赫茲股票量化提供了多貨幣測(cè)試選項(xiàng),也許交易者經(jīng)常使用這個(gè)功能。然而,這種功能并不是萬能的。特別是,在運(yùn)行測(cè)試之后,用戶可以打開一個(gè)帶有已執(zhí)行交易操作的圖表,但這只是策略測(cè)試人員設(shè)置中選擇的一個(gè)交易品種的圖表,測(cè)試后無法查看所有使用的交易品種的整個(gè)交易歷史,而目測(cè)檢查并不總是有效的,測(cè)試后一段時(shí)間可能需要進(jìn)行額外的分析。此外,還可以由其他人提供報(bào)告。因此,一個(gè)基于HTML測(cè)試報(bào)告的可視化多個(gè)交易品種交易的工具將非常有用。

此任務(wù)與另一個(gè)類似的赫茲股票量化應(yīng)用程序密切相關(guān),MQL5.com 上的許多交易信號(hào)涉及多貨幣交易,將帶有信號(hào)歷史的 CSV 文件顯示在圖表中比較方便。

讓赫茲股票量化開發(fā)一個(gè)能夠執(zhí)行上述功能的指標(biāo)。

為了對(duì)多個(gè)工作交易品種進(jìn)行并行分析,將在圖表子窗口中創(chuàng)建多個(gè)指標(biāo)實(shí)例(每個(gè)交易品種一個(gè))。主要圖形對(duì)象將是所選交易品種(通常與圖表交易品種不同)的“報(bào)價(jià)”,與主窗口中的柱同步。與交易訂單(頭寸)相對(duì)應(yīng)的趨勢(shì)線將應(yīng)用于這些“報(bào)價(jià)”。

還有一種替代方法:交易顯示在主窗口中,但在這種情況下,圖表上只分析一個(gè)交易品種。這種方法需要另一個(gè)沒有緩沖區(qū)的指標(biāo),可以切換到報(bào)告中包含的任何交易品種。

之前的文章對(duì)基于 CSS 選擇器的 HTML 解析器做了描述[1],解析器從HTML報(bào)告中提取交易列表,根據(jù)該列表赫茲股票量化可以進(jìn)行交易(圖形對(duì)象)。從信號(hào)部分解析 CSV 文件比較容易,而內(nèi)置的 MQL 函數(shù)支持 赫茲股票量化(*.history.csv)和 赫茲股票量化(*.positions.csv)信號(hào)的文件格式。

SubChart 指標(biāo)

實(shí)現(xiàn)的第一步是創(chuàng)建一個(gè)簡(jiǎn)單的指標(biāo),它在任何圖表的子窗口中顯示外部交易品種的“報(bào)價(jià)”,這將是 SubChart 指標(biāo)。

為了使用 OHLC (開盤價(jià),最高價(jià),最低價(jià),收盤價(jià)) 的數(shù)值顯示數(shù)據(jù), MQL 提供了多種顯示樣式,包括 DRAW_CANDLESDRAW_BARS,它們中的每一種都有四個(gè)指標(biāo)緩沖區(qū)。赫茲股票量化將提供這兩個(gè)選項(xiàng)的支持,而不是選擇其中一種樣式。將根據(jù)當(dāng)前窗口設(shè)置動(dòng)態(tài)選擇樣式?!皥D表設(shè)置”中的“常用”選項(xiàng)卡下有一組單選按鈕:“條形圖”、“日式燭形”和“折線圖”。為了快速訪問,可以使用與工具欄上的按鈕相同的按鈕??梢允褂靡韵抡{(diào)用從 MQL 獲取設(shè)置:

(ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE)

ENUM_CHART_MODE 枚舉中包含了相同目標(biāo)的元素: CHART_CANDLES, CHART_BARS, CHART_LINE.

最后一個(gè) CHART_LINE 點(diǎn)的支持也將在指標(biāo)中實(shí)現(xiàn)。這樣,當(dāng)用戶界面中的顯示模式切換時(shí),指標(biāo)視圖將根據(jù)主窗口進(jìn)行更改。DRAW_LINE 適合用于最后一種模式;它使用了一個(gè)緩沖區(qū)。

讓赫茲股票量化開始實(shí)現(xiàn). 聲明指標(biāo)緩沖區(qū)的數(shù)量和顯示圖形對(duì)象的類型:

#property indicator_separate_window #property indicator_buffers 4 #property indicator_plots ? 1

加上輸入變量:

input string SubSymbol = ""; // 交易品種 input bool Exact = false;

使用 SubSymbol,可以為指標(biāo)設(shè)置主窗口中當(dāng)前交易品種以外的任何交易品種。

Exact 參數(shù)確定主窗口中的柱沒有完全相同時(shí)間的另一個(gè)交易品種的匹配柱的情況下的操作。這個(gè)參數(shù)將在 iBarShift 函數(shù)調(diào)用中使用,其視覺效果如下:

  • 如果“Exact” 等于 “false”,則函數(shù)返回最接近指定時(shí)間的最接近合適的柱數(shù),因此如果沒有報(bào)價(jià)(由于假日或其他原因),則指標(biāo)將顯示上一個(gè)柱;

  • 如果 Exact = true, 函數(shù)返回 -1, 這樣的畫,指標(biāo)圖表在這個(gè)位置將是空白;

SubSymbol 參數(shù)默認(rèn)等于空字符串,這表示報(bào)價(jià)與主窗口中顯示的是一樣的。在這種情況下,您應(yīng)當(dāng)編輯實(shí)際變量的值,把它設(shè)為 _Symbol. 視覺測(cè)試但是,由于“輸入?yún)?shù)”是MQL中的只讀變量,因此赫茲股票量化必須輸入中間變量“Symbol”,并將其填充到OnInit處理程序中。

string Symbol; int OnInit() { ?Symbol = SubSymbol; ?if(Symbol == "") Symbol = _Symbol; ?else SymbolSelect(Symbol, true); ?...

請(qǐng)注意,此交易品種也應(yīng)添加到市場(chǎng)報(bào)價(jià)中,因?yàn)樗赡懿辉谑袌?chǎng)報(bào)價(jià)列表中。

使用 'mode' 變量來控制當(dāng)前的顯示模式:

ENUM_CHART_MODE mode = 0;

將使用下面的四個(gè)指標(biāo)緩沖區(qū):

// OHLC double open[]; double high[]; double low[]; double close[];

讓赫茲股票量化添加一個(gè)小函數(shù)以通常的方式初始化緩沖區(qū)(使用“series”屬性的設(shè)置):

void InitBuffer(int index, double &buffer[], ENUM_INDEXBUFFER_TYPE style) { ?SetIndexBuffer(index, buffer, style); ?ArraySetAsSeries(buffer, true); }

圖形初始化也在一個(gè)輔助函數(shù)中執(zhí)行(該指標(biāo)只有一個(gè)圖形結(jié)構(gòu);如果使用多個(gè)結(jié)構(gòu),該功能可以節(jié)省時(shí)間):

void InitPlot(int index, string name, int style, int width = -1, int colorx = -1) { ?PlotIndexSetInteger(index, PLOT_DRAW_TYPE, style); ?PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, 0); ?PlotIndexSetString(index, PLOT_LABEL, name); ?if(width != -1) PlotIndexSetInteger(index, PLOT_LINE_WIDTH, width); ?if(colorx != -1) PlotIndexSetInteger(index, PLOT_LINE_COLOR, colorx); }

以下函數(shù)將圖表顯示模式切換為緩沖區(qū)樣式:

int Mode2Style(/*global ENUM_CHART_MODE mode*/) { ?switch(mode) ?{ ? ?case CHART_CANDLES: return DRAW_CANDLES; ? ?case CHART_BARS: return DRAW_BARS; ? ?case CHART_LINE: return DRAW_LINE; ?} ?return 0; }

函數(shù)使用前面提到的全局變量“mode”,該變量應(yīng)在 OnInit 中填入相關(guān)值,并調(diào)用所有輔助函數(shù)。

?InitBuffer(0, open, INDICATOR_DATA); ?string title = "# Open;# High;# Low;# Close"; ?StringReplace(title, "#", Symbol); ?mode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE); ?InitPlot(0, title, Mode2Style()); ?InitBuffer(1, high, INDICATOR_DATA); ?InitBuffer(2, low, INDICATOR_DATA); ?InitBuffer(3, close, INDICATOR_DATA);

這仍然不足以使指標(biāo)正常工作。應(yīng)根據(jù)當(dāng)前模式(mode變量)更改線條顏色:顏色由圖表設(shè)置提供。

void SetPlotColors() { ?if(mode == CHART_CANDLES) ?{ ? ?PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 3); ? ?PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, (int)ChartGetInteger(0, CHART_COLOR_CHART_LINE)); ?// 長(zhǎng)方形 ? ?PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, (int)ChartGetInteger(0, CHART_COLOR_CANDLE_BULL)); // 向上 ? ?PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, (int)ChartGetInteger(0, CHART_COLOR_CANDLE_BEAR)); // 向下 ?} ?else ?{ ? ?PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 1); ? ?PlotIndexSetInteger(0, PLOT_LINE_COLOR, (int)ChartGetInteger(0, CHART_COLOR_CHART_LINE)); ?} }

在 OnInit 中添加 SetPlotColors()調(diào)用并設(shè)置值的準(zhǔn)確性,可以確保在啟動(dòng)后顯示正確的指標(biāo)。

?SetPlotColors(); ?IndicatorSetString(INDICATOR_SHORTNAME, "SubChart (" + Symbol + ")"); ?IndicatorSetInteger(INDICATOR_DIGITS, (int)SymbolInfoInteger(Symbol, SYMBOL_DIGITS)); ? ?return INIT_SUCCEEDED; }

但是,如果用戶在指標(biāo)運(yùn)行時(shí)更改圖表模式,則需要跟蹤此事件并修改緩沖區(qū)的屬性。這是通過 OnChartEvent 處理函數(shù)完成的。

void OnChartEvent(const int id, ? ? ? ? ? ? ? ? ?const long& lparam, ? ? ? ? ? ? ? ? ?const double& dparam, ? ? ? ? ? ? ? ? ?const string& sparam) { ?if(id == CHARTEVENT_CHART_CHANGE) ?{ ? ?mode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE); ? ?PlotIndexSetInteger(0, PLOT_DRAW_TYPE, Mode2Style()); ? ?SetPlotColors(); ? ?ChartRedraw(); ?} }

現(xiàn)在,赫茲股票量化需要編寫最重要的指標(biāo)函數(shù),即OnCalculate 處理函數(shù),此處理程序的特定功能是指標(biāo)實(shí)際上使用第三方交易品種的報(bào)價(jià)而不是圖表中的交易品種,因此,所有基于 rates_total 和 prev_calcuated 的標(biāo)準(zhǔn)編程技術(shù)(通常從內(nèi)核傳遞)都不適用或僅部分適用。第三方交易品種的報(bào)價(jià)將被異步下載,因此新的一批柱形可能隨時(shí)“到達(dá)”——這種情況需要重新計(jì)算。因此,讓我們創(chuàng)建變量,它控制該交易品種(lastavailable)上的柱數(shù)和常量 prev_calculated 參數(shù)的可編輯“克隆”。

int OnCalculate(const int rates_total, ? ? ? ? ? ? ? ?const int prev_calculated, ? ? ? ? ? ? ? ?const datetime& time[], ? ? ? ? ? ? ? ?const double& op[], ? ? ? ? ? ? ? ?const double& hi[], ? ? ? ? ? ? ? ?const double& lo[], ? ? ? ? ? ? ? ?const double& cl[], ? ? ? ? ? ? ? ?const long& tick_volume[], ? ? ? ? ? ? ? ?const long& volume[], ? ? ? ? ? ? ? ?const int& spread[]) { ?static int lastAvailable = 0; ?static bool initialized = false; ?int _prev_calculated = prev_calculated; ?if(iBars(Symbol, _Period) - lastAvailable > 1) // 填充柱的間隙 ?{ ? ?_prev_calculated = 0; ? ?lastAvailable = 0; ? ?initialized = false; ?} ?if(_prev_calculated == 0) ?{ ? ?for(int i = 0; i < rates_total; ++i) ? ?{ ? ? ?open[i] = 0; ? ? ?high[i] = 0; ? ? ?low[i] = 0; ? ? ?close[i] = 0; ? ?} ?}

如果指標(biāo)交易品種與窗口交易品種不同,請(qǐng)使用iBarShift 函數(shù)找到同步的柱并復(fù)制它們的 OHLC 值。

?if(_Symbol != Symbol) ?{ ? ?for(int i = 0; i < MathMax(rates_total - _prev_calculated, 1); ++i) ? ?{ ? ? ?datetime dt = iTime(_Symbol, _Period, i); ? ? ?int x = iBarShift(Symbol, _Period, dt, Exact); ? ? ?if(x != -1) ? ? ?{ ? ? ? ?open[i] = iOpen(Symbol, _Period, x); ? ? ? ?high[i] = iHigh(Symbol, _Period, x); ? ? ? ?low[i] = iLow(Symbol, _Period, x); ? ? ? ?close[i] = iClose(Symbol, _Period, x); ? ? ?} ? ?} ?}

如果指標(biāo)的交易品種與窗口交易品種匹配,就簡(jiǎn)單使用傳入的參數(shù)數(shù)組:

?else ?{ ? ?ArraySetAsSeries(op, true); ? ?ArraySetAsSeries(hi, true); ? ?ArraySetAsSeries(lo, true); ? ?ArraySetAsSeries(cl, true); ? ?for(int i = 0; i < MathMax(rates_total - _prev_calculated, 1); ++i) ? ?{ ? ? ?open[i] = op[i]; ? ? ?high[i] = hi[i]; ? ? ?low[i] = lo[i]; ? ? ?close[i] = cl[i]; ? ?} ?}

最后,赫茲股票量化需要提供數(shù)據(jù)的上傳,讓我們使用來自 MetaQuotes 示例的 RefreshHistory 函數(shù)的實(shí)現(xiàn)(我們將此代碼作為 Refresh.mqh 頭文件包含在內(nèi))。


股票量化交易軟件:如何基于HTML和CSV報(bào)表可視化多幣種交易歷史的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
彩票| 泾川县| 锡林浩特市| 绍兴县| 牡丹江市| 海口市| 吉水县| 旬阳县| 大庆市| 乐安县| 大兴区| 霍林郭勒市| 屯门区| 禹州市| 临海市| 英超| 广西| 乌恰县| 湟中县| 西贡区| 保靖县| 深水埗区| 高淳县| 静海县| 潜山县| 松原市| 彭泽县| 茌平县| 睢宁县| 永丰县| 逊克县| 东丽区| 翁牛特旗| 称多县| 施秉县| 桐乡市| 榕江县| 河北区| 合水县| 连城县| 白城市|