照着MT4的版本都不会改,多学习下codebase中的代码。
//+------------------------------------------------------------------+ //| test_ZigZag.mq5 | //| Copyright 2020,fxMeter | //| https://www.mql5.com/en/users/fxmeter | //+------------------------------------------------------------------+ #property copyright "Copyright 2020,fxMeter" #property link "https://www.mql5.com/en/users/fxmeter" #property version "1.00" input int ExtDepth =12; input int ExtDeviation=5; input int ExtBackstep=3; struct ZigZag { int shift;//K线位置 int flag;//ZZ是高点还是低点,1是高点,-1是低点 double value;//ZZ的值 }; #define ZZ_NUM 16 // 找最近16个ZZ拐点 ZigZag ZZ[ZZ_NUM]; // 找最近16个ZZ拐点 int handle = -1; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle = iCustom(Symbol(),PERIOD_CURRENT,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep); if(handle==-1) { int error = GetLastError(); printf("create ZigZag handle failed, error code = %d",error); return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(!GetZigZag(ExtDepth,ExtDeviation,ExtDeviation))return; static int cnt =0; if(cnt++==0) { for(int i=0; i<ZZ_NUM; i++) { int shift = ZZ[i].shift; datetime ot = iTime(Symbol(),PERIOD_CURRENT,shift); printf("shift = %d,time = %s, value = %s",shift,(string)ot,DoubleToString(ZZ[i].value,_Digits)); } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool GetZigZag(int depth,int deviation,int backstep) { double z=0,v[1]= {0}; int total = iBars(Symbol(),PERIOD_CURRENT); int k=0; int i; for(i=0; i<total; i++) { if(CopyBuffer(handle,0,i,1,v)!=1)return(false); z = v[0]; if(z>0&&z!=EMPTY_VALUE) //是个拐点 { if(z==iHigh(Symbol(),PERIOD_CURRENT,i))//是个高点 { ZZ[k].value = z;//拐点值 ZZ[k].shift = i;//K线位置 ZZ[k].flag = 1;//1 表示高点 } else if(z==iLow(Symbol(),PERIOD_CURRENT,i))//是个低点 { ZZ[k].value = z;//拐点值 ZZ[k].shift = i;//K线位置 ZZ[k].flag = -1;// -1 表示低点 } k++; if(k>=ZZ_NUM)break; } } return(k==ZZ_NUM); } //+------------------------------------------------------------------+
附加的文件:
test_ZigZag.mq5
7 kb
求mt5获取zig指标的n个高低点的代码,这是mt4源码,求改写成mt5版本
//+------------------------------------------------------------------+//| test_ZigZag.mq4 |
//| Copyright 2020,fxMeter |
//| https://www.mql5.com/en/users/fxmeter |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020,fxMeter"
#property link "https://www.mql5.com/en/users/fxmeter"
#property version "1.00"
#property strict
extern int ExtDepth=8;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
struct ZigZag
{
int shift;//K线位置
int flag;//ZZ是高点还是低点,1是高点,-1是低点
double value;//ZZ的值
};
#define ZZ_NUM 16 // 找最近16个ZZ拐点
ZigZag ZZ[ZZ_NUM]; // 找最近16个ZZ拐点
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
GetZigZag(ExtDepth,ExtDeviation,ExtDeviation);//获得16个拐点
for(int i=0; i<ZZ_NUM; i++)
{
int flag = ZZ[i].flag;
if(flag==1)//是个高点
{
int k = ZZ[i].shift; //拐点对应的K线的位置
//---
double open = Open[k];//拐点开盘价
double close = Close[k];//拐点收盘价
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void GetZigZag(int depth,int deviation,int backstep)
{
int k=0;
for(int i=0; i<Bars; i++)
{
double z = iCustom(NULL,0,"ZigZag",depth,deviation,backstep,0,i);
if(z>0&&z!=EMPTY_VALUE) //是个拐点
{
if(z==High[i])//是个高点
{
ZZ[k].value = z;//拐点值
ZZ[k].shift = i;//K线位置
ZZ[k].flag = 1;//1 表示高点
}
else if(z==Low[i])//是个低点
{
ZZ[k].value = z;//拐点值
ZZ[k].shift = i;//K线位置
ZZ[k].flag = -1;// -1 表示低点
}
k++;
if(k>=ZZ_NUM)break;
}
}
}
//+------------------------------------------------------------------+