无需编程即可创建基于指标生成EA

可能是大家都很依赖MT4,所以MT5的很多优秀功能都很少有人去探索。

今天大白带大家再次认识一下MT5的神仙功能,你不会还不知道吧?

正如标题所说-无需编程即可创建基于指标生成EA。只需要三步!

image

【以下部分文章摘录至MQL5.com】

当你在创建自动交易系统时,需要编写分析市场情况和生成交易信号的算法、追踪未平仓头寸的算法以及资金管理和风险管理系统。

模块代码编写完成后,最困难的任务就是组装所有部件并调试EA代码。模块交互的架构在这里起着关键作用:如果构建得不好,大部分时间将花在查找和纠正错误上,如果替换任何模块的算法,将导致重写整个源代码。

在 MQL5 中使用面向对象的方法大大简化了自动交易系统的编写和测试。

MT5已开发了用于实施交易策略的标准库。现在,您可以通过选择所需的交易信号(目前有 20 个)、追踪(4 个)和资金管理(5 个)模块,直接在 MetaEditor 中自动生成EA代码。通过组合这些模块,您可以获得多种现成的交易系统。

您还可以使用自己的类来实现这些模块。您可以自行创建它们。

在本文中,我们将讨论如何使用MQL5 向导自动生成EA的源代码。无需编写任何程序!

准备工作

EA源代码是使用MetaEditor代码编辑器中的MQL5 向导生成。

交易策略的标准库位于 MQL5\Include\Expert\’ 文件夹中。但你没必要直接去修改,交易信号类、跟踪开仓类以及资金和风险管理标准库的现成算法位于 Signal、Trailing 和 Money 子文件夹中。当然,你如果不会编程,就随便了解一下就可以。

要启动 MQL5 的EA生成模板,您需要单击工具栏上的“新建”按钮或从“文件”菜单中选择“新建”(或直接按 Ctrl+N)。然后选择“EA交易(生成)”选项。

image

选择信号

点击下一步后,随便输入一个EA名称,在“名称”、“作者”和“链接”字段中分别指定您的EA名称、作者的姓名以及您的网站链接。

EA 交易还具有以下输入参数:

  • symbol(字符串类型)——EA 的交易货币。
  • timeframe(时间范围类型) – EA 的工作时间范围。

通常可以保持默认,点击下一步,选择EA将进行交易的交易信号类型。

image

交易信号的类型从“名称”下拉列表中选择。按下下一步按钮后,您将看到一个窗口,要添加交易信号模块,请按“OK”按钮。让我们根据移动平均线指标添加交易信号。

image

每个交易信号模块都有自己的参数。您可以使用默认值。有两种参数创建模式。您可以通过双击参数图标来切换它们。如果参数有高亮图标

图片[5]-无需编程即可创建基于指标生成EA-BBTrading,则它将可用作EA的外部输入变量。也就是可以在外部修改此类参数还可用于策略测试器中的 EA优化。如果参数有灰色图标图片[6]-无需编程即可创建基于指标生成EA-BBTrading,则它将具有固定值,您无法从EA 的属性中修改该值。交易信号模块将出现在列表中,如果你需要多个指标搭配,同样可以选择多个。

 

风险控制模块选择

下一步是选择追踪仓位(追踪止损)的算法。使用追踪止损可以保存已赚取的利润。标准库提供了几种跟踪未平仓的方法

  1. Not-不使用追踪止损。
  2. FixedPips-基于固定止损水平的追踪止损。
  3. MA-基于 MA 的追踪止损。
  4. SAR – 基于抛物线 SAR的追踪止损。  

这里我们在 EA 交易中选择“基于固定止损水平的追踪止损”:

image

这种跟踪类型有两个参数:StopLevel 和 ProfitLevel(以报价的微点数表示,逗号后的数字),将用于跟踪未平仓头寸,参数我们选择默认即可。后面可以在外部随便调整。

image

选择资金和风险管理模块

最后一步,您需要选择将在您的EA中使用的资金和风险管理系统。

该算法的目的是确定交易操作的交易量(手数),以及风险管理。当亏损值超过允许的限额(例如,权益的 10%)时,资金和风险管理模块将强制关闭无利可图的仓位。

标准库提供了几种可立即使用的资金和风险管理算法实现:

  1. FixedLot-以固定交易量进行交易。
  2. FixedMargin-以固定保证金进行交易。
  3. FixedRisk-固定风险交易。
  4. None-以允许的最小交易量进行交易。
  5. SizeOptimized-以优化交易量进行交易。

我们选择‘以固定交易量进行交易’。我们选择的模块有两个参数:

  • Lots(手数)——交易量(以手为单位)。
  • percent——允许的最大风险百分比。

image

单击“完成”后,文件将出现在 \MQL5\Experts\ 文件夹中。并且在代码编辑器中可以看到。文件名与你刚刚指定的名称相对应。

以下就是刚刚生成的代码:

//+------------------------------------------------------------------+
//|                                                         测试EA.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title                  ="测试EA";      // Document name
ulong                    Expert_MagicNumber            =30327;       //
bool                     Expert_EveryTick              =false;       //
//--- inputs for main signal
input int                Signal_ThresholdOpen          =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose         =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel             =0.0;         // Price level to execute a deal
input double             Signal_StopLevel              =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel              =50.0;        // Take Profit level (in points)
input int                Signal_Expiration             =4;           // Expiration of pending orders (in bars)
input ENUM_MA_METHOD     Signal_MA_Method              =MODE_SMA;    // Moving Average(12,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_MA_Applied             =PRICE_CLOSE; // Moving Average(12,0,...) Prices series
input double             Signal_MA_Weight              =1.0;         // Moving Average(12,0,...) Weight [0...1.0]
//--- inputs for trailing
input int                Trailing_FixedPips_StopLevel  =30;          // Stop Loss trailing level (in points)
input int                Trailing_FixedPips_ProfitLevel=50;          // Take Profit trailing level (in points)
//--- inputs for money
input double             Money_FixLot_Percent          =10.0;        // Percent
input double             Money_FixLot_Lots             =0.1;         // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL) {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
   CSignalMA *filter0=new CSignalMA;
   if(filter0==NULL) {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.Method(Signal_MA_Method);
   filter0.Applied(Signal_MA_Applied);
   filter0.Weight(Signal_MA_Weight);
//--- Creation of trailing object
   CTrailingFixedPips *trailing=new CTrailingFixedPips;
   if(trailing==NULL) {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing)) {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Set trailing parameters
   trailing.StopLevel(Trailing_FixedPips_StopLevel);
   trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL) {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money)) {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings()) {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators()) {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
   }
//--- ok
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
{
   ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+

开始测试

点击“编写”,编译器将开始对EA进行编译生成ex5可执行文件。等待左下角出现0 error提示的时候,表明EA成功编译。此时点击蓝色按钮即可开始回测。

image

image

可以拖动测试器顶部的进度条设置测试速度。当然,你也可以不点击快速测试,直接去终端中的常规测试区域手动选择参数和进行调整参数后再测试。

image

image

个性化

如果你看到参数全部是英文,担心看不懂?这里教你改成中文显示。

image

打开任何一个AI工具,把参数部分全部复制后发给他,然后再复制翻译过的回去替换掉原来的参数。

再次选择“编写”,完成二次编译。

image

image

看效果!!

结语

使用交易策略类可显著简化您的交易理念的创建和测试。现在可以在现成的标准库模块基础上在编辑器中修改EA 的整个源代码。 这种方法还有额外的好处:

  • 单独模块的开发成本应该低于整个 EA 交易程序的成本。
  • 可以重复使用生成的模块,使用 MQL5 向导创建独立的EA。
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 共3条

请登录后发表评论

    请登录后查看评论内容