- 显示:
- 3651
- 等级:
- 已发布:
- 2014.02.03 07:21
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
这是一个简单但是非常快速的之字线指标.
没有暂停或者错误的顶峰. 顶峰的获取已经进行了对时间的优化
优势:
- 在计算中最有价值的函数是iBarShift. 它完全替代了所有需要获取顶峰的循环. 这样, 它被ArrayBSearch所替代. 这表明本指标比它在 MQL4 中的对应指标效率更高;
- 每个柱所有必要的数据每时每刻都能够访问, 而且EA交易还可以在历史中的任何时间访问它们;
- 没有暂停;
- 使用更加有效的方法寻找峰谷, 不需要搜索指标值;
- 非常快速;
- 在历史中有插入数据和切换时段时都能正确工作;
- 很适合在EA交易中使用.
劣势:
- 内存需求大. ZigZag 需要两个缓冲区 (因为有延迟所以一个不够) 以正确绘制, 而这里要使用5个缓冲区. 以我的观点, 这点不利完全可以被优势 #6所超越. 没有一个快速 ZigZags 能够在两个缓冲区基础上正确处理历史的插入.
- 有额外的线. 这是为了能够使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 Ltd译自俄语
原代码: https://www.mql5.com/ru/code/925