日本蜡烛图展示了一种显示一定时间内的价格信息的方式,呈现开盘价、收盘价、最高价、最低价之间的相关性。 蜡烛图主要用于技术分析,并根据众所周知的模型进行解释。
在编写了多个用于预测市场变动方向的指标之后,我想出了一个分析以下操作的可能性的办法:基于有关之前蜡烛图的方向的可用数据,初步预测日本蜡烛图方向。
本文介绍几个简单的预测方法,并引入多个用于测试这些办法和评估它们的有效性的 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 的条件:
结果比较所依据的标准是净利润和获利交易的百分比。
以下两个表格显示了 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%。
本文提供的测试结果已证实讨论的方法的效果不佳。
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程