下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2014.02.03 07:21
指标

理想的之字线 - MetaTrader 5脚本

| Chinese English Русский Español Deutsch 日本語 Português

显示:
767
等级:
投票: 49

这是一个简单但是非常快速的之字线指标.

没有暂停或者错误的顶峰. 顶峰的获取已经进行了对时间的优化

理想的之字线

优势:

  1. 在计算中最有价值的函数是iBarShift. 它完全替代了所有需要获取顶峰的循环. 这样, 它被ArrayBSearch所替代. 这表明本指标比它在 MQL4 中的对应指标效率更高;
  2. 每个柱所有必要的数据每时每刻都能够访问, 而且EA交易还可以在历史中的任何时间访问它们;
  3. 没有暂停;
  4. 使用更加有效的方法寻找峰谷, 不需要搜索指标值;
  5. 非常快速;
  6. 在历史中有插入数据和切换时段时都能正确工作;
  7. 很适合在EA交易中使用.

劣势:

  1. 内存需求大. ZigZag 需要两个缓冲区 (因为有延迟所以一个不够) 以正确绘制, 而这里要使用5个缓冲区. 以我的观点, 这点不利完全可以被优势 #6所超越. 没有一个快速 ZigZags 能够在两个缓冲区基础上正确处理历史的插入.
  2. 有额外的线. 这是为了能够使EA交易中能够看到数据. 这些线不应该被显示.

原则:

ZigZag 是根据通道原则绘制的. 通道宽度可以通过点数 (IdealZZ) 定义或者百分比 (IdealZZP)定义

获取峰谷:

input int ChannelWidth=100;

#property indicator_chart_window

datetime LastTime;
int ZZHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   LastTime = 0;
   ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
bool GetValue(double dir,int bar,int prevBar,double &peak,
             int &peakBar,datetime &peakTime,const datetime &T[])
  {
   if(dir<0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else if(dir>0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else
     {
      return(false);
     }

   return(true);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
void SetPt(string name,double price,datetime time)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108);
   ObjectSetDouble(0,name,OBJPROP_PRICE,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,time);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &T[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(LastTime==T[0]) return(rates_total);
   LastTime=T[0];

   ArraySetAsSeries(T,true);

   double dir_[1];
   if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total;
   double dir=dir_[0];
   double rdir=-dir;

   if(dir==EMPTY_VALUE) return(rates_total);

   double v1,v2,v3,v4,v5;
   int    i1,i2,i3,i4,i5;
   datetime t1,t2,t3,t4,t5;

   if(
      GetValue(dir,1,0,v1,i1,t1,T) && 
      GetValue(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      GetValue(dir,i4,i3,v5,i5,t5,T)
      )
     {
      SetPt("1",v1,t1);
      SetPt("2",v2,t2);
      SetPt("3",v3,t3);
      SetPt("4",v4,t4);
      SetPt("5",v5,t5);
      Print(v1,"   ",v2,"  ",v3,"  ",v4," ",v5," ",i1,"  ",i2,"  ",i3," ",i4," ",i5);
     }
   else
     {
      Print("看起来出错了...");
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

本实例是一个标记(一个柱一次)了前5个顶峰 (包含正在形成的)的指标.

注意!如果启用了零柱形模式, 代码可能工作不正确

零柱形模式:

此模式可以在 DrawZeroBar 代码中启用. 它是默认禁用的. 也不推荐启用它, 特别是在EA交易中使用此指标时.

尽情享用吧. 发现任何缺陷请通知我.

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/925

校正平均 (CA) 校正平均 (CA)

A.Uhl 的校正平均指标 (也就是 "优化的移动平均").

Jolly Roger EA 版 Jolly Roger EA 版

来自Pirat 提交到2011年自动交易锦标赛的EA交易.

简单的趋势侦测仪 简单的趋势侦测仪

类似于 RSI 和 Dem 但是更加敏感.

平滑的简单趋势侦测仪 平滑的简单趋势侦测仪

平滑的简单趋势侦测仪