量化軟件下載:赫茲量化在圖表上快速檢驗(yàn)交易理念
方法說(shuō)明
所有技術(shù)分析都基于一個(gè)簡(jiǎn)單的道理 - 價(jià)格反映一切。但有一個(gè)問(wèn)題 - 這種說(shuō)法缺乏力度。我們將目光轉(zhuǎn)向圖表并看到一個(gè)靜態(tài)圖像:價(jià)格實(shí)際上反映了所有一切。然而,我們希望知道價(jià)格在未來(lái)某個(gè)時(shí)期內(nèi)將反映什么以及它的走向,這樣我們就能盈利。源于價(jià)格的指標(biāo)正是設(shè)計(jì)用于預(yù)測(cè)可能的未來(lái)變動(dòng)。
我們從物理學(xué)得知,量值的一階導(dǎo)數(shù)是速率。因此,指標(biāo)計(jì)算當(dāng)前價(jià)格的變化速率。我們還知道,較大的量級(jí)具有較大慣性,在無(wú)相當(dāng)大的外力干涉下,可阻止速率的值大起大落。這就是我們逐漸接近趨勢(shì) - 在外力(新聞、中央銀行的政策等)未影響市場(chǎng)的時(shí)段內(nèi)當(dāng)其一階導(dǎo)數(shù)(速率)保持其值時(shí)的價(jià)格狀態(tài) - 概念的方式。
但是,讓我們返回我們的起點(diǎn) - 價(jià)格反映一切。要探尋新的理念,我們應(yīng)研究同一時(shí)間間隔的價(jià)格的行為及其派生物。只有仔細(xì)研究?jī)r(jià)格圖表,才能將您的交易從盲目跟風(fēng)上升到真正理解的程度。
這可能不會(huì)為交易結(jié)果帶來(lái)立竿見(jiàn)影的效果,但解答無(wú)數(shù)為什么問(wèn)題的能力遲早將起到積極作用。此外,對(duì)圖表和指標(biāo)的視覺(jué)分析將使您找到一些價(jià)格和指標(biāo)之間的全新的相關(guān)性 - 這是它們的開(kāi)發(fā)者完全沒(méi)有預(yù)料到的。
假設(shè)您發(fā)現(xiàn)一個(gè)似乎對(duì)您有利的新的相關(guān)性。下一步做什么呢?最簡(jiǎn)單的方法是編寫一個(gè)“EA 交易”并用歷史數(shù)據(jù)對(duì)其進(jìn)行測(cè)試,確保您的設(shè)想是正確的。如果事實(shí)并非如此,我們需要選擇一種常用的最優(yōu)化參數(shù)的方法。最糟糕的就是,我們無(wú)法回答這個(gè)為什么問(wèn)題。為什么我們的“EA 交易”最后虧損/盈利?為什么會(huì)有如此巨大的虧損?沒(méi)有答案,您無(wú)法有效地實(shí)現(xiàn)您的想法。
可執(zhí)行下述操作以看到從圖表獲得的相關(guān)性的結(jié)果:
創(chuàng)建或更改必要指標(biāo),以使其生成一個(gè)信號(hào):-1 為賣出,1 為買入。
連接顯示進(jìn)入點(diǎn)和退出點(diǎn)的余額指標(biāo)到圖表。該指標(biāo)還顯示當(dāng)處理信號(hào)時(shí),余額和資產(chǎn)凈值(點(diǎn)位)的變更。
分析在何種情形和狀況下假設(shè)成立。
該方法具有一定的優(yōu)勢(shì)。
首先,余額指標(biāo)完全使用 OnCalculate 方法計(jì)算,該方法具有最大計(jì)算速度并自動(dòng)在輸入計(jì)算數(shù)組中提供歷史數(shù)據(jù)。
其次,添加信號(hào)至現(xiàn)有指標(biāo)是通過(guò)向?qū)?chuàng)建“EA 交易”和創(chuàng)建自己的“EA 交易”的過(guò)渡步驟。
再次,可以在單個(gè)圖表上查看想法和最終結(jié)果。當(dāng)然,該方法也有一些局限性:信號(hào)與柱的收盤價(jià)相關(guān)聯(lián)、余額的計(jì)算針對(duì)固定手?jǐn)?shù)、未提供使用掛單交易的選項(xiàng)。然而,所有這些局限性可輕松解決/改善。
實(shí)現(xiàn)
我們開(kāi)發(fā)一個(gè)簡(jiǎn)單的信號(hào)指標(biāo)以了解它是如何工作的,并評(píng)估該方法的便捷性。我很早就聽(tīng)說(shuō)過(guò)燭形模式。所以,為什么不檢查一下它們的實(shí)際工作情況?我選擇“錘線”和“射擊之星”反向模式分別作為買入和賣出信號(hào)。下圖顯示了它們的示意外觀:

編輯切換為居中
圖 1. “錘線”和“射擊之星”燭形模式
現(xiàn)在,我們來(lái)定義當(dāng)“錘線”模式出現(xiàn)時(shí)的市場(chǎng)進(jìn)入規(guī)則。
燭形的最小值應(yīng)小于前五個(gè)燭形的最小值;
燭形的主體不應(yīng)超過(guò)它的總高度的 50%;
燭形的上影線不應(yīng)超過(guò)它的總高度的 0%;
燭形的高度不應(yīng)小于前五個(gè)燭形的平均高度的 100%。
模式的收盤價(jià)應(yīng)小于 10-周期移動(dòng)平均線。
如果滿足這些條件,我們應(yīng)建立買入持倉(cāng)。針對(duì)“射擊之星”模式的規(guī)則是一樣的。惟一的區(qū)別是我們應(yīng)建立賣出持倉(cāng):
燭形的最大值應(yīng)大于前五個(gè)燭形的最大值;
燭形的主體不應(yīng)超過(guò)它的總高度的 50%;
燭形的下影線不應(yīng)超過(guò)它的總高度的 0%;
燭形的高度不應(yīng)小于前五個(gè)燭形的平均高度的 100%。
模式的收盤價(jià)應(yīng)大于 10-周期移動(dòng)平均線。
對(duì)于我在圖形上使用的未來(lái)可進(jìn)行最優(yōu)化的參數(shù),我用粗體進(jìn)行了標(biāo)示(如果模式顯示可接受的結(jié)果)。我希望實(shí)施的限制允許我們從具有不恰當(dāng)外觀的信號(hào) (pp.1-3) 以及無(wú)法視作信號(hào)的已知弱信號(hào)清除模式。
此外,我們應(yīng)確定退出時(shí)機(jī)。由于提到的模式作為趨勢(shì)反向信號(hào)出現(xiàn),適當(dāng)燭形出現(xiàn)時(shí)趨勢(shì)存在。因此,追逐價(jià)格的移動(dòng)平均線也將出現(xiàn)。退出信號(hào)通過(guò)穿越價(jià)格及其 10-周期移動(dòng)平均線形成。
現(xiàn)在,是時(shí)候編寫一些代碼了。我們?cè)?MQL5 向?qū)е虚_(kāi)發(fā)一個(gè)新的自定義指標(biāo),將其命名為 PivotCandles 并說(shuō)明它的功用。讓我們定義返回值以連接余額指標(biāo):
-1 – 賣出倉(cāng)位開(kāi)倉(cāng);
-2 – 買入倉(cāng)位平倉(cāng);
0 - 無(wú)信號(hào);
1 – 買入倉(cāng)位開(kāi)倉(cāng);
2 – 賣出倉(cāng)位平倉(cāng)。
就像您所知道的那樣,真正的程序員不會(huì)尋找簡(jiǎn)單的方法,他們尋找最簡(jiǎn)單的方法。:) 我也不例外。一邊通過(guò)耳機(jī)聆聽(tīng)音樂(lè),一邊品嘗香濃的咖啡,我完成了包含要在指標(biāo)和“EA 交易”(我打算基于指標(biāo)開(kāi)發(fā)它的情形)中實(shí)施的類的文件。也許,甚至可以對(duì)它進(jìn)行修改以用于其他燭形模式。代碼本身乏新可陳。我相信代碼所附的注釋涵蓋了任何可能的問(wèn)題。
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PivotCandlesClass.mqh | //| ? ? ? ? ? ? ? ? ? ? ? ?Copyright 2012, MetaQuotes Software Corp. | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link ? ? ?"http://www.mql5.com" //+------------------------------------------------------------------+ //| Input parameters ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ input int ? ? ?iMaxBodySize ? ? ? ? ? ?= 50; ?// Maximum candle body, % input int ? ? ?iMaxShadowSize ? ? ? ? ?= 0; ? // Maximum allowed candle shadow, % input int ? ? ?iVolatilityCandlesCount = 5; ? // Number of previous bars for calculation of an average volatility input int ? ? ?iPrevCandlesCount ? ? ? = 5; ? // Number of previous bars, for which the current bar should be an extremum input int ? ? ?iVolatilityPercent ? ? ?= 100; // Correlation of a signal candle with a previous volatility, % input int ? ? ?iMAPeriod ? ? ? ? ? ? ? = 10; ?// Period of a simple signal moving average //+------------------------------------------------------------------+ //| Class definition ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ class CPivotCandlesClass ?{ private: ? MqlRates ? ? ? ? ?m_candles[]; ? ? ? ? ? ? ?// Array for storing the history necessary for calculations ? int ? ? ? ? ? ? ? m_history_depth; ? ? ? ? ?// Array length for storing the history ? int ? ? ? ? ? ? ? m_handled_candles_count; ?// Number of the already processed candles ? ? double ? ? ? ? ? ?m_ma_value; ? ? ? ? ? ? ? // Current calculated moving average value ? double ? ? ? ? ? ?m_prev_ma_value; ? ? ? ? ?// Previous calculated moving average value ? bool ? ? ? ? ? ? ?m_is_highest; ? ? ? ? ? ? // Check if the current candle is the highest one ? bool ? ? ? ? ? ? ?m_is_lowest; ? ? ? ? ? ? ?// Check if the current candle is the lowest one ? double ? ? ? ? ? ?m_volatility; ? ? ? ? ? ? // Average volatility ? int ? ? ? ? ? ? ? m_candle_pattern; ? ? ? ? // Current recognized pattern ? ? void ? ? ? ? ? ? ?PrepareArrayForNewCandle(); ? ? ? ?// Prepare the array for accepting the new candle ? int ? ? ? ? ? ? ? CheckCandleSize(MqlRates &candle); // Check the candle for conformity with patterns ? void ? ? ? ? ? ? ?PrepareCalculation(); protected: ? int ? ? ? ? ? ? ? DoAnalizeNewCandle(); ? ? ? ? ? ? ?// Calculation function public: ? void ? ? ? ? ? ? ?CPivotCandlesClass(); ? ? void ? ? ? ? ? ? ?CleanupHistory(); ? ? ? ? ? ? ? ? ?// Clean up all calculation variables ? ? double ? ? ? ? ? ?MAValue() {return m_ma_value;} ? ? // Current value of the moving average ? int ? ? ? ? ? ? ? AnalizeNewCandle(MqlRates& candle); ? int ? ? ? ? ? ? ? AnalizeNewCandle( const datetime time, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const double open, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const double high, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const double low, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const double close, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const long tick_volume, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const long volume, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const int spread ); ?}; //+------------------------------------------------------------------+ //| CPivotCandlesClass ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ //| Class initialization ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+