了解有关MQL5向导的更多信息
我们周围的环境瞬息万变,我们必须不断努力与时俱进。我认为人类没有时间学习新知识是很正常的。像我们一样的交易者希望以最少的努力获得最佳的结果。 Meta Editor 5非常适合交易者MQL5向导是轻便的版本“ MQL5初学者向导”来自开发人员,“ MQL5向导:新版本”有几篇文章描述了如何使用向导创建自动交易系统。
做得很好-只需单击5次,您就可以创建自己的交易自动化系统,并使用Startegey Tester进行交易试验以优化参数设置。可以做 。它还使用结果自动在您的帐户上进行交易,因此您无需手动执行任何操作。但是,当MQL5开发人员或贸易商想要创建一个规格未在任何地方列出的系统,并试图创建自己的用于买卖信号的模块时,就会出现问题。当交易员打开MQL5物料并到达“标准库”物料时,他感到惊讶。
5个悲惨的阶级
MQL5向导极大地简化了EA交易的开发,但是首先您需要知道开发它需要做什么。使用MQL5向导获取EA交易自动地开发时5个基础课了解专业顾问是否符合要求。
- 专家Base 是其他四个类的父类。
- 专家是创建交易系统的类,并且是实际进行交易的类。
- 专家Signal 用于创建用于买卖信号的模块的类,本文介绍了该类。.
- 专家Trailing是一种跟踪类,可最大程度地减少止损。
- 专家Money是资产管理类。
这些是面向对象编程可以说,开发方法(OOP)的强大之处在于它的优点和缺点。但是,即使手机中内置了许多功能,也很少有人知道其工作原理,您不必担心,也不必研究所有内容。 ,这里专家Signal 这是课程的一些功能。
在这篇文章中买卖信号模块开发的几个步骤并向您展示如何在不学习面向对象编程和其他课程的情况下进行开发。但是,如果您有兴趣,请尝试自己学习更多。
1.如何从1创建一个类
我们不会选择根据要求修改现有的买卖信号,因为这可能会造成混淆。因此,您可以轻松创建自己的类,但首先 航海家使用创建一个新文件夹MQL5 /包含/专家/允许您存储买卖信号。
右键单击创建的文件夹,然后选择“新建文件”以创建用于买入/卖出信号的类。
填写字段:
单击完成以完成该模块的原型。到目前为止,没有什么复杂的。以便编译器知道从中派生CExpertSignal的位置#包括必须另外声明。
#包括 "..\ExpertSignal.mqh" // 专家Signal is in the file ExpertSignal
结果:
//+------------------------------------------------------------------+ //| MA_Cross.mqh | //| Copyright 2012, 元语录 Software Corp. | //| //www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, 元语录 Software Corp." #property link "//www.tbxfkj.com" #property version "1.00" #包括 "..\ExpertSignal.mqh" // 专家Signal is in the file ExpertSignal //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class MA_Cross : public 专家Signal { private: public: MA_Cross(); ~MA_Cross(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MA_Cross::MA_Cross() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MA_Cross::~MA_Cross() { } //+------------------------------------------------------------------+
检查创建的文件并F7请点击。 (编译错误不应显示)如果没有错误,请继续执行下一个步骤。
2.模块处理
创建的类仍然为空,没有错误,因此您可以对其进行测试。让我们使用该类通过MQL5向导创建一个新的专业顾问。如果继续选择买/卖信号模块,您将看到未显示创建的模块名称。
那么如何显示呢?我没有为MQL5向导写标记,以了解可以使用我创建的类,因此让我们对其进行修复。如果查看标准软件包中的模块,则可以看到每个模块在文件的开头都有一个标题。这是根据特定规则处理模块的方式。规则很简单。
打开继承AMA的买卖信号模块的源代码。 (自适应移动平均信号参见逻辑描述。 ),然后运行MQL5向导并选择该模块。比较:
处理的最后一块是模块参数。第一行包含应该在MQL5向导中显示的名称。如您所见,这并不困难。每个模块的处理程序包含以下项目。
- 标题-MQL5向导中显示的模块名称。
- 类型-信号模块的版本。您应该始终将版本名称设置为SignalAdvanced。
- 名称-在注释中使用的模块名称(最好指定),该名称描述在MQL5向导中选择后生成的EA交易的初始变量。
- 在Professional Advisor中,外部变量名称中的ShortName-Prefix(Signal_<ShortName>_<ParameterName>という形で使われます)
- 类-模块中包含的对象的模板名称
- 页面-用于在模块中引用帮助的变量(标准运送仅模块)
下面解释了以Parameter = list_of_values形式描述的变量。
- 启动EA交易时为变量分配值的函数名称
- 变量的类型是枚举类型。
- 变量的初始值:分配给变量的值,除非由MQL5向导更改
- 启动MQL5向导的EA交易时发现的变量的描述
现在让我们为买卖信号模块创建一个处理程序。我们将创建一个模块,以在两个移动平均点的交点处显示交易信号。您需要声明四个新变量。
- FastPeriod-快速移动的平均时间
- 高于平均水平的FastMethod-Type
- SlowPeriod-慢速移动平均分的周期
- SlowMethod-Type在平均上述平均水平上
您可以添加价格变动和类型以找到每个移动平均线,但不会发生根本变化。当前版本如下所示:
// wizard description start //+------------------------------------------------------------------+ //| Description of the class | //| Title=Signals at the intersection of two MAs | //| Type=SignalAdvanced | //| Name=My_MA_Cross | //| 简称=MaCross | //| Class=MA_Cross | //| Page=Not needed | //| Parameter=FastPeriod,int,13,Period of fast MA | //| Parameter=FastMethod,ENUM_MA_METHOD,MODE_SMA,Method of fast MA | //| Parameter=SlowPeriod,int,21,Period of slow MA | //| Parameter=SlowMethod,ENUM_MA_METHOD,MODE_SMA,Method of slow MA | //+------------------------------------------------------------------+ // wizard description end
该模块的处理程序已准备就绪,以下内容已经描述。
- 在MQL5向导中显示的名称-“两个移动平均值的交点处的信号”
- 4个用于调整交易信号的变量
- FastPeriod-快速移动平均线的周期,初始值13
- FastMethod-Type以上移动平均期间的平均水平,默认为简单水平
- SlowPeriod-Slow moving average period,初始值为21
- SlowMethod-Type以上移动平均期间的水平,默认为简单水平
进行更改后,保存并编译。您应该不会看到任何错误。启动MQL5向导并进行检查。如您所见,您创建的模块是可选的,并显示所有变量。
恭喜,您已经创建了一个买/卖信号模块!
3.设定变量的方法
现在让我们处理外部变量。交易模块主要由MA_Cross类组成,其变量为私人的它将作为成员保留在相似的类中。让我们在类声明中添加四行。 (与变量数相同)我们已经在句柄创建中说明了变量,并且您可能知道以下处理。
class MA_Cross : public 专家Signal { private: //--- Configurable module parameters int m_period_fast; // Period of the fast MA int m_period_slow; // Period of the slow MA ENUM_MA_METHOD m_method_fast; // Type of smoothing of the fast MA ENUM_MA_METHOD m_method_slow; // Type of smoothing of the slow MA
但是模块的外部变量的值MA_Cross类的适当成员会分配给吗?在MA_Cross类中,这实际上非常简单一样的名字只需声明公共方法即可。上市在该部分中再添加四行。
class MA_Cross : public 专家Signal { private: //--- Configurable module parameters int m_period_fast; // Period of the fast MA int m_period_slow; // Period of the slow MA ENUM_MA_METHOD m_method_fast; // Type of smoothing of the fast MA ENUM_MA_METHOD m_method_slow; // Type of smoothing of the slow MA public: //--- Constructor of class MA_Cross(); //--- Destructor of class ~MA_Cross(); //--- Methods for setting void FastPeriod(int value) { m_period_fast=value; } void FastMethod(ENUM_MA_METHOD value) { m_method_fast=value; } void SlowPeriod(int value) { m_period_slow=value; } void SlowMethod(ENUM_MA_METHOD value) { m_method_slow=value; } };
在MQL5向导中,当您基于此模块创建专业顾问并在图表上启动它时,初始化专业顾问时会自动调用这四种方法。这是一个简单的规则:
在模块中生成变量的规则- 要处理在句柄中声明的变量的值,请在类中创建一个私有成员以保存该值,然后创建一个公共成员以分配该值。方法名称必须与变量名称相同。
如果未调用分配值的方法,则需要分配将使用的变量的初始值。声明的变量和类成员需要初始化。这是一种避免难以发现的错误的技术。
自动初始化最有效的方法是使用构造函数。在创建对象时,它将始终是第一个被调用的方法。对于初始值,请使用模块处理程序中编写的值。
class MA_Cross : public 专家Signal { private: //--- Configurable module parameters int m_period_fast; // Period of the fast MA ENUM_MA_METHOD m_method_fast; // Type of smoothing of the fast MA int m_period_slow; // Period of the slow MA ENUM_MA_METHOD m_method_slow; // Type of smoothing of the slow MA public: //--- Constructor of class MA_Cross(void); //--- Destructor of class ~MA_Cross(void); //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ MA_Cross::MA_Cross(void) : m_period_fast(13), // Default period of the fast MA is 3 m_method_fast(MODE_SMA), // Default smoothing method of the fast MA m_period_slow(21), // Default period of the slow MA is 21 m_method_slow(MODE_SMA) // Default smoothing method of the slow MA { }
班级成员初始化列表可以使用进行初始化。
如您所见,我们尚未使用移动平均指标。有一个简单的规则。当模块处理程序中描述了许多变量时,需要在执行模块的类中描述许多方法和成员。一点也不难!只是不要忘记在构造函数中分配变量的初始值。
4.正确/错误判断输入参数
我创建了一个交易模块变量,并编写了一种为变量分配值的方法。接下来,我们将努力确定重要变量的正确性。您需要检查移动平均线持续时间的水平类型及其计算。因此,在课堂上拥有ValidationSettings()您需要编写一个方法。该方法是父类专家Base定义于儿童班在你必须需要重新定义。
请记住,如果您对面向对象的编程一无所知,则需要在您的类中编写一个ValidationSettings()方法,该方法没有变量,并返回True,False。
class MA_Cross : public 专家Signal { ... //--- Constructor of class MA_Cross(void); //--- Destructor of class ~MA_Cross(void); //--- Checking correctness of 输入 data bool ValidationSettings(); ... }; //+------------------------------------------------------------------+ //| Checks 输入 parameters and returns true if everything is OK | //+------------------------------------------------------------------+ bool MA_Cross:: ValidationSettings() { //--- Call the base class method if(!CExpertSignal::ValidationSettings()) return(false); //--- Check periods, number of bars for the calculation of the MA >=1 if(m_period_fast<1 || m_period_slow<1) { PrintFormat("Incorrect value set for 上e of the periods! FastPeriod=%d, SlowPeriod=%d", m_period_fast,m_period_slow); return false; } //--- Slow MA period must be greater that the fast MA period if(m_period_fast>m_period_slow) { PrintFormat("SlowPeriod=%d must be greater than FastPeriod=%d!", m_period_slow,m_period_fast); return false; } //--- Fast MA smoothing type must be 上e of the four values of the enumeration if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA) { PrintFormat("Invalid type of smoothing of the fast MA!"); return false; } //--- Show MA smoothing type must be 上e of the four values of the enumeration if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA) { PrintFormat("Invalid type of smoothing of the slow MA!"); return false; } //--- All checks are completed, everything is ok return true; }如您所见,在MA_Cross的公共部分,声明ValidationSettings()方法,然后方法内容被描述。
bool MA_Cross:: ValidationSettings()
首先设置返回类型,然后设置类名,然后范围定义运算符:: 被描述。所有这些都在先前声明的方法名称之后列出。请记住,变量名称和类型必须与类方法的声明和描述匹配。但是由编译器错误将显示。
首先,调用源类并检查输入参数。
//--- Call the base class method if(!CExpertSignal::ValidationSettings()) return(false); //--- Our code to check the values of parameters
如果不添加此行,则将无法初始化买/卖信号。
5.指标在哪里?
现在,有关变量的所有准备工作都已完成,让我们继续进行指标工作。每个买卖信号模块InitIndicators() 它具有一种方法,并且在启动Professional Advisor时会自动调用它。在此方法中,您必须创建一个用于移动平均的指标。
首先,在类内部声明lnitIndicators方法,然后粘贴以下内容:
public: //--- Constructor of class MA_Cross(void); //--- Destructor of class ~MA_Cross(void); //--- Methods for setting void FastPeriod(int value) { m_period_fast=value; } void FastMethod(ENUM_MA_METHOD value) { m_method_fast=value; } void SlowPeriod(int value) { m_period_slow=value; } void SlowMethod(ENUM_MA_METHOD value) { m_method_slow=value; } //--- Checking correctness of 输入 data bool ValidationSettings(); //--- Creating indicators and timeseries for the module of signals bool InitIndicators(CIndicators *indicators); }; ... //+------------------------------------------------------------------+ //| Creates indicators | //| Input: a pointer to a collection of indicators | //| Output: true if successful, otherwise false | //+------------------------------------------------------------------+ bool MA_Сross::InitIndicators(CIndicators* indicators) { //--- Standard check of the collection of indicators for NULL if(indicators==NULL) return(false); //--- Initializing indicators and timeseries in additional filters if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- Creating our MA indicators ... Some code here //--- Reached this part, so the function was successful, return true return(true); }
ValidationSettings方法我声明了方法并像我所做的那样描述了方法的内部,但是我认为这很容易。在方法定义中类名和运算符::不要忘记插入。以下是创建移动平均线时要插入的代码。我们将在每个指标中创建一个成功返回True的方法,因此请正确执行。方法名称可以是任何东西,但是我希望方法名称与用途相匹配,所以我们将其命名为CreateFastMa和CreateSlowMA。
protected: //--- Creating MA indicators bool CreateFastMA(CIndicators *indicators); bool CreateSlowMA(CIndicators *indicators); }; //+------------------------------------------------------------------+ //| Creates indicators | //| Input: a pointer to a collection of indicators | //| Output: true if successful, otherwise false | //+------------------------------------------------------------------+ bool MA_Cross::InitIndicators(CIndicators *indicators) { //--- Standard check of the collection of indicators for NULL if(indicators==NULL) return(false); //--- Initializing indicators and timeseries in additional filters if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- Creating our MA indicators if(!CreateFastMA(indicators)) return(false); if(!CreateSlowMA(indicators)) return(false); //--- Reached this part, so the function was successful, return true return(true); } //+------------------------------------------------------------------+ //| Creates the "Fast MA" indicator | //+------------------------------------------------------------------+ bool MA_Cross::CreateFastMA(CIndicators *indicators) { ... Some code //--- Reached this part, so the function was successful, return true return(true); } //+------------------------------------------------------------------+ //| Creates the "Slow MA" indicator | //+------------------------------------------------------------------+ bool MA_Cross::CreateSlowMA(CIndicators *indicators) { ... Some code //--- Reached this part, so the function was successful, return true return(true); }
只需编写生成MA指标的代码即可。另外,让我们将这些指标引入交易模块,以便该模块可以使用指标的变量。这个C指标类型的变量被识别为参数。 Meta Trader文档中还描述了以下内容。
指标是按时间顺序保存指标类实例的类。 Cindicators类包含指标类,它的互补区域和管理功能的一个实例。 (数据同步,处理,内存管理功能等)
这意味着您需要创建一个指标并将其存储在您的集合中。C指标 指标及其子类存储在此集合中,我想利用它们。海关使用上面提到的子类。在类的私有范围内,将每个移动平均变量声明为CiCustom对象类型。
class MA_Cross : public 专家Signal { private: 海关 m_fast_ma; // The indicator as an object 海关 m_slow_ma; // The indicator as an object //--- Configurable module parameters int m_period_fast; // Period of the fast MA ENUM_MA_METHOD m_method_fast; // Type of smoothing of the fast MA int m_period_slow; // Period of the slow MA ENUM_MA_METHOD m_method_slow; // Type of smoothing of the slow MA
当然,C指标您可以创建一个继承自其的指标类,并且可以使用MQL5向导执行所有方法。但是在这种情况下 海关在交易信号模块中可定制我将解释如何使用指标。
代码内容如下。
//+------------------------------------------------------------------+ //| Creates the "Fast MA" indicator | //+------------------------------------------------------------------+ bool MA_Cross::CreateFastMA(CIndicators *indicators) { //--- Checking the pointer if(indicators==NULL) return(false); //--- Adding an object to the collection if(!indicators.Add(GetPointer(m_fast_ma))) { printf(__FUNCTION__+": Error adding an object of the fast MA"); return(false); } //--- Setting parameters of the fast MA MqlParam parameters[4]; //--- parameters[0].type=TYPE_STRING; parameters[0].string_value="Examples\\Custom Moving Average.ex5"; parameters[1].type=TYPE_INT; parameters[1].integer_value=m_period_fast; // Period parameters[2].type=TYPE_INT; parameters[2].integer_value=0; // Shift parameters[3].type=TYPE_INT; parameters[3].integer_value=m_method_fast; // Averaging method //--- Object initialization if(!m_fast_ma.Create(m_symbol.Name(),m_period,IND_CUSTOM,4,parameters)) { printf(__FUNCTION__+": Error initializing the object of the fast MA"); return(false); } //--- Number of buffers if(!m_fast_ma.NumBuffers(1)) return(false); //--- Reached this part, so the function was successful, return true return(true); }
在CreateFastMA方法中,首先检查指标的集合指针,然后在此集合中添加MA m_fast_ma。设计用于保存自定义指标的变量 MqlParam让我们声明并分配一个值。
作为标准终端包中的自定义MA指标自定义移动平均线使用。指标名称是与文件夹关联的名称(data_folder / MQL5 /指标/) 一定是。标准软件包Custom Moving Average.mql5是data_folder / MQL5 /指标/由于它存储在Examples /中,因此您需要指定包含Examples文件夹的文件路径。
parameters[0].string_value="Examples\\Custom Moving Average.ex5";
看一下这段代码,您将看到所需的所有数据。
//--- 输入 parameters 输入 int InpMAPeriod=13; // Period 输入 int InpMAShift=0; // Shift 输入 ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Method
该变量的值包含一个“类型-值”对。
- 变量类型-字符串类型(用于传递指标名称)
- 自定义指标的可执行文件名-“ Custom Moving Averages.exe”
- 变量类型--int类型(用于周期值分配)
- 移动平均周期
- 变量类型--int类型(移位值)
- 平均水平移动值
- 变量类型--int类型(枚举类型为Integer)
- 平均方法
填充结构后,此指示器将显示交易品种名称,计算的时间范围,ENUM_INDICATOR在所有变量中,例如枚举类的指标的类型,指标中的变量数量以及变量值的分配MqlParam。创造 ()它由方法初始化。最后NumBuffers()使用该方法指定指标缓冲区的数量。
创建慢速移动平均值的CreateSlowMA()方法非常简单。在模块中使用定制指示符时,请记住测试器还运行由MQL5向导生成的Expert Advisor。在文件的第一部分中,编写#property tester_indicator属性,该属性告知测试人员指标在哪里。
#包括 "..\ExpertSignal.mqh" // The 专家Signal class is in the file ExpertSignal #property tester_indicator "Examples\\Custom Moving Average.ex5"
如果要使用几个不同的指标,则需要在每个指标上添加此行。现在,我们已经完成了指标的添加。为了方便起见,让我们编写两个接收MA值的方法。
//--- Checking correctness of 输入 data bool ValidationSettings(void); //--- Creating indicators and timeseries for the module of signals bool InitIndicators(CIndicators *indicators); //--- Access to indicator data double FastMA(const int index) const { return(m_fast_ma.GetData(0,index)); } double SlowMA(const int index) const { return(m_slow_ma.GetData(0,index)); }
如您所见,此方法仅针对SIndicator的父类制作,该父类从特定指标缓冲区中的特定位置返回值。GetData()我正在使用一种方法。
如果您需要一个类来处理标准包装指示器,处理指标的类本章对此进行了描述。现在,我们继续进行最后一步。
6. LongCondition / ShortCondition方法的定义
该模块已准备就绪,可以运行并生成买/卖信号。专家Signal此功能由子类中定义的两个方法提供。
- LongCondition() 返回介于0到100之间的长信号值,并检查购买状态。
- ShortCondition() -返回0到100之间的空头信号值,并检查卖出状态。
如果此方法返回null,则表示没有买/卖信号。生成信号时,您可以推断信号强度并返回最大100的值。通过猜测信号强度,您可以基于几个模块和市场模型构建一个灵活的交易系统。MQL向导:新版本详细描述。
由于我们正在创建一个用于买卖信号的简单模块,因此我们还将所有买卖信号也设置为100。让我们在类声明中添加所需的方法。
... bool InitIndicators(CIndicators *indicators); //--- Access to data of the indicators double FastMA(const int index) const { return(m_fast_ma.GetData(0,index)); } double SlowMA(const int index) const { return(m_slow_ma.GetData(0,index)); } //--- Checking buy and sell conditions virtual int LongCondition(); virtual int ShortCondition();
描述方法的细节。检查购买信号的机制如下。 (卖出信号的形状相同。)
//+------------------------------------------------------------------+ //| Returns the strength of the buy signal | //+------------------------------------------------------------------+ int MA_Cross::LongCondition() { int signal=0; //--- For operation with ticks idx=0, for operation with formed bars idx=1 int idx=StartIndex(); //--- Values of MAs at the last formed bar double last_fast_value=FastMA(idx); double last_slow_value=SlowMA(idx); //--- Values of MAs at the last but 上e formed bar double prev_fast_value=FastMA(idx+1); double prev_slow_value=SlowMA(idx+1); //---If the fast MA crossed the slow MA from bottom upwards 上 the last two closed bars if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value)) { signal=100; // There is a signal to buy } //--- Return the signal value return(signal); }
父类CExpertBase方法StartIndex()请注意,我们已经声明了一个idx变量,返回值分配给该变量。如果专业顾问全天候运行 StartIndex() 返回0并从该点开始分析。如果专业顾问以公开价格运作StartIndex()返回1并从最后一个生成的条开始分析。
作为标准 StartIndex()返回1。小鸡 由MQL5向导生成的Professional Advisor在创建新的小节时运行,并在创建小节时忽略新的价格变动。
稍后我们将看到如何启动和运行此状态。
现在可以使用该模块了,让我们在MQL5向导中使用该模块来创建一个自动交易系统。
与测试人员联系专业顾问
要测试该模块的有效性,请使用MQL5向导创建一个专业顾问,然后在图形上运行它。启动窗口的“输入”选项卡包含MA_Cross模块的变量。
当根据您选择的资产管理模块和头寸维护模块创建EA时,MQL5向导还添加了其他变量。因此,您要做的就是创建一个用于交易信号的模块并使用已经创建的系统。这是使用MQL5向导的好处。
现在,让我们使用Meta Trader 5策略测试器测试交易系统。也尝试优化变量。
为了优化所有输入参数设置,必须处理超过500,000行。因此,我们选择了更快的优化(遗传算法),此外,还使用了MQL5云网络来进行更快的优化。优化大约需要10分钟才能完成,您可以获得结果。
如您所见,MQL5允许您创建自动交易系统并优化输入参数,而所需的时间少于编写位置管理逻辑,调试和搜索最佳算法所需的时间。
最后一步
如果“买/卖”信号模块的描述足够,您可以跳过此项目或稍后参考。
当我打开由MQL5向导生成的Expert Advisor的源代码时,分配了错误的值。全局变量您将找到Expert_EveryTick。基于此变量StartIndex()返回一个值。然后,我们将与专业顾问合作。
//+------------------------------------------------------------------+ //| TestMA_Cross.mq5 | //| Copyright 2012, 元语录 Software Corp. | //| //www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, 元语录 Software Corp." #property link "//www.tbxfkj.com" #property version "1.00" //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #包括 <Expert\Expert.mqh> //--- available signals #包括 <Expert\MySignals\MA_Cross.mqh> //--- available trailing #包括 <Expert\Trailing\TrailingNone.mqh> //--- available money management #包括 <Expert\Money\MoneyFixedLot.mqh> //+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ //--- 输入s for expert 输入 string Expert_Title ="TestMA_Cross"; // Document name ulong Expert_MagicNumber =22655; // Expert Advisor ID bool Expert_EveryTick =false; // Work of the EA inside the bar //--- 输入s for main signal 输入 int Signal_ThresholdOpen =10; // Signal threshold value to open [0...100] 输入 int Signal_ThresholdClose =10; // Signal threshold value to close [0...100]
如果将True分配给Expert_EveryTick并编译代码,则自动交易系统将分析所有报价并使用不完整的条形值进行决策。仅在了解其工作原理后才能执行此操作。所有交易系统均设计为可在酒吧中运行。
在Expert_EveryTick变量中输入可以描述关键字的新功能,可以在EA启动时使用图表和测试器进行设置专业顾问输入参数可以获得。
输入 bool Expert_EveryTick =false; // Work of the EA inside the bar
让我们总结一下这次我们做了什么。
创建买卖信号模块的6个步骤
如果您已掌握MQL5,则不再需要从头开始创建专业顾问。创建一个交易信号模块,并基于该模块自动创建一个交易系统以及交易量管理模块和止损模块。即使您不熟悉面向对象或不想详细研究交易类,也可以执行六个步骤。
- 使用MQL5向导转到MQL5 / Include / MySignals /创建一个新的班级 举行。买/卖信号模块存储在此处。
- 描述的变量,它们的类型和值模块处理程序创建一个。
- 在班上模块变量并在构造函数中添加用于初始化的方法。
- 检查输入参数 举行。另外,不要忘记在源类CExpertSignal中调用ValidationSettings。
- 指标对象并添加预定义的lnIndiators()方法。
- 在LongCondition()和ShortCondition()方法中,指定买/卖信号的条件。
每个步骤都很简单,几乎不需要MQL5编程技能。您可以根据说明创建模块,不要编写代码并进行数小时的调试,并在不到一个小时的时间内验证进一步的交易思路。
从初学者到高级
买卖策略由使用MQL5向导创建的交易系统执行,并且与买卖信号模块一样复杂。但是,在根据某些规则开始创建复杂的交易系统之前,请将其分解为多个系统并分别检查每个系统。
您可以使用现成的买卖信号来构建复杂的买卖策略,同时以简单的模块为基础。但是,我将在另一篇文章中将其作为主题进行介绍!
由MetaQuotes Software Corp.从俄语翻译而来。
来源文章: //www.tbxfkj.com/ru/articles/367
附件文件 |
testma_cross.mq5
(7.14 KB)
ma_cross.mqh
(11.57 KB)