![预测日本蜡烛图方向的简单方法](https://c.mql5.com/i/articles/overlay.png)
预测日本蜡烛图方向的简单方法
简介
日本蜡烛图展示了一种显示一定时间内的价格信息的方式,呈现开盘价、收盘价、最高价、最低价之间的相关性。 蜡烛图主要用于技术分析,并根据众所周知的模型进行解释。
在编写了多个用于预测市场变动方向的指标之后,我想出了一个分析以下操作的可能性的办法:基于有关之前蜡烛图的方向的可用数据,初步预测日本蜡烛图方向。
本文介绍几个简单的预测方法,并引入多个用于测试这些办法和评估它们的有效性的 EA。
第一种方法基于以下假设:下一个蜡烛图的方向与上一个蜡烛图的方向一致。 第二种方法假设下一个蜡烛图的方向与上一个蜡烛图的方向相反。 这些方法的优点在于它们的简单性。 我们将在“朴素法”部分中回顾这些方法。
第三种方法是前两种方法的组合。 首先,我们选择第一种或第二种方法,然后使用选定方法,直到预测结果与实际情况似有不同(当检测到错误时)。 在这种情况下,将使用另一种方法替换当前使用的方法。 此方法比前两种方法更加复杂,因为它会考虑之前阶段中发生的错误。 因而,我们将在“自适应法”部分中回顾此方法。
用于预测的基本数据
所有考虑的方法都依赖于有关之前蜡烛图的方向的信息。 因此,我们首先应考虑获取有关任何给定蜡烛图方向的信息的方式。
“蜡烛图方向”一词用于表示一个值,此值具备给定蜡烛图的开盘价和收盘价之间的差的符号。 鉴于此,任何蜡烛图的方向可以是以下三个值之一 -“方向向上”、“方向向下”和“没有方向”。
可分别使用开盘和收盘数组评估有关蜡烛图的 开盘价 和 收盘价 的信息。 这些数组将偏移量用作指数。 偏移量为蜡烛图从图表右侧计起的编号,编号从零开始计起。 这意味着当前蜡烛图的偏移量为零,前一个蜡烛图的偏移量为一。
// getting the direction of the candlestick double GetCandleDirection(int shift) { double diff=Close[shift]-Open[shift]; if (diff>0.0) { return (DIRECTION_UP); } else if (diff<0.0) { return (DIRECTION_DOWN); } else /*if (diff==0.0)*/ { return (DIRECTION_NONE); } }
此函数收到蜡烛图 偏移量, 并计算它的开盘价与收盘价之间的差。 根据产生的图像的符号,此函数返回以下三个常量之一的值: DIRECTION_UP、 DIRECTION_DOWN 或 DIRECTION_NONE。 这些常量分别对应于“方向向上”、“方向向下”和“没有方向”。
注意,应定义用于表示不同方向的常量的值,以便在计算相反方向时不会带来麻烦。 符号变化可作为一种计算相反方向的方式。 然后,可按如下方式定义这些常量:
// determining the possible candlestick directions #define DIRECTION_NONE 0 #define DIRECTION_UP 1 #define DIRECTION_DOWN -1
我们来使用本文附带的 CandleColor.mq4 指标安排单独输出图表中的蜡烛图方向。 此指标显示蜡烛图的方向(蓝色和红色直方图),以及基于方向数据的简单移动平均线,通过简单移动平均线,我们可以大体了解在一定时间内占主导地位的蜡烛图。
蜡烛图方向: 随着时间推移的行为。
如此指标所示,蜡烛图的方向经常发生变化,交替变化或一行中的几个蜡烛图保持不变。 显然,即使预测单个蜡烛图的方向,也是一项具有挑战性的任务。
我们来继续考虑和详细分析前面提到的方法。
朴素法
我们将从前两种方法开始。
- 下一个蜡烛图的方向与上一个蜡烛图的方向一致。
- 下一个蜡烛图的方向与上一个蜡烛图的方向相反。
为了测试这两种方法的有效性,开发并测试了一个 Expert Advisor(本文附带的 CandlePredTest_naive.mq4 文件)。
此 Expert Advisor 使用开盘价。 在每个新的条柱上,它关闭了之前建立的所有仓位(获利或止损),并按照下一个蜡烛图(刚刚建立)的假设方向建立了一个仓位。 下一个蜡烛图方向的预测由 ModelPredict 函数执行:
// forecasting based on the current model int ModelPredict() { if (modelState==STATE_NORMAL) { return (GetCandleDirection(1)); } else /*if (modelState==STATE_REVERSE)*/ { return (-GetCandleDirection(1)); } }
此函数实施两种预测方法。 方法的选择取决于 modelState 变量的值。
如果 modelState 变量取 STATE_NORMAL 值,预测将按照第一种方法进行,因而,此函数调用 GetCandleDirection(1) 获取上一个蜡烛图的方向,并返回获得的值作为下一个蜡烛图的方向。
如果 modelState 变量值为 STATE_REVERSE,使用第二种预测方法。 在这种情况下,通过符号变化执行相反方向的计算,即 ModelPredict 函数返回 -GetCandleDirection(1) 的值。,使用第二种预测方法。
尽管 Expert Advisor 的参数列表中缺少 modelState 变量,但在启动 Expert Advisor 之后,已从 initialModelState 外部变量中复制它的值:
// model state extern int initialModelState=STATE_NORMAL;
由于状态数量可能会进一步增加,而在开始操作时并不允许所有这些状态,因此代码会更加复杂。 你可以使用任意值表示状态。 例如,在考虑的 Expert Advisor 中,它们的定义如下:
// defining the model states #define STATE_NORMAL 0 #define STATE_REVERSE 1
Expert Advisor 的剩余代码提供有非常详细的注释,对读者而言,应该没有任何困难之处。
下面显示了测试 Expert Advisor 的条件:
- 仓交易量 - 0.1 手。
- 初始保证金 - $10,000。
- 时间范围 - 所有可用的时间范围。
- 操作模式 - STATE_NORMAL、 STATE_REVERSE,使用第二种预测方法。
- 测试周期 - 所有可用的历史。
- 工具:
- USDCHF
- GBPUSD
- EURUSD
- USDJPY
- AUDUSD
- USDCAD
- EURGBP
- EURCHF
- EURJPY
- GBPJPY
- GBPCHF
- EURAUD
结果比较所依据的标准是净利润和获利交易的百分比。
以下两个表格显示了 Expert Advisor 在 STATE_NORMAL 模式(第一种方法)下的结果。
净利润:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9902 | -9900 | -9903 | -9907 | -9901 | -9900 | -9927 |
GBPUSD | -9868 | -9864 | -9869 | -9887 | -9873 | -9868 | -9924 |
EURUSD | -9921 | -9957 | -9949 | -9941 | -9934 | -9910 | -9879 |
USDJPY | -9900 | -9905 | -9900 | -9905 | -9935 | -9926 | -9904 |
AUDUSD | -9952 | -9957 | -9966 | -9962 | -9961 | -9956 | -10000 |
USDCAD | -9901 | -9903 | -9901 | -9900 | -9902 | -9904 | -8272 |
EURGBP | -9862 | -9861 | -9864 | -9869 | -9875 | -9871 | -5747 |
EURCHF | -9862 | -9865 | -9865 | -9874 | -9869 | -9862 | -5750 |
EURJPY | -9866 | -9877 | -9964 | -9877 | -9869 | -9867 | -10000 |
GBPJPY | -9848 | -9841 | -9840 | -9845 | -9848 | -9870 | -9849 |
GBPCHF | -9891 | -9885 | -9850 | -9844 | -9857 | -9856 | -9891 |
EURAUD | -9865 | -9863 | -9868 | -9874 | -9861 | -9891 | -10000 |
获利交易的百分比:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 19.55 | 27.82 | 31.50 | 38.18 | 39.86 | 43.29 | 43.95 |
GBPUSD | 21.18 | 27.81 | 30.29 | 33.81 | 35.20 | 41.39 | 46.71 |
EURUSD | 26.06 | 33.20 | 34.59 | 37.55 | 41.64 | 43.73 | 44.37 |
USDJPY | 19.28 | 31.68 | 34.13 | 35.48 | 39.04 | 42.99 | 46.85 |
AUDUSD | 19.71 | 21.30 | 26.25 | 27.20 | 33.15 | 39.96 | 44.69 |
USDCAD | 21.88 | 25.13 | 27.59 | 31.79 | 33.07 | 39.48 | 46.40 |
EURGBP | 21.78 | 28.90 | 31.49 | 34.55 | 35.24 | 42.11 | 47.04 |
EURCHF | 28.70 | 27.86 | 27.85 | 31.13 | 32.90 | 39.08 | 47.65 |
EURJPY | 23.69 | 30.62 | 35.81 | 38.89 | 39.06 | 44.04 | 48.16 |
GBPJPY | 10.11 | 19.47 | 33.48 | 37.39 | 37.75 | 43.09 | 47.42 |
GBPCHF | 23.17 | 23.95 | 30.84 | 33.50 | 36.03 | 42.43 | 47.90 |
EURAUD | 1.65 | 7.35 | 16.55 | 22.24 | 27.65 | 36.11 | 44.64 |
第一种方法的测试显示结果不佳。 无论周期长短,我们看到所有工具都损失了保证金;这就是说,在更大的时间范围内,获利交易的数量有所增加,但从未超过 50%。
以下两个表格显示了 Expert Advisor 在 STATE_REVERSE 模式(第二种方法)下的结果。
净利润:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9900 | -9912 | -9902 | -9917 | -9915 | -9901 | +83 |
GBPUSD | -9864 | -9866 | -9869 | -9874 | -9870 | -9911 | -5565 |
EURUSD | -9920 | -9917 | -9923 | -9947 | -9922 | -9886 | +4249 |
USDJPY | -9906 | -9901 | -9906 | -9900 | -9900 | -9928 | +2003 |
AUDUSD | -9955 | -9956 | -9957 | -9956 | -9969 | -9947 | +1203 |
USDCAD | -9900 | -9900 | -9900 | -9900 | -9901 | -9906 | -3129 |
EURGBP | -9868 | -9862 | -9862 | -9863 | -9867 | -9902 | -9867 |
EURCHF | -9863 | -9861 | -9863 | -9862 | -9869 | -9869 | -6556 |
EURJPY | -9861 | -9864 | -9866 | -9868 | -9897 | -9886 | -10000 |
GBPJPY | -9850 | -9887 | -9905 | -9857 | -9969 | -9848 | -9964 |
GBPCHF | -9846 | -9841 | -9842 | -9842 | -9886 | -9914 | -9850 |
EURAUD | -9870 | -9866 | -9874 | -9910 | -9872 | -9872 | -2411 |
获利交易的百分比:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 18.38 | 27.41 | 33.76 | 37.46 | 42.28 | 46.71 | 52.15 |
GBPUSD | 18.59 | 27.71 | 34.07 | 39.01 | 43.79 | 47.33 | 49.39 |
EURUSD | 23.37 | 33.88 | 41.05 | 43.80 | 43.56 | 48.16 | 52.56 |
USDJPY | 16.88 | 30.39 | 38.13 | 40.29 | 43.94 | 46.62 | 49.34 |
AUDUSD | 18.84 | 22.52 | 25.39 | 29.83 | 36.36 | 43.51 | 49.84 |
USDCAD | 22.44 | 24.04 | 27.07 | 31.06 | 35.69 | 43.51 | 49.84 |
EURGBP | 20.52 | 28.89 | 35.18 | 38.82 | 42.41 | 45.82 | 45.55 |
EURCHF | 27.43 | 31.82 | 32.80 | 35.05 | 36.74 | 43.89 | 46.04 |
EURJPY | 18.79 | 28.15 | 37.09 | 39.80 | 43.05 | 44.15 | 46.92 |
GBPJPY | 10.02 | 19.76 | 31.92 | 38.06 | 41.84 | 44.32 | 47.53 |
GBPCHF | 19.87 | 27.24 | 33.72 | 35.70 | 39.74 | 47.59 | 46.11 |
EURAUD | 1.43 | 7.66 | 17.24 | 26.95 | 34.46 | 41.29 | 47.07 |
在测试第二种方法时,我们获得了混杂的结果。 除 D1 以外的所有时间范围上的结果都与第一种方法获得结果大致相同。 在 D1 上进行交易时,Expert Advisor 在 12 种工具中有 4 种工具获利。 获利交易的百分比接近于 50%,在两种情况中达到了 52%。
总之,Expert Advisor 的测试结果还有许多待改进之处。 我们来尝试使用这两种朴素法的组合来抵消它们的缺点。
自适应法
第三种方法的本质是,我们使用两种朴素预测方法中的一种方法进行预测,如果此方法出现错误,则替换为另一种方法进行预测。 这样,此方法适应预测序列的行为。
已通过测试相应的 Expert Advisor(本文附带的 CandlePredTest_adaptive.mq4 文件)验证此方法的有效性。
此 Expert Advisor 是 CandlePredTest_naive Expert Advisor 的改良版本。 其主要的差别在于,分析每个上一次预测以检查每个新条柱上是否发生错误。
// working function of the Expert Advisor int start() { // positions are opened once on each bar if (!IsNewBar()) { return (0); } // close all open positions TradeClosePositions(DIRECTION_UP); TradeClosePositions(DIRECTION_DOWN); // update the model state if (prediction!=DIRECTION_NONE) { ModelUpdate(prediction==GetCandleDirection(1)); } // predict the color of the next candlestick prediction=ModelPredict(); if (prediction==DIRECTION_NONE) { return (0); } // open a position in the right direction TradeOpenPosition(prediction,""); return (0); }
只有当 Expert Advisor 在上一个条柱上建仓时,即如果预测没有返回 DIRECTION_NONE 常量时,才分析错误。 在所有发生错误的情况中,闭合蜡烛图的预测方向与实际方向均不相符,而且在打开新条柱之后其偏移量等于一。
使用 ModelUpdate 函数—它接收预测修正标记 (prediction==GetCandleDirection(1)) 作为参数,将一个朴素预测方法替换为另一个朴素预测方法。
// updating the model state void ModelUpdate(bool correct) { // if the forecast was erroneous, change the model state if (!correct) { if (modelState==STATE_NORMAL) { modelState=STATE_REVERSE; } else /*if (modelState==STATE_REVERSE)*/ { modelState=STATE_NORMAL; } } }
此函数分析预测修正标记 (correct),如果发生错误, 将通过更改 modelState 变量的值来替换选定的朴素预测方法。 初始化之后,已从 modelState 变量中复制 modelState 变量的初始值。 它不是重要依据,因为 Expert Advisor 可以在操作过程中更改测试方法。
预测由 ModelPredict 函数负责执行,此函数与 CandlePredTest_naive Expert Advisor 中使用的函数类似。 由于 modelState 变量值的更改,将交替基于第一种和第二种方法执行预测。
在相同的条件下测试了 Expert Advisor,唯一的例外是 initialModelState 变量值固定不变的 (STATE_NORMAL)。
净利润:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9903 | -9905 | -9902 | -9915 | -9902 | -9907 | -3738 |
GBPUSD | -9866 | -9875 | -9876 | -9864 | -9867 | -9933 | -6404 |
EURUSD | -9924 | -9924 | -9931 | -9920 | -9920 | -9903 | -3779 |
USDJPY | -9904 | -9900 | -9900 | -9904 | -9920 | -9902 | -6493 |
AUDUSD | -9955 | -9954 | -9955 | -9995 | -9955 | -9965 | -8649 |
USDCAD | -9903 | -9902 | -9901 | -9911 | -9900 | -9904 | -1525 |
EURGBP | -9861 | -9867 | -9865 | -9862 | -9881 | -9877 | -9913 |
EURCHF | -9861 | -9862 | -9872 | -9881 | -9870 | -9875 | -9258 |
EURJPY | -9861 | -9865 | -9866 | -9868 | -9876 | -9905 | -9880 |
GBPJPY | -9842 | -9844 | -9867 | -9840 | -9919 | -10000 | -9933 |
GBPCHF | -9841 | -9843 | -9917 | -9840 | -9893 | -9848 | -9895 |
EURAUD | -9866 | -9869 | -9863 | -9872 | -9867 | -9904 | -7656 |
获利交易的百分比:
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 19.22 | 26.82 | 32.29 | 35.71 | 40.29 | 44.15 | 47.93 |
GBPUSD | 20.12 | 28.16 | 32.01 | 34.87 | 40.05 | 41.97 | 49.39 |
EURUSD | 25.24 | 32.65 | 38.32 | 39.48 | 41.50 | 45.81 | 48.88 |
USDJPY | 19.16 | 29.48 | 35.02 | 37.03 | 40.19 | 44.45 | 47.34 |
AUDUSD | 19.63 | 21.67 | 25.76 | 28.16 | 32.11 | 41.11 | 46.76 |
USDCAD | 22.84 | 24.46 | 27.39 | 29.79 | 34.44 | 42.26 | 48.46 |
EURGBP | 21.44 | 29.45 | 33.05 | 36.55 | 38.19 | 41.86 | 46.23 |
EURCHF | 27.51 | 29.98 | 30.92 | 34.44 | 34.09 | 40.87 | 44.27 |
EURJPY | 21.24 | 28.56 | 35.58 | 38.78 | 40.50 | 44.23 | 47.12 |
GBPJPY | 11.30 | 19.90 | 31.91 | 37.15 | 36.76 | 41.11 | 46.24 |
GBPCHF | 22.00 | 26.81 | 32.13 | 34.38 | 36.99 | 43.11 | 47.16 |
EURAUD | 1.50 | 6.56 | 15.14 | 22.25 | 31.63 | 37.96 | 47.70 |
与第一种和第二种方法相比,此测试方法的结果并没有明显更好。 在所有时间范围上,所有工具的利润均为负数,而获利交易的百分比未超过 50%。
总结
本文提供的测试结果已证实讨论的方法的效果不佳。
- 经证实,第一种方法极其无效。 很可能,需要在预测过程中进一步验证有关下一个蜡烛图的方向与上一个蜡烛图的方向相一致的假设。
- 与考虑的所有其他方法相比,第二种方法显示出了最好的结果。 然而,它需要更详细的分析。 例如,有关未获利的交易数量的数据可能会很有意思。
- 第三种方法展示的平均结果与第一种和第二种方法的展示的结果不相上下,需要进一步改进。 此方法背后的主要思想是,与朴素方法中使用的特性相比,改进其中使用的特性。 然而,它没有带来任何改进。 显然,此方法经常更换预测方法,这会导致更多的错误。
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1374
![用于在通道中进行交易的 Expert Advisor](https://c.mql5.com/2/17/834_22.gif)
![夜间交易的可靠度如何?](https://c.mql5.com/2/17/841_4.gif)
![外部指标的提醒和注释(第二部分)](https://c.mql5.com/2/17/825_12.gif)