下载MetaTrader 5

预测日本蜡烛图方向的简单方法

11 四月 2016, 17:54
Evgeniy Logunov
0
3 486

简介

日本蜡烛图展示了一种显示一定时间内的价格信息的方式,呈现开盘价、收盘价、最高价、最低价之间的相关性。 蜡烛图主要用于技术分析,并根据众所周知的模型进行解释。

在编写了多个用于预测市场变动方向的指标之后,我想出了一个分析以下操作的可能性的办法:基于有关之前蜡烛图的方向的可用数据,初步预测日本蜡烛图方向。

本文介绍几个简单的预测方法,并引入多个用于测试这些办法和评估它们的有效性的 EA。

注意! 本文附带的 Expert Advisor 仅用于在策略测试程序中使用。

第一种方法基于以下假设:下一个蜡烛图的方向与上一个蜡烛图的方向一致。 第二种方法假设下一个蜡烛图的方向与上一个蜡烛图的方向相反。 这些方法的优点在于它们的简单性。 我们将在“朴素法”部分中回顾这些方法。

第三种方法是前两种方法的组合。 首先,我们选择第一种或第二种方法,然后使用选定方法,直到预测结果与实际情况似有不同(当检测到错误时)。 在这种情况下,将使用另一种方法替换当前使用的方法。 此方法比前两种方法更加复杂,因为它会考虑之前阶段中发生的错误。 因而,我们将在“自适应法”部分中回顾此方法。



用于预测的基本数据

所有考虑的方法都依赖于有关之前蜡烛图的方向的信息。 因此,我们首先应考虑获取有关任何给定蜡烛图方向的信息的方式。

“蜡烛图方向”一词用于表示一个值,此值具备给定蜡烛图的开盘价和收盘价之间的差的符号。 鉴于此,任何蜡烛图的方向可以是以下三个值之一 -“方向向上”、“方向向下”和“没有方向”。

可分别使用开盘和收盘数组评估有关蜡烛图的 开盘价收盘价 的信息。 这些数组将偏移量用作指数。 偏移量为蜡烛图从图表右侧计起的编号,编号从零开始计起。 这意味着当前蜡烛图的偏移量为零,前一个蜡烛图的偏移量为一。

// 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_UPDIRECTION_DOWN DIRECTION_NONE。 这些常量分别对应于“方向向上”、“方向向下”和“没有方向”。

应注意,所有考虑的预测方法都为一个特殊的例子而准备:如果无法确定前一个蜡烛图的方向( GetCandleDirection(1) 调用返回了值 DIRECTION_NONE),则同样无法确定下一个蜡烛图的方向作为预测结果。 在这些情况下,编写用于测试这些方法的 Expert Advisor 不会进入市场。

注意,应定义用于表示不同方向的常量的值,以便在计算相反方向时不会带来麻烦。 符号变化可作为一种计算相反方向的方式。 然后,可按如下方式定义这些常量:

// determining the possible candlestick directions
#define DIRECTION_NONE 0
#define DIRECTION_UP 1
#define DIRECTION_DOWN -1

我们来使用本文附带的 CandleColor.mq4 指标安排单独输出图表中的蜡烛图方向。 此指标显示蜡烛图的方向(蓝色和红色直方图),以及基于方向数据的简单移动平均线,通过简单移动平均线,我们可以大体了解在一定时间内占主导地位的蜡烛图。


蜡烛图方向: 随着时间推移的行为。

如此指标所示,蜡烛图的方向经常发生变化,交替变化或一行中的几个蜡烛图保持不变。 显然,即使预测单个蜡烛图的方向,也是一项具有挑战性的任务。

我们来继续考虑和详细分析前面提到的方法。



朴素法

我们将从前两种方法开始。

  1. 下一个蜡烛图的方向与上一个蜡烛图的方向一致。
  2. 下一个蜡烛图的方向与上一个蜡烛图的方向相反。

为了测试这两种方法的有效性,开发并测试了一个 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) 的值。,使用第二种预测方法。

ModelPredict 函数没有使用与 第二种方法对应的 STATE_REVERSE 常量的明确比较。 在 Expert Advisor 代码中,假设用户输入的数据始终正确,且 modelState 变量始终取以下两个值之一: STATE_NORMAL 或者: STATE_REVERSE,使用第二种预测方法。 可通过从函数的正文中移除注释括号“/*”和“*/”来启用明确比较,从而将另一个条件运算符 if 添加到代码中。

尽管 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_NORMALSTATE_REVERSE,使用第二种预测方法。
  • 测试周期 - 所有可用的历史。
  • 工具:

    1. USDCHF
    2. GBPUSD
    3. EURUSD
    4. USDJPY
    5. AUDUSD
    6. USDCAD
    7. EURGBP
    8. EURCHF
    9. EURJPY
    10. GBPJPY
    11. GBPCHF
    12. 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 Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/1374

附加的文件 |
夜间交易的可靠度如何? 夜间交易的可靠度如何?

本文涵盖了对交叉货币对进行夜间横盘交易的细节。 它解释了在哪里可以期待获得利润以及为什么有可能出现重大亏损。 本文还提供了一个用于夜间交易的 Expert Advisor 示例,并讨论了该策略的实际应用。

外部指标的提醒和注释(第二部分) 外部指标的提醒和注释(第二部分)

自发表了“外部指标的提醒和注释”文章以来,我不断收到关于开发基于指标线运行的外部通知程序的可能性的请求和询问。 在对问题进行分析之后,我决定继续探讨该话题。 获得储存在指标缓冲区中的数据成为用户的另一个关注领域。

用于在通道中进行交易的 Expert Advisor 用于在通道中进行交易的 Expert Advisor

Expert Advisor 绘制通道线。 上下通道线作为支撑位和阻力位。 Expert Advisor 标记基准点,并在价格达到或穿过通道线时提供声音通知,并绘制相关标记。 分形形成时,对应的箭头将显示在最后一个条柱上。 突破通道线意味着可能会形成上涨趋势。 Expert Advisor 自始至终都有大量的注释。

EA 状态短信通知 EA 状态短信通知

开发一个可以将你的 EA 状态通知你的短信通知系统,无论你在何处,都能始终了解任何紧急情况。