顺便提一下--示例中的代码片段有一个机械性的错别字,是复制粘贴的:
//---- 声明本地变量 double TrendVelue[2];
我编译了一些信号并重新启动,如 "Candles_SmoothedSignal.mqh"(..MQL5\Include\Expert\MySignals\Candles_SmoothedSignal.mqh),但 MetaEditor 无法在向导中看到它来制作智能交易系统。
我该如何解决?
感谢你最精彩、最透彻的解释.....!
daveM
我按照说明下载并解压了所有内容,但测试仪在所有系统上都出现了错误:
tester stopped because OnInit failed
CExpert::ValidationSettings: 货币参数错误
CMoneyFixedLot::ValidationSettings: lots amount must be in the range from 1.000000 to 1000000.000000
请告诉我该如何调整。
您好!
我试图将根据 ASCtrend 指标(位于 instructions.zip 压缩文件中)创建的 ASCtrendSignal交易信号模块(位于 mysignals.zip 压缩文件中)添加到 MQL5 向导中,但是没有任何效果。我将 ASCtrendSignal 交易信号模块放在 Include\Expert\Signal 中,并将 ASCtrend 指标放在 Indicators 包中,一切似乎都正确无误,但该模块始终不愿显示在 MQL5 向导中。以下是 ASCtrendSignal 交易信号模块的代码:
//+------------------------------------------------------------------+ //|ASCtrendSignal.mqh //|版权所有 © 2011, Nikolay Kositsin | //|哈巴罗夫斯克, farria@mail.redcom.ru | | //+------------------------------------------------------------------+ #property copyright "版权所有©2011,尼古拉-科西钦"。 #property link "farria@mail.redcom.ru" //+------------------------------------------------------------------+ //| 包含的文件| //+------------------------------------------------------------------+ #property tester_indicator "ASCtrend.ex5" #include <Expert\ExpertSignal.mqh> //--- 向导说明开始 //+------------------------------------------------------------------+ //| 常量声明| //+------------------------------------------------------------------+ #define OPEN_LONG 80 // 向智能交易系统返回买入指令的常数 #define OPEN_SHORT 80 // 向智能交易系统返回卖出指令的常数 #define CLOSE_LONG 40 // 向智能交易系统返回多头平仓指令的常数 #define CLOSE_SHORT 40 // 向智能交易系统返回空头平仓指令的常数 #define REVERSE_LONG 100 // 向智能交易系统返回多头反转指令的常数 #define REVERSE_SHORT 100 // 向智能交易系统返回反向空头仓位指令的常数 #define NO_SIGNAL 0 // 向智能交易系统返回无信号的常数 //+----------------------------------------------------------------------+ //| 类的描述| //| Title=基于 ASCtrend 指标的信号 //| Type=SignalAdvanced.| //| 名称=ASCtrend| //| Class=CASCtrendSignal| //| Page=| //| 参数=BuyPosOpen,bool,true,购买权限 //| 参数=SellPosOpen,bool,true,销售权限 //| 参数=BuyPosClose,bool,true,退出多头头寸的权限 //| 参数=SellPosClose,bool,true,退出空头头寸的权限 //| 参数=Ind_TIMEFRAMES,ENUM_TIMEFRAMES,PERIOD_H4,时间帧 //| 参数=RISK,int,4,风险等级| //| Parameter=SignalBar,uint,1,Bar index for entry signal || 参数=信号条,uint,1,输入信号的条形图索引 //+----------------------------------------------------------------------+ //--- 向导描述结束 //+----------------------------------------------------------------------+ //| CASCtrendSignal 类。| //| 用途:基于|......的交易信号生成器类别。 //| ASCtrend indicator values http://www.mql5.com/ru/code/491/. | //| 源自 CExpertSignal 类。 //+----------------------------------------------------------------------+ class CASCtrendSignal : public CExpertSignal { protected: CiCustom m_indicator; // 访问 ASCtrend 值的对象 //-- 调整参数 bool m_BuyPosOpen; // 购买许可 bool m_SellPosOpen; // 销售许可 bool m_BuyPosClose; // 退出多头头寸的权限 bool m_SellPosClose; // 退出空头头寸的权限 ENUM_TIMEFRAMES m_Ind_Timeframe; // ASCtrend 指标时间框架 uint m_RISK; // 风险等级 uint m_SignalBar; // 进入信号的条形指数 public: CASCtrendSignal(); //--- 设置可调参数的方法 void BuyPosOpen(bool value) { m_BuyPosOpen=value; } void SellPosOpen(bool value) { m_SellPosOpen=value; } void BuyPosClose(bool value) { m_BuyPosClose=value; } void SellPosClose(bool value) { m_SellPosClose=value; } void Ind_Timeframe(ENUM_TIMEFRAMES value) { m_Ind_Timeframe=value; } void RISK(uint value) { m_RISK=value; } void SignalBar(uint value) { m_SignalBar=value; } //--- 可调整的参数验证方法 virtual bool ValidationSettings(); //--- 可调整的参数验证方法 virtual bool InitIndicators(CIndicators *indicators); // 指标初始化 //--- 市场进入信号生成方法 virtual int LongCondition(); virtual int ShortCondition(); bool InitASCtrend(CIndicators *indicators); // ASCtrend 指标初始化方法 protected: }; //+------------------------------------------------------------------+ //|CASCtrendSignal 构造函数。| //| INPUT: no.| //| OUTPUT: no.| //|| 备注:没有。| //+------------------------------------------------------------------+ void CASCtrendSignal::CASCtrendSignal() { //--- 设置默认参数 m_BuyPosOpen=true; m_SellPosOpen=true; m_BuyPosClose=true; m_SellPosClose=true; //--- 指标输入参数 m_Ind_Timeframe=PERIOD_H4; m_RISK=4; //--- m_SignalBar=1; m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE; } //+------------------------------------------------------------------+ //| 检查可调整的参数。| //| INPUT: no.| // | 输出: 如果设置有效,则为 true;如果无效,则为 false。 //|| 备注:没有。| //+------------------------------------------------------------------+ bool CASCtrendSignal::ValidationSettings() { //--- 检查参数 if(m_RISK<=0) { printf(__FUNCTION__+": Risk level must be above zero"); return(false); } //--- 成功完成 return(true); } //+------------------------------------------------------------------+ //| 初始化指标和时间序列。 //| INPUT: indicators - object-collection | 的指针 //| 指标和时间序列。| //| OUTPUT: true - 成功时为 true,否则为 false。 //|| 备注:没有。| //+------------------------------------------------------------------+ bool CASCtrendSignal::InitIndicators(CIndicators *indicators) { //--- 检查指针 if(indicators==NULL) return(false); //--- 指标初始化 if(!InitASCtrend(indicators)) return(false); //--- 成功完成 return(true); } //+------------------------------------------------------------------+ //| ASCtrend 指标初始化。| //| INPUT: indicators - object-collection | 的指针 //| 指标和时间序列。| //| OUTPUT: true - 成功时为 true,否则为 false。 //|| 备注:没有。| //+------------------------------------------------------------------+ bool CASCtrendSignal::InitASCtrend(CIndicators *indicators) { //--- 检查指针 if(indicators==NULL) return(false); //--- 向集合中添加一个对象 if(!indicators.Add(GetPointer(m_indicator))) { printf(__FUNCTION__+": error of adding the object"); return(false); } //--- 设置指示器参数 MqlParam parameters[2]; parameters[0].type=TYPE_STRING; parameters[0].string_value="ASCtrend.ex5"; parameters[1].type=TYPE_INT; parameters[1].integer_value=m_RISK; //--- 对象初始化 if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,2,parameters)) { printf(__FUNCTION__+": object initialization error"); return(false); } //--- 缓冲区的数量 if(!m_indicator.NumBuffers(2)) return(false); //--- ASCtrend 指标初始化成功 return(true); } //+------------------------------------------------------------------+ //| 检查建立多头头寸的条件,并检查多头头寸的有效性。 //| 并关闭一个简短的| //| INPUT:无| //| 输出:从 0 到 100 的投票权重| //|| 备注:没有。| //+------------------------------------------------------------------+ int CASCtrendSignal::LongCondition() { //--- 买入信号由 ASCtrend 指标的缓冲区 1 决定 double Signal=m_indicator.GetData(1,m_SignalBar); //--- 获得交易信号 if(Signal && Signal!=EMPTY_VALUE) { if(m_BuyPosOpen) { if(m_SellPosClose) return(REVERSE_SHORT); else return(OPEN_LONG); } else { if(m_SellPosClose) return(CLOSE_SHORT); } } //--- 搜索关闭空头仓位的信号 if(!m_SellPosClose) return(NO_SIGNAL); int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe); for(int bar=int(m_SignalBar); bar<Bars_; bar++) { Signal=m_indicator.GetData(0,bar); if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL); Signal=m_indicator.GetData(1,bar); if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_SHORT); } //--- 没有交易信号 return(NO_SIGNAL); } //+------------------------------------------------------------------+ //| 检查建立空头头寸的条件,并检查空头头寸的有效性。 // 关闭一个长的| //| INPUT:无| //| 输出:从 0 到 100 的投票权重| //|| 备注:没有。| //+------------------------------------------------------------------+ int CASCtrendSignal::ShortCondition() { //--- 卖出信号由 ASCtrend 指标的缓冲区 0 决定 double Signal=m_indicator.GetData(0,m_SignalBar); //--- 获得交易信号 if(Signal && Signal!=EMPTY_VALUE) { if(m_SellPosOpen) { if(m_BuyPosClose) return(REVERSE_LONG); else return(OPEN_SHORT); } else { if(m_BuyPosClose) return(CLOSE_LONG); } } //--- 搜索多头平仓信号 if(!m_BuyPosClose) return(NO_SIGNAL); int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe); // Здесь код исправлен с учетом подсказки от Владимира Карпутова: Symbol() заменен на m_symbol.Name() for(int bar=int(m_SignalBar); bar<Bars_; bar++) { Signal=m_indicator.GetData(1,bar); if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL); Signal=m_indicator.GetData(0,bar); if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_LONG); } //--- 没有交易信号 return(NO_SIGNAL); } //+------------------------------------------------------------------+
请问问题出在哪里?
敬上,弗拉基米尔
你好
我试图将根据 ASCtrend 指标(位于 instructions.zip 压缩文件中)创建的 ASCtrendSignal交易信号模块(位于 mysignals.zip 压缩文件中)添加到 MQL5 向导中,但是没有任何效果。我将 ASCtrendSignal 交易信号模块放在 Include\Expert\Signal 中,并将 ASCtrend 指标放在 Indicators 包中,一切似乎都正确无误,但该模块始终不愿显示在 MQL5 向导中。以下是 ASCtrendSignal 交易信号模块的代码:
请问问题出在哪里?
敬上,弗拉基米尔
我想补充一点,其他基于指标编写的交易信号模块也出现了同样的问题。显然,它们也有同样的问题。请帮助解决这些问题。
弗拉基米尔
附注:我从压缩文件indicators.zip 中解压的一些指标 已安装在终端上并正常运行。
顺序才是最重要的:
// 向导描述开始 //+----------------------------------------------------------------------+ //| 类的描述| //| Title=基于 ASCtrend 指标的信号 //| Type=SignalAdvanced.| //| 名称=ASCtrend| //| Class=CASCtrendSignal| //| Page=| //| 参数=BuyPosOpen,bool,true,购买权限 //| 参数=SellPosOpen,bool,true,销售权限 //| 参数=BuyPosClose,bool,true,退出多头头寸的权限 //| 参数=SellPosClose,bool,true,退出空头头寸的权限 //| 参数=Ind_TIMEFRAMES,ENUM_TIMEFRAMES,PERIOD_H4,时间帧 //| 参数=RISK,int,4,风险等级| //| Parameter=SignalBar,uint,1,Bar index for entry signal || 参数=信号条,uint,1,输入信号的条形图索引 //+----------------------------------------------------------------------+ // 向导描述 结束
不
//--- wizard description start //--- wizard description end
开始和结束之间只有一个服务块,没有变量或宏替换。
模块应该这样开始:
//+------------------------------------------------------------------+ //|ASCtrendSignal.mqh //|版权所有 © 2011, Nikolay Kositsin | //|哈巴罗夫斯克, farria@mail.redcom.ru | | //+------------------------------------------------------------------+ #property copyright "版权所有©2011,尼古拉-科西钦"。 #property link "farria@mail.redcom.ru" //+------------------------------------------------------------------+ //| 包含的文件| //+------------------------------------------------------------------+ //#perty tester_indicator "ASCtrend.ex5 "属性 #include <Expert\ExpertSignal.mqh> // 向导描述开始 //+----------------------------------------------------------------------+ //| 类的描述| //| Title=基于 ASCtrend 指标的信号 //| Type=SignalAdvanced.| //| 名称=ASCtrend| //| Class=CASCtrendSignal| //| Page=| //| 参数=BuyPosOpen,bool,true,购买权限 //| 参数=SellPosOpen,bool,true,销售权限 //| 参数=BuyPosClose,bool,true,退出多头头寸的权限 //| 参数=SellPosClose,bool,true,退出空头头寸的权限 //| 参数=Ind_TIMEFRAMES,ENUM_TIMEFRAMES,PERIOD_H4,时间帧 //| 参数=RISK,int,4,风险等级| //| Parameter=SignalBar,uint,1,Bar index for entry signal || 参数=信号条,uint,1,输入信号的条形图索引 //+----------------------------------------------------------------------+ // 向导描述 结束 //+------------------------------------------------------------------+ //| 常量声明| //+------------------------------------------------------------------+ #define OPEN_LONG 80 // 向智能交易系统返回买入指令的常数 #define OPEN_SHORT 80 // 向智能交易系统返回卖出指令的常数 #define CLOSE_LONG 40 // 向智能交易系统返回多头平仓指令的常数 #define CLOSE_SHORT 40 // 向智能交易系统返回空头平仓指令的常数 #define REVERSE_LONG 100 // 向智能交易系统返回多头反转指令的常数 #define REVERSE_SHORT 100 // 向智能交易系统返回反向空头仓位指令的常数 #define NO_SIGNAL 0 // 向智能交易系统返回无信号的常数 //+----------------------------------------------------------------------+ //| CASCtrendSignal 类。| //| 用途:基于|......的交易信号生成器类别。 //| ASCtrend indicator values http://www.mql5.com/ru/code/491/. | //| 源自 CExpertSignal 类。 //+----------------------------------------------------------------------+ class CASCtrendSignal : public CExpertSignal {
编辑后重新加载 MetaEditor
顺序才是最重要的:
不
在开始和结束之间只有一个服务块,没有变量或宏替换。
模块应该这样开始:
编辑后重新加载 MetaEditor
谢谢你,弗拉基米尔!
一切正常。
敬上,弗拉基米尔。
弗拉基米尔-卡尔普托夫, 2019.10.30 08:50
订单很重要:
// 向导描述开始 //+----------------------------------------------------------------------+ //| 类的描述| //| Title=基于 ASCtrend 指标的信号 //| 类型=高级信号| //| 名称=ASCtrend| //| Class=CASCtrendSignal| //| Page=| //| 参数=BuyPosOpen,bool,true,购买权限 //| 参数=SellPosOpen,bool,true,销售权限 //| 参数=BuyPosClose,bool,true,退出多头头寸的权限 //| 参数=SellPosClose,bool,true,退出空头头寸的权限 //| 参数=Ind_TIMEFRAMES,ENUM_TIMEFRAMES,PERIOD_H4,时间帧 //| 参数=RISK,int,4,风险等级| //| Parameter=SignalBar,uint,1,Bar index for entry signal || 参数=信号条,uint,1,输入信号的条形图索引 //+----------------------------------------------------------------------+ // 向导描述 结束
但不是
//--- wizard description start //--- wizard description end
在开始和结束之间只有服务块--没有变量和宏替换。
这是模块应该有的开头:
//+------------------------------------------------------------------+ //|ASCtrendSignal.mqh //|版权所有 © 2011, Nikolay Kositsin | //|哈巴罗夫斯克, farria@mail.redcom.ru | | //+------------------------------------------------------------------+ #property copyright "版权所有©2011,尼古拉-科西钦" #property link "farria@mail.redcom.ru" //+------------------------------------------------------------------+ //| 包含的文件| //+------------------------------------------------------------------+ //#perty tester_indicator "ASCtrend.ex5 "属性 #include <Expert\ExpertSignal.mqh> // 向导描述开始 //+----------------------------------------------------------------------+ //| 类的描述| //| Title=基于 ASCtrend 指标的信号 //| 类型=高级信号| //| 名称=ASCtrend| //| Class=CASCtrendSignal| //| Page=| //| 参数=BuyPosOpen,bool,true,购买权限 //| 参数=SellPosOpen,bool,true,销售权限 //| 参数=BuyPosClose,bool,true,退出多头头寸的权限 //| 参数=SellPosClose,bool,true,退出空头头寸的权限 //| 参数=Ind_TIMEFRAMES,ENUM_TIMEFRAMES,PERIOD_H4,时间帧 //| 参数=RISK,int,4,风险等级| //| Parameter=SignalBar,uint,1,Bar index for entry signal || 参数=信号条,uint,1,输入信号的条形图索引 //+----------------------------------------------------------------------+ // 向导描述 结束 //+------------------------------------------------------------------+ //| 常量声明| //+------------------------------------------------------------------+ #define OPEN_LONG 80 // 向智能交易系统返回买入指令的常数 #define OPEN_SHORT 80 // 向智能交易系统返回卖出指令的常数 #define CLOSE_LONG 40 // 向智能交易系统返回多头平仓指令的常数 #define CLOSE_SHORT 40 // 向智能交易系统返回空头平仓指令的常数 #define REVERSE_LONG 100 // 向智能交易系统返回多头反转指令的常数 #define REVERSE_SHORT 100 // 向智能交易系统返回反向空头仓位指令的常数 #define NO_SIGNAL 0 // 向智能交易系统返回无信号的常数 //+----------------------------------------------------------------------+ //| CASCtrendSignal 类。| //| 用途:基于|......的交易信号生成器类别。 //| ASCtrend indicator values http://www.mql5.com/ru/code/491/. | //| 源自 CExpertSignal 类。| //+----------------------------------------------------------------------+ class CASCtrendSignal : public CExpertSignal {
更改后重启元编辑器
新文章 使用信号指标的简单交易系统已发布:
如果我们完整地检查任何复杂的交易系统,就会发现它们都是基于一组简单的交易信号。因此,新手开发人员无需立即开始复杂算法的编写。本文讲述的是一套使用信号指标执行交易的交易系统示例。
作者:Nikolay Kositsin