让我们分6个步骤制作自动交易设备!

2015年10月2日16:15
元语录
0
12 117

了解有关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 /包含/专家/允许您存储买卖信号。

右键单击创建的文件夹,然后选择“新建文件”以创建用于买入/卖出信号的类。

填写字段:

  • 类名-调用类的名称。由于此类是在两个移动平均点的交点处生成信号的模块,因此请设置类别名称MA_Cross。
  • 什么是基本名称?遗产原班。此MA_Cross类专家Signal请从该类继承。

单击完成以完成该模块的原型。到目前为止,没有什么复杂的。以便编译器知道从中派生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形式描述的变量。

  1. 启动EA交易时为变量分配值的函数名称
  2. 变量的类型是枚举类型。
  3. 变量的初始值:分配给变量的值,除非由MQL5向导更改
  4. 启动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

该模块的处理程序已准备就绪,以下内容已经描述。

  1. 在MQL5向导中显示的名称-“两个移动平均值的交点处的信号”
  2. 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

该变量的值包含一个“类型-值”对。

  1. 变量类型-字符串类型(用于传递指标名称)
  2. 自定义指标的可执行文件名-“ Custom Moving Averages.exe”
  3. 变量类型--int类型(用于周期值分配)
  4. 移动平均周期
  5. 变量类型--int类型(移位值)
  6. 平均水平移动值
  7. 变量类型--int类型(枚举类型为Integer)
  8. 平均方法

填充结构后,此指示器将显示交易品种名称,计算的时间范围,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此功能由子类中定义的两个方法提供。

如果此方法返回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,则不再需要从头开始创建专业顾问。创建一个交易信号模块,并基于该模块自动创建一个交易系统以及交易量管理模块和止损模块。即使您不熟悉面向对象或不想详细研究交易类,也可以执行六个步骤。

  1. 使用MQL5向导转到MQL5 / Include / MySignals /创建一个新的班级 举行。买/卖信号模块存储在此处。
  2. 描述的变量,它们的类型和值模块处理程序创建一个。
  3. 在班上模块变量并在构造函数中添加用于初始化的方法。
  4. 检查输入参数 举行。另外,不要忘记在源类CExpertSignal中调用ValidationSettings。
  5. 指标对象并添加预定义的lnIndiators()方法。
  6. 在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)
使用信号量指标的简单交易系统 使用信号量指标的简单交易系统

仔细研究发现,复杂的交易系统也基于多个简单的交易信号。因此,新手开发人员不必立即开始编写复杂的算法。在本文中,我将介绍一个使用信号量指标进行交易的交易系统的示例。

创建多时间框架和多币种面板 创建多时间框架和多币种面板

本文将向您展示如何使用面向对象的编程来创建MetaTrader 5多时间框架和多币种面板。主要目的是创建一个通用面板,该面板可以显示许多不同类型的数据,例如价格和价格变化,指标值和交易条件的自定义,而无需更改面板代码。

Meta Trader 5-超出您的想象! Meta Trader 5-超出您的想象!

Metatrader 5客户终端是从零开始开发的,当然,它是远远超出以前版本的产品。这个新的交易平台可在任何金融市场中提供无限的交易机会。此外,我们不断扩展以提供更易于使用的功能和便利性。因此,很难列出Meta Trader 5的所有便利。我试图在一篇文章中简明扼要地解释所有内容,但令我惊讶的是它不能简明扼要地包含在内。

带有止损的获利算法 带有止损的获利算法

在本文中,我想了解从具有不同条目和尾随止损的退出中获利的算法的潜力。使用随机输入和反向输入作为输入类型。所使用的止损单是追踪止损和追踪止损。在本文中,我将向您展示一种可产生约30%年利润的算法。