货币对形态测试: 实际应用和真实交易视角。 第四部分

Andrei Novichkov | 3 九月, 2018

概述

本文总结研究如何测试我们起初 在此 提出的交易货币对篮子时出现的形态。 我们现在要做的就是研究剩余的形态 — 与移动平均线交叉的图形。

以前,我们已经 分析过 这种形态,但参考了某些条件:

我们发现这种形态的正面特性是大量的信号。 缺点是需要额外的过滤。

现在,我建议在两个篮子的统合指标数值之间的差值图型上测试这种形态: 基准货币和报价货币 (详见此处)。 使用两个货币对篮子来替代一个货币对篮子可以作为额外过滤的因素。

此外,在本文的后半部分,我们将详细介绍在实际交易中应用所有获得的知识。

研究形态

我们来重复一下这种形态的基本要求: 移动平均线对于统合指标的突破应该清晰明显。

我们正在寻找的 "良好" 形态 (信号)
无形态, "坏" 信号




绿线是统合指标图型,粉红色是其移动平均线。

为了准确地识别形态,统合指标图型与移动平均之间在突破前后的距离必须不小于左图上指定的数值之一 (Delta1 和 Delta2)。 很明显,在右图像上,由蓝色垂直线限定的区域未满足该条件。 因此,那里没有形态。

在进一步的研究中,我们将检查如何使用与左图类似的形态作为输入信号。 同时到达但指向相反的形态可作为离场信号。 不过,这种战术意味着市场中的永久存在,这不太可能带来积极的结果。 因此,可建议检测 "坏" 形态作为离场信号。 这意味着订单将在不开新单的情况下平仓。

研究工具

我们已经拥有了所有工具。 我们在之前的文章中早就将它们开发完毕。 虽然代码没有太大变化,我们还是在这里展示它。 testEAbasket3.mq5 EA 作为主体运用:

//+------------------------------------------------------------------+
//|                                                 testEAbasket.mq5 |
//|                                  版权所有 2017, MetaQuotes 软件公司 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "版权所有 2017, MetaQuotes 软件公司"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\\Trade.mqh>


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum BSTATE
  {
   BCLOSE = 0,
   BBUY   = 1,
   BSELL  = 2
  };
//+------------------------------------------------------------------+
//| 智能系统初始化函数                                                  |
//+------------------------------------------------------------------+
input int wpr = 20;
input int ma  = 10;
input double lt=0.01; 

int h;
ulong  Ticket;

double m[1],ml;
double w[1],wl;

BSTATE g_state;

double g_dMinSize = 2.0;
double g_dMaxSize = 50.0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   h=iCustom(NULL,0,"testWPR&MA3",wpr,ma);
   if(h==INVALID_HANDLE) 
     {
      Print("Error while creating testWPR&MA3");
      return (INIT_FAILED);
     }

   g_state=BCLOSE;
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 智能系统逆初函数                                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| 智能系统逐笔报价函数                                                 |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| 定时器函数                                                         |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);
      double d1 = MathAbs(w[0] - m[0]);
      double d2 = MathAbs(ml - wl);
      if(w[0]>m[0] && wl<ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize) 
           {
            EnterBuy(lt);
            g_state=BBUY;
           }
        }
      if(w[0]<m[0] && wl>ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize) 
           {
            EnterSell(lt);
            g_state=BSELL;
           }
        }
     }
  }
//+------------------------------------------------------------------+

void CloseAllPos()
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.PositionClose(Ticket);
   g_state=BCLOSE;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterBuy(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Buy(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BBUY;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterSell(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Sell(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BSELL;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewCandle()
  {
   static int candle=-1;
          int t1=0;
   switch(_Period)
     {
      case PERIOD_H1:  t1 = Hour();   break;
      case PERIOD_H4:  t1 = Hour4();  break;
      case PERIOD_D1:  t1 = Day();    break;
     }
     
   if(t1!=candle) {candle=t1; return(true);}
   return (false);
  }
            
  int Hour4(){return((int)Hour()/4);}

int Day()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day);
  }

int Hour()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.hour);
  }

这个 testEAbasket.mq5 EA 版本来自 这篇文章,入场部分修改为单个货币对,而非整个篮子。 EA 利用 testWPR&MA3.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 2
#property indicator_plots   2

input int WPR       = 20; // WPR 周期
input int maperiod  = 10; // MA 周期
input color   clr   = clrGreen;
input color   clrMA = clrMagenta;


int h,h1;
double ind[],ma[];

//+------------------------------------------------------------------+
//| 自定义指标初始化函数                                                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指标缓存区映射
      h = iCustom(NULL,0,"testWPReur",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRusd",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }  
 

   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRusd");
   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);

   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);
   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,"_tstWPRusd_");

   ArraySetAsSeries(ma,true);
   SetIndexBuffer(1,ma);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrMA);
   PlotIndexSetString(1,PLOT_LABEL,"Middle_Basket_line_MA");


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/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);
        }
      rt-=maperiod;
      for(int i=1; i<rt; i++)
        {
         ma[i]=GetMA(ind,i,maperiod,_Digits);
        }
     }
   else
     {
         ind[0] = GetValue(0);
         ma[0]  = GetMA(ind, 0, maperiod, _Digits);        
     }
//--- 返回 prev_calculated 的值用于下次调用
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
      if(h!=INVALID_HANDLE) IndicatorRelease(h);
      if(h1!=INVALID_HANDLE) IndicatorRelease(h1);
  }
//+------------------------------------------------------------------+

double GetMA(const double &arr[],int index,int period,int digit) 
  {
   double m=0;
   for(int j=0; j<period; j++) m+=arr[index+j];
   m/=period;
   return (NormalizeDouble(m,digit));
  }
//+------------------------------------------------------------------+

该指标已有轻微变化以便匹配上述形态识别条件。 所有使用的工具都可以在附件 test.zip 存档中找到。

此前,类似的研究始于对潜在进场次数的定义。 此处不是这种情况,因为依我们测试这种形态的经验来看交易次数足够。

在测试之前,我们来指定形态的形式。 我们已为 Delta1 和 Delta2 参数精心指定了 足够的时间。 已经发现这些值,并针对进场信号实现了严格的过滤。 在此,我们将放松一些限制。 这将增加进场次数,但不会影响形态的基本原则: Delta1 和 Delta2 应至少为 2% 且不超过 50%。

我们从两种测试策略中选择其一。

现在,我们来定义时间帧。 在之前的文章中,我们在 H1,H4 和 D1 上测试了形态。 D1 上显示的交易很少,因此我们将忽略它。 我们只会保留 H1 和 H4 并从 EURUSD 开始测试。

测试形态

在去年的 H1 报价上进行测试后,得到以下结果:

在 H4 时间帧上:

与之前的测试一样,我们看到在 H1 上亏损,而在 H4 上盈利。

我们在主要货币对上测试了形态: EURUSD,GBPUSD,AUDUSD,NZDUSD,USDCAD,USDCHF 和 USDJPY。

测试没有产生任何意外。 结果与已经得到的数据类似: H4 上令人鼓舞,而在 H1 上亏损。 测试报告可以在附件 testhtml.zip 存档中找到。

我们已有通过引入额外的输入信号排列来增加盈利的经验。 即利用在 文章 中的第二个过滤器:

更正的 EA 代码位于附件的 test1.zip 存档中。 在此展示整个代码没有意义,因为它几乎与 之前展示的那个 相同。 我只展示直接识别形态的函数:

//+------------------------------------------------------------------+
//| 定时器函数                                                         |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);
      double d1 = MathAbs(w[0] - m[0]);
      double d2 = MathAbs(ml - wl);
      if(w[0]>m[0] && wl<ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize && w[0] < 60) 
           {
            EnterBuy(lt);
            g_state=BBUY;
           }
        }
      if(w[0]<m[0] && wl>ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize && w[0] > -60) 
           {
            EnterSell(lt);
            g_state=BSELL;
           }
        }
     }
  }
//+------------------------------------------------------------------+

我们应该在哪里设置超买和超卖级别? 在之前的文章中,我们表明,基于 WPR 的组合指标的标准值 (超买级别为 +60,超卖级别为 -60) 在测试条件下可以略微调低。 除标准值选项外,我们来测试超买和超卖级别分别为 +50% 和 -50% 的值。 H1 和 H4 上的 EURUSD 测试报告位于 testhtml50.zip 和 testhtml60.zip 存档中。

正如我们所见,它们与上述前两个测试没有区别。 这与 上一篇文章 当中专门用于测试此形态的结果一致。 退到那时,这样的过滤也没有产生任何明显的结果。 因此,我们不会在剩余的货币对上测试这种形态并进入最后一部分 — 将其用作过滤器。

我们来简要回顾一下这个情况。

testEAbasket5.mq5 EA 用于测试:

//+------------------------------------------------------------------+
//|                                                 testEAbasket.mq5 |
//|                                  版权所有 2017, MetaQuotes 软件公司 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "版权所有 2017, MetaQuotes 软件公司"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\\Trade.mqh>



enum BSTATE
  {
   BCLOSE = 0,
   BBUY   = 1,
   BSELL  = 2
  };
//+------------------------------------------------------------------+
//| 智能系统初始化函数                                                  |
//+------------------------------------------------------------------+
input int wpr = 20;
input int ma  = 10;
input double lt=0.01; //手数

int SELLPROFIT =   0;
int SELL1LIMIT =  50;
int SELL2FROM  =  40;
int SELL2TO    =  20;
int BUYPROFIT  =   0;
int BUY1LIMIT  = -50;
int BUY2FROM   = -40;
int BUY2TO     = -20;


int h;
ulong  Ticket;

double m[1],ml;
double w[1],wl;

BSTATE g_state;

double g_dMinSize = 2.0;
double g_dMaxSize = 50.0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   h=iCustom(NULL,0,"testWPR&MA3",wpr,ma);
   if(h==INVALID_HANDLE) 
     {
      Print("Error while creating testWPR&MA3");
      return (INIT_FAILED);
     }

   g_state=BCLOSE;
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 智能系统逆初函数                                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| 智能系统逐笔报价函数                                                 |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| 定时器函数                                                         |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);


      if(g_state==BBUY && (w[0]>=BUYPROFIT))
        {
         CloseAllPos();
        }
      if(g_state==BSELL && (w[0]<=SELLPROFIT))
        {
         CloseAllPos();
        }
      if(g_state==BCLOSE && w[0]>=BUY2FROM && w[0]<=BUY2TO && wl<=BUY1LIMIT && w[0] > m[0])
        {
            EnterBuy(lt);
            return;        
        }
        
 
      if(g_state==BCLOSE && w[0]<=SELL2FROM && w[0]>=SELL2TO && wl>=SELL1LIMIT && w[0] < m[0])
        {
            EnterSell(lt);
            return;        
        }
     }
  }
//+------------------------------------------------------------------+

void CloseAllPos()
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.PositionClose(Ticket);
   g_state=BCLOSE;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterBuy(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Buy(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BBUY;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterSell(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Sell(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BSELL;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewCandle()
  {
   static int candle=-1;
          int t1=0;
   switch(_Period)
     {
      case PERIOD_H1:  t1 = Hour();   break;
      case PERIOD_H4:  t1 = Hour4();  break;
      case PERIOD_D1:  t1 = Day();    break;
     }
     
   if(t1!=candle) {candle=t1; return(true);}
   return (false);
  }
            
  int Hour4(){return((int)Hour()/4);}

int Day()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day);
  }

int Hour()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.hour);
  }

像往常一样,我们从 EURUSD H1 和 H4 开始测试。

H1 时间帧的结果:

H4 时间帧的结果:

正如我们所见,交易次数很少。 我们已经 讨论过 这种现象,甚至提出了其根源。 剩余货币对的交易吃书甚至可能更少。 所以,我们完成测试并继续得出结论。

结果

  1. 我们已研究过在交易中使用货币对篮子的方法。 已提供了基本原理和概念,以及基本计算类型。
  2. 在交易货币对篮子时会出现的若干种简单形态也已描述过了。
  3. 使用篮子时出现的更复杂结构已也简要研究 — 同时使用标准技术指标和专门为货币对设计的指标; 同时使用振荡器和趋势跟踪指标。
  4. 查验已检测到的形态效率。

我们已经获得了一款工具,令我们能够以一种新的、合理的、且合乎逻辑的方式看待市场。 但是,测试形态并没有展现出令人信服的结果。 虽然,本不该期待一些其它东西。 毕竟,交易公理宣称需要若干信号才能做出入场决策,而我们仅依据单一形态就要做出决定。

经验表明,交易最简单的形态 (例如,当图表与移动平均线交叉时) 是非常危险的。 但是,我们也用简单的形态,并在某些情况下获得了令人鼓舞的结果。 此外,请牢记,我们的目标不是一款盈利的 EA。 相反,我们希望获得可与其它信号组合,并用来做出交易决策的可行信号。

我们来评估在日常实践和自动交易中运用所述方法的远景和可能的选择。

实际交易中的前景与应用

在研究这个问题时,大家不能脱离测试指标和 EA。 需要利用可靠工具的示例。 市场 拥有其中一些功能,而其它功能很快就会添加到其中。 在文章中,我将仅提供此类程序的示例,而不会指出它们得真实名称。 

使用篮子形态的主题及其众多。 每天都会出现新的交易方法,因此无法将它们浓缩到一篇文章中。 但能用单独的帖子,屏幕截图或模板的形式添加到它之中。 我的博客中已 存在 一些素材。 我将来会扩充这些信息。

入场/离场详情

我们来研究一下 NZDUSD H1 得入场和离场细节。 统合指标检测到一个买入信号,结果证明是可盈利的 (垂直蓝线):



在左侧,我们可以看到基准货币和报价货币篮子的统合指标值之间的差值图型。 该指标的 "拟方程" 可如下书写:

Indicator (NZDUSD) = Indicator (NZD) — Indicator (USD)

如果没有特别指定,我们假设文章中的所有统合指标均默认应用这种显示类型

可能的输入选项如下。

  1. 较低的红色水平线是超卖等级。 我们可以看到,指标图型的形态首先形成了突破这一等级。 这个位置用垂直绿线标记,而形态本身在蜡烛 1 开盘时被识别。 此刻,您可开多头单: 下跌趋势已经耗尽其能量,并开始逆转。 交易者捕捉到这一走势的开始,并能捕捉到整个上升趋势。 我们已测试了这种形态。 这是相当危险的 (因为下跌趋势可能在调整后继续),且很少出现。 在这种情况下,交易者的潜在亏损并不太多。 这里可以使用较短的止损。
  2. 然而,在屏幕截图中,我们看到新的上升趋势开始获得动力。 新形态正在形成 — 指标图型突破了移动平均线。 超卖等级被突破之后,这是一个良好的信号滤波器。 它降低了下跌趋势持续的风险。 该形态还标有绿色垂直线,并可以在蜡烛 2 的开盘处识别。 您也可以在此刻入场。 通常,止损应该更大 (由移动平均线参数定义)。
  3. 在上升趋势增强后,出现一个新形态 — 快速均线突破慢速均线。 这种形态在蜡烛 3 的开盘处被识别。 与前两种情况相比,风险很小。 但是,盈利能力较低,而止损较大。 注意在检测到形态后移动平均线之间的距离如何增加。 这示意趋势变得更强 — 这对交易者来说是一个有利的信号。 距离的减小表示减速和减弱 (参见左侧屏幕截图)。

注意,使用这些形态入场的前两个变体对于所有类型的振荡器都是典型的,并且是众所周知的。 第三种形态并不那么受欢迎。 它也适用于所有振荡器,但在此它被视依据已建立正发展的趋势入场的一个示例。

所有三个入场选项都通过强大的初始信号得到统合 — 突破超卖等级。 不过,这种信号非常罕见。 我们再次简要分析一下。

然而,这种有利的事件组合很少发生。 这是否意味着我们要为得到信号而等待数周? 没必要! 可以假设超买/超卖等级处于略低的层级。 每个货币对和每个时间帧的数值都可以不同。 但似乎在大多数情况下,+50% 和 -50% 的等级就足够了。 这无疑增加了风险。 让我们再看看右侧的截图。 等级的新布局意味着两个篮子中的一个 (甚至两个!) 还没有耗尽它的动量。 因此,它可能会持续,且交易者可能面临逆势入场的风险。 因此,形态 3 特别重要,因为它意味着顺势入场。 然而,这里也存在一个陷阱,即背离:



在右侧的屏幕截图中,我们看到向上的快速均线如何突破慢速均线,而指标本身也向上移动。 在左侧的屏幕截图中,我们观察到一个背离: 指标和均线图型向不同方向移动。 当然,应该跳过背离的信号! 我的 新闻专线 有其它各种形态包含及不包含背离的示例。

现在,我们来研究离场的可能方式 (订单平仓)。

假设交易者遵照上述三种方式之一入场。 相反的信号可用于持仓的完全或部分平仓或将其移至盈亏平衡点。

1. 例如,指标进入超卖区域 — 这是多头持仓平仓或将其移至盈亏平衡的显要原因 (空头持仓相反)。

2. 交易者可检测与手中持仓方向相反的均线突破指标图型的信号。

3. 交易者可通过快速和慢速均线间的距离减小来检测趋势正在减缓。

4. 最后,依照指标触及非超买/超卖等级的数值,作为平仓或/移动到盈亏平衡的信号。 例如, 这也许是 等级 0%。 这一级别意味着两种货币篮子的 "相等"。 指标往往在这样的等级上 "徘徊"。 因此,这个等级是一个阻力:

菲波纳奇级别也可用于统合指标中的等级。 

5. 最后一件事: 交易者可以根据自己的考量或标准技术分析来分配止损和止盈。

我们已研究开单和平单的方法。 现在,我们在图表上搜索形态并进行分析。

使用统合指标操作


若要识别检测到的形态,请将统合指标放在图表上并查看结果。 以下是 NZDUSD H1 的最新示例 (由于尺寸限制,图表分为两个图像):


注意,在退出超买/超卖区域附近检测到形态 3 和 7。 这里没有背离,而在形态 3 中价格穿过零轴大幅上涨。 另一方面,形态 7 区域的移动相对较弱。 强劲走势减慢并回滚。 图型尚未穿过零轴,且能够从它的位置反弹 (这正是我们所看到的)。

形态 8 示意从超卖等级反弹。 图形触及到它,反转并强烈向上形成形态。 穿过零轴令其得可以走得更久。 但是,指标图型和价格反转并向相反方向移动。 稍后,交易者将能够以最小的损失平单,否则,亏损可能变得非常可观。

形态 6 不是很有前途: 空头潜力几乎耗尽,并触及超卖等级。 逆转的风险很高。 在实践中,我们看到长时间的横盘走势,这根本无利可图。 向下的走势再次开始,尽管很久以后: 这种形态可以被视为是长期存在的。

在类似于形态 6 的条件下,形态 5 非常有前途。 因此,我们不应任性地丢弃超买/超卖区域附近指标检测到的形态,因为趋势在检测到它们的时刻仍可持续。

形态 4 也在零轴附近移动而不会突破它。 没有背离,指标图型正在水平移动。

形态 2 很有前途。 下行走势减慢,但未触及零轴即反转。 由于图型尚未达到超卖等级,因此没有背离。 虽然该指标随后走势平稳,但该形态仍然带来了良好的利润。

我们不会考虑形态1: 我们不知道它在形成之前发生了什么。

除了发现的形态外,值得注意的是与标有蓝色箭头的区域类似的地方。 离开超买区域并突破零轴来到超卖等级,这是一个强烈而稳定的走势。 该指标没有找到该形态,尽管两条均线均已突破。 这里没有背离。 如果指标突破零轴,则考虑入场,特别是这一突破与快速均线突破慢速均线相吻合。

请注意,我们的分析方法并不简单。 它含有很多模糊之处,因为我们最终可能会亏损一次。 为了在组合指标的帮助下增加分析的可能性,我们应该采用下一阶段 — "高级" 分析。


组合指标的高级操作

我们要说的第一件事是在一幅单一图表上使用一个组合指标的两个副本。 间接地,上一节已经提到了这种可能性。 现在,我们将更详细地研究它。

此处显示 USDCAD 上的指标。 在 V2 窗口中,货币对 USD 篮子的状态显示为深绿色线,而 CAD 货币篮子显示为橙色线。

在 V1 窗口中,指标检测到两种入场形态 (1 和 2)。 两种情况都没有背离,入场皆有可能盈利。

我们来看看窗口 V2,形态 1。 在这里,我们可以看到 CAD 篮子处于超买状态,现在正在走弱,逼近零轴。 USD 篮子也在减弱,同时在离开超买区域。 然而,走弱最终停止,并转为横向走势。 在模式检测的那一刻,走势趋于向上。 因此,入场做多是合理的。

我们来看看第 2 个点位。 此处的情形风险更大,因为两个篮子都穿过了 V2 窗口中的水平线段。 因此,它们中的任何一个都可以朝任何方向前进从而导致可能的亏损。

此外,交易者可以关注第 3 个点位。 那里没有形态,但在 V2 窗口中,我们清楚地看到两个篮子都超越了彼此的超买和超卖区域。 这意味着交易者也许捕捉到了趋势刚刚逆转的开始。

在这种情况下,交易者 "默认情况下" 在指标图型上查找形态,然后利用同一指标的第二个实例的另一种数据显示方式来细化图像。

使用组合指标的第二种有趣方法是将它们与标准指标一起使用。 以下是采用基于 WPR 的组合指标与常见的标准 WPR 的示例:

这与来自 USDCAD 图表的同一段落几乎相同。 以前,我们已经发现形态 1 适合入场,而形态 2 则要冒更大的风险。 现在看看形态 3,也不太成功。 它没有背离,但它也没有带来利润。 在标准的 WPR 窗口中,为什么会发生这种情况变得很明显: WPR 处于超买区域。 作为结果,该货币对横盘,随后也许会出现调整甚至趋势逆转。 形态 2 展示出横盘走势,以及随后的调整。 形态 1 仍然很强劲。 在顺势入场的情况下,WPR 指标仍然距超买区域有足够的范围,而零轴已被穿过。 这意味着该形态的潜在盈利能力,随后得到确认。

现在我们将提供一个不太令人印象深刻的 "合作" 示例。 我们将使用相同的 USDCAD 货币对。 段落和时间帧也一样。 该窗口包含随机振荡器和标准 WPR 的组合。 示意先前已检测到形态的垂线得以保留作为参考:


直接组合随机振荡器未能产生任何明显的形态。 与组合 WPR 一样,它假设形态 1 和 3 适合入场。 形态 2 展现出背离,这意味着我们不能依靠它来入场。 请注意,WPR 认定的超买区域,在 STOCH 组合中却被视为横盘区域。 这是组合指标的 另一个示例

使用上述组合指标的方法并不是唯一可行的方式,但它们非常容易识别,明显和有效。

结束语

在我们的系列文章中,我们研究了交易货币篮子时出现的形态。 我们描述了入场和离场的方法,以及运用它的重要原则。

大多数示例都是使用组合 WPR 实现的。 不过,还有其它组合指标,如 STOCH,RSI,TDI 等。 它们共同构成了交易货币篮子的指标策略。 运用这种策略并不容易,只有经验丰富、有思想的交易者才能掌握。

还有进一步的发展机会吗? 当然,它们会有。 我们一定会在以后描述它们。


本文中使用的程序

 # 名称
类型
 描述
1 test.zip 存档
形态测试工具
2
testhtml.zip 存档 来自 test.zip 存档的使用工具进行测试的结果
3 test1.zip 存档 含过滤器的测试 EA 代码
4 testhtml50.zip 存档 来自 test1.zip 存档的使用工具进行测试的结果
5
testhtml60.zip 存档
来自 test1.zip 存档的使用工具进行测试的结果
 6 testEAbasket5.mq5  EA 测试 EA