mql5的include库文件中自定义enum类型在指标文件中的调用方式

在mql5中编写指标,调用的include文件中某个类中使用了自定义ENUM枚举类型,如图所示:
在这里插入图片描述
enum Smooth_Method
{
MODE_SMA_, //SMA
MODE_EMA_, //EMA
MODE_SMMA_, //SMMA
MODE_LWMA_, //LWMA
MODE_JJMA, //JJMA
MODE_JurX, //JurX
MODE_ParMA, //ParMA
MODE_T3, //T3
MODE_VIDYA, //VIDYA
MODE_AMA //AMA
};
在图中CXMA类中的GetStartBars函数的第一个参数method需要使用smooth_method枚举类型定义的变量,那么在编写CXMA类中的GetStartBars函数时候,应该将该枚举变量参数,即method参数,先定义为int类型,而不用smooth_method定义,即写成如下形式:
class CXMA
{
public:
int GetStartBars(int Method,int Length,int Phase);
string GetString_MA_Method(int Method);
void XMAPhaseCheck(string PhaseName,int ExternPhase,int Method);
void XMALengthCheck(string LengthName,int ExternLength);
void XMAInit(int Method);
CXMA(){m_init=false;};
~CXMA();
}
而不是如下形式:
int GetStartBars(smooth_method Method,int Length,int Phase);
如果采用第二种写法,在指标文件中传入参数时候将可能出现“can not convert enum”错误,而修改为第一种就可以解决此问题。
然后在指标文件中调用该函数时候,才使用smooth_method类型定义传入GetStartBars函数的参数,如图所示:
在这里插入图片描述
input Smooth_Method HMA_Method=MODE_JJMA;
min_rates_total=XMAO.GetStartBars(HMA_Method ,HLength,HPhase)+1;
当然可以用print(HMA_Method)打印该变量的值,发现它显示的不是HMA_Method枚举类型中的MODE_JJMA,而是MODE_JJMA在Smooth_Method类型中的序号,因此该序号是一个整数,所以用int先定义类中的函数参数也是可以的,不过最后调用函数时候,应该用Smooth_Method枚举类型定义传入的参数变量。

### 编写ZigZag指标MQL5实现 为了创建一个有效的ZigZag指标,在MQL5环境中,需遵循特定结构来定义类并处理数据。以下是构建自定义ZigZag指标的一个基本框架: #### 定义ZigZag类 首先,通过继承`CIndicatorBuffer`或其他适当基类建立一个新的类用于表示ZigZag对象。 ```cpp //+--+ //| Zigzag.mq5 | //| Copyright 2023, MetaQuotes Software Corp.| //| https://www.mql5.com | //+------------------------------------------------------------------+ #include <Trade\Trade.mqh> class CZigZag : public CIndicatorBuffer { private: double m_depth; // 深度参数 double m_deviation; // 偏差百分比 double m_backstep; // 回撤步数 public: void SetParameters(double depth,double deviation,double backstep){ m_depth=depth; m_deviation=deviation; m_backstep=backstep; } protected: virtual int Calculate(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[]); }; ``` 此部分代码初始化了一个名为 `CZigZag` 的新类,并设置了三个主要属性:深度(`m_depth`)、偏差(`m_deviation`) 和回撤步数 (`m_backstep`) 来控制算法的行为[^1]。 #### 实现计算逻辑 接下来是核心功能——即如何基于输入的价格序列计算实际的折线图点位。这部分工作由重载后的 `Calculate()` 方法完成。 ```cpp int CZigZag::Calculate(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(rates_total<prev_calculated || rates_total<m_backstep) return(0); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); for(int i=rates_total-m_backstep;i>=0;i--){ bool isHighPeak=false,isLowPeak=false; // 寻找高点峰值条件 for(int j=i;j<i+m_backstep && !isHighPeak;j++){ if(j>rates_total-1) break; if(High[j]>High[i]+Point*m_depth*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE)){ isHighPeak=true;break; } } // 寻找低点谷值条件 for(int k=i;k<i+m_backstep && !isLowPeak;k++){ if(k>rates_total-1) break; if(Low[k]<Low[i]-Point*m_depth*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE)){ isLowPeak=true;break; } } if(isHighPeak||isLowPeak){ Buffer[i]=(isHighPeak)? High[i]: Low[i]; }else{ Buffer[i]=EMPTY_VALUE; } } return(rates_total); } ``` 上述方法遍历价格数组寻找符合条件的变化趋势转折点,并将其记录到缓冲区中作为输出的一部分。这里的关键在于设置合理的阈值以过滤掉微不足道的小波动,从而突出显著的趋势变化。 #### 注册指标函数 最后一步是在脚本或专家顾问文件内注册该自定义指标以便于调用和显示。 ```cpp input ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT; // 时间周期选择器 input double Depth=9; // 默认深度设定 input double Deviation=5; // 默认偏离率 input double BackStep=3; // 默认回溯长度 CZigZag *zigzag; void OnInit(){ zigzag=new CZigZag(); zigzag.SetParameters(Depth,Deviation,BackStep); } 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[]){ return(zigzag.Calculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread)); } ``` 这段代码展示了如何实例化之前定义好的 `CZigZag` 类,并配置必要的参数,使得整个程序能够正常运行起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sirhzx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值