量化交易软件:交易货币篮子时可用的形态

概论

我以前的 文章, 关于交易货币篮子的基本原则, 方法和术语。当然, 若想成功地遵循这种复杂的方法这些还不够。了解入场和离场条件, 以及信号, 仍然至关重要。换言之, 赫兹量化需要描述当前已知的, 可以显著提高盈利能力的形态。这是本文的目标 — 当处理货币篮子时, 为交易者提供已形成的形态详细描述。赫兹量化将使用的术语, 类似于之前文章中的篮子和技术工具的描述。我们还将应用威廉姆斯百分比范围 (WPR) 指标来分析货币篮子状态。

赫兹量化来简要描述这个指标。父辈的 WPR 数值范围从 0% 至 -100%。这个范围不适合我们, 原因如下所述。正确显示所有形态时, 需要转换的数值范围将超过零为 100% 到 -100%。这种变化可以很容易地在指标代码中完成。此外, 我们假设 父辈指标的现有超卖/超买级别仍然与合并后的级别相关, 因此我们将主动使用它们。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

动态入场特征。形态 #1, 2

动态入场意味着当指标信号达到特定值时即入场, 而不必等待当前蜡烛收盘。首先, 赫兹量化来考虑一个货币篮子形态的直观强化/弱化。从市场的角度来看, 这意味着一个或多个事件的产生, 将令投资者买入或卖出某种货币, 并迫使它相对于其它货币升值或贬值。例如, 欧洲央行行长德拉吉的公开出面可能很容易令欧元相对于其它货币强势或弱势。在这种情况下, 组合的 WPR 接近该范围的上边界或下边界。交易者可在指标达到特定值之后入场, 而不必等待蜡烛收盘再执行动态入场。

  • 形态 #1

这种形态在众多标准技术指标的描述中经常可以找到。

指标几乎触及边界, 然后反转并突破超买线向下或超卖线向上。这是篮子内所有货币的一个趋势跟随入场信号。

根据许多权威来源, 绝不应该动态地执行这样的入场。因此, 我强烈不推荐在交易中使用形态 #1。

  • 形态 #2

第二种形态是前一种形态的修改版本。

指标几乎触及范围边界, 并且将与当前趋势一起反转。这是篮子内所有货币的逆势入场信号。

根据单一指标读数预测即将发生的价格逆转是不正确的。但是, 请记住, 组合的 WPR 是一种不适合趋势交易的振荡器。在当前状况下, 指标可能在相当长的时间内徘徊于范围边界, 稍微偏离它们一点, 然后再次接近它们。与此同时, 当前的趋势持续令交易者的亏损扩大。当然, 终将会从边界回滚, 但它可能需要一段时间。没有人可以保证回撤能保持在可承受范围, 财会结果可能是毁灭性的。

不过, 有些交易者在指标显示的价值显著高于 90% 或低于 -90% 时使用此形态。原因是形态 #2 还具有显著的优点, 允许交易者在趋势开始时将其捕获。显然, 赫兹量化需要一些额外的入场信号。我们可以使用价格行为搜索它们。

此外, 如果它是由一条新传来的基本面消息而形成, 不建议交易这种形态。代之, 该形态在已形成的趋势中更可靠, 因为它也许暗示其接近末期。

例如, 赫兹量化可以在 2015 年 1 月中旬的黑天鹅事件期间使用 CHF 历史价格。历史监控记录附加在 CSV 文件 (MS Excel) 中。文件名对应于监控开始日期和时间。文件包含四个数据列:

监控时间

H1 指标读数

H4 指标读数

D1 指标读数

...

...

...

...

12:51:32

99.16

99.17

99.17

12:51:34

98.85

98.87

98.88

...

...

...

...

在此, 您可以看到较低时间帧相较于较高时间帧数据的变化, 以及指标读数是如何近乎抵达范围边界, 偏离并再次接近的。任何敢在这样的时刻入场的人, 肯定会迅速遭遇止损。

当然, 也可以在图表上找到对比例子, 当动态入场时带来的丰厚盈利。然而, 失败率奇高导致形态 #2 太冒险了。因此,我也不推荐它。

柱线收盘时入场。形态 #3

如果当前时间帧的蜡烛收盘之后, 组合 WPR 超买级别向下交叉, 或者超卖向上交叉, 则交易者收到篮子内所有货币对的入场信号。

这种入场方法对于某些货币对是广为人知的。不过, 如果我们留意到, 组合指标继承了前一篇文章中指定的父辈属性, 那么在处理货币对篮子时, 超卖/超买级别突破的条目可以被认为是有效的。此外, 由于级别突破伴随着边界范围附近的指标反转 (这意味着存在一些, 尽管短暂的走势), 顺势入场。形态 #3 的主要条件是当前时间帧蜡烛收盘之后再识别趋势。

入场本身则以标准方式执行。交易者可以追随市价或使用限价订单。然而, 在第二种情况下, 入场可能不会体现在所有货币对上。这可能反过来导致整个篮子的买卖操作整体亏损。赫兹量化使用下面的例子来说明这一点。

一名交易者使用篮子内所有货币对入场, 记住, 并非所有的货币对最终都有利可图。一些货币对也许显示零结果, 而如果区域消息大多转为负面, 有一些也许会亏损。由于欧元区的问题和不良统计, 假定 EURJPY 图表以跌势为主已经持续一段时间。因此, EUR 篮子的组合 WPR 线向下并开始接近范围边界。此刻, 市场情绪变化, 统计变得更加利多, 投资者的信心恢复。EURJPY 走势变得平坦, 看涨走势似乎是不可避免的。组合的 WPR 线反转并穿越超卖线。交易者遵循信号入场买入 EUR 货币篮子。但出于某种原因, EURJPY 图表仍然保持平稳, 甚至倾向于看跌走势。

为什么?因为有关欧元的利多消息之后是日元的利多消息。因此, 投资者已经开始购买日元, 将它推动向上 (也许甚至比欧元更快), 因此导致平坦甚至看跌的走势。因此, 交易者对这对货币的期望被证明是错误的。但篮子里还有其它没有新统计数据的货币对。它们赚取了盈利。但如果交易者已经使用限价订单来买入欧元篮子, 情况也许已经变得更不利, 因为并非所有货币对都可能在入场窗口期间被触发。甚或, 只有一对 (EURJPY) 可能已触发, 整体造成亏损。

赫兹量化考虑一个来自实际的案例。我们使用同一对 EURJPY, 并在 H1 上启动 testWPR.mq5 测试指标:

//+------------------------------------------------------------------+ //| testWPR.mq5 | //| MetaQuotes 软件公司| //| http://fxstill.com | //+------------------------------------------------------------------+ #property copyright "版权所有 2016, MetaQuotes 软件公司" #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_minimum -100 #property indicator_maximum 100 #property indicator_buffers 1 #property indicator_plots 1 input int WPR=14; // WRP 周期 input color clr= clrBlue; #define LG 7 string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"}; int h[LG]; double ind[]; //+------------------------------------------------------------------+ //| 自定义指标初始化函数 | //+------------------------------------------------------------------+ int OnInit() { //--- 指标缓存区映射 for(int i=0; i<LG; i++) { h[i]=iWPR(pair[i],0,WPR); } ArraySetAsSeries(ind,true); SetIndexBuffer(0,ind); IndicatorSetString(INDICATOR_SHORTNAME,"testWPR"); IndicatorSetInteger(INDICATOR_DIGITS,2); IndicatorSetInteger(INDICATOR_LEVELS,2); IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID); IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID); IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed); IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1); IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1); IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr); PlotIndexSetString(0,PLOT_LABEL,"_tstWPR_"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetValue(int shift) { double dBuf[1]; double res=0.0; for(int i=0; i<LG; i++) { CopyBuffer(h[i],0,shift,1,dBuf); res+=dBuf[0]; }//结束 for (int i = 0; i < iCount; i++) res=res/LG; return (NormalizeDouble((res + 50) * 2, _Digits) ); } //+------------------------------------------------------------------+ //| 自定义指标迭代函数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, 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[]) { //--- if(prev_calculated==0 || rates_total>prev_calculated+1) { int rt=rates_total-WPR; for(int i=1; i<rt; i++) { ind[i]= GetValue(i); } } else { } //--- 返回 prev_calculated 值用于下次调用 return(rates_total); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { for(int i=0; i<LG; i++) { if(h[i]!=INVALID_HANDLE) IndicatorRelease(h[i]); } string text; switch(reason) { case REASON_PROGRAM: text="指标通过调用 ExpertRemove() 函数终端其操作";break; case REASON_INITFAILED: text="此值意味着 OnInit() 处理器 "+__FILE__+" 已返回一个非零值";break; case REASON_CLOSE: text="终端已关闭"; break; case REASON_ACCOUNT: text="账户已改变";break; case REASON_CHARTCHANGE: text="品种或时间帧已改变";break; case REASON_CHARTCLOSE: text="图表已关闭";break; case REASON_PARAMETERS: text="输入参数已变更";break; case REASON_RECOMPILE: text="程序 "+__FILE__+" 已编译";break; case REASON_REMOVE: text="程序 "+__FILE__+" 已从图表上移除";break; case REASON_TEMPLATE: text="新模板已应用于图表";break; default:text="其它原因"; } PrintFormat("%s",text); } //+------------------------------------------------------------------+

由于组合 WPR 的范围是从 -100% 到 100%, 超买级别位于 60%, 而不是父辈 WPR 的 -20%。因此, 超卖级别在 -60%, 而非 -80%。牢记这一点, 赫兹量化在指标图表上标记这些级别。

我们应该分析超买/超卖级别交叉点。在写这篇文章的时候, 它在 H1 图表上位于一个三小时蜡烛的收盘 2016.10.17:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们假设我们已在那一刻入场。我们应事先定义离场点。当指标值即将离开或接近零轴时, 无论交易结果如何, 我们都将离场。这一刻将在同一天早上七点钟到来。赫兹量化用垂直线标记这两个点。EUR 篮子内其它货币对的截图可以在下面的归档中找到, 并且这些行已经被标记。注意 EURNZD 显示负结果, EURGBP 显示大约为零, 而剩余的五对则有盈利。

不过, 有个问题是超卖和超买级别是否正确。在比较前一篇文章中的标准和组合的随机振荡指标图表时, 很明显, 组合的指标更平滑。当比较标准和组合的 WPR 时, 可以看到同样的结果 (见下面的屏幕截图):

编辑切换为居中

添加图片注释,不超过 140 字(可选)

在此我们有组合的 (粗蓝线) 和标准 (浅蓝线) WPR 的图形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值