文章 "MQL5中的自动化交易策略(第七部分):构建具备仓位动态调整功能的网格交易EA"

 

新文章 MQL5中的自动化交易策略(第七部分):构建具备仓位动态调整功能的网格交易EA已发布:

在本文中,我们将在 MQL5 中构建一个使用动态仓位缩放的网格交易EA。我们将涵盖策略设计、代码实现和回测过程。最后,我们将分享用于优化该自动化交易系统的关键方案和最佳实践。

网格交易是一种系统性的方法,它在预定的价格间隔下放置买入和卖出订单,使交易者能够利用市场波动,而无需精确的趋势预测。该策略通过在定义的价格范围内持续开仓和平仓来从市场波动中获益。为了增强其性能,我们将集成动态仓位缩放,它会根据预定条件(如账户余额、波动率或先前交易的结果)来调整仓位大小。我们的网格交易系统将由以下关键部分组成:

  • 网格结构 – 我们将定义订单之间的间距。
  • 入场和执行规则 – 我们将根据使用移动平均线指标策略的固定距离,来决定何时开立网格交易。
  • 动态仓位缩放 – 我们将实现一个自适应的仓位调整机制,根据市场状况或预定义的风险参数来调整仓位大小。
  • 交易管理 – 我们将引入止损、止盈和可选的保本机制,以有效管理风险。
  • 退出策略 – 我们将开发基于盈利目标、风险限制或趋势反转来平仓的逻辑。

简而言之,为了便于理解,这里是整个策略方案的可视化展示。

网格布局

通过将结构化的网格系统与自适应的仓位调整相结合,我们将创建一个能在有效管理风险的同时最大化回报的 EA。接下来,我们将在 MQL5 中实现这些概念。


作者:Allan Munene Mutiiria

 
//--- 为交易信号逻辑检索最近的条形图价格
double low1  = iLow(_Symbol, _Period, 1);
double low2  = iLow(_Symbol, _Period, 2);
double high1 = iHigh(_Symbol, _Period, 1);
double high2 = iHigh(_Symbol, _Period, 2);

为什么不使用这些变量?

 
testtestmio71 #:

为什么不使用这些变量?

它们是可以重复使用的函数。

 
Allan Munene Mutiiria #:
它们是可以重复使用的函数。
在代码中......您在哪里使用了 low1 变量?
 
testtestmio71 #:
在代码中......你在哪里使用了 low1 变量?

变量有什么问题?有错误吗?它们是函数,可以用在代码的任何地方。

如果要我进一步解释,我想说的是获取前一栏和前一栏 + 1 的低价和高价。

void ExecuteInitialTrade(double ask, double bid){
   //---买入信号:前一个柱状图的低点高于 MA 值,且前一个柱状图的低点低于 MA 值
   if (iLow(_Symbol, _Period, 1) > maData[1] && iLow(_Symbol, _Period, 2) < maData[1]){
      gridSize = ask - gridSize_Spacing;     //--- 将网格触发器设置在当前问价下方
      TakeProfit = ask + takeProfitPts;      //--- 设置买入的 TP
      if(obj_Trade.Buy(LotSize, _Symbol, ask, 0, TakeProfit,"Initial Buy"))
         Print("Initial BUY order executed at ", ask, " with LotSize: ", LotSize);
      else
         Print("Initial BUY order failed at ", ask);
      isTradeAllowed = false;
   }
   //----卖出信号:前一个柱状图的高点低于均线,且前一个柱状图的高点高于均线
   else if(iHigh(_Symbol, _Period, 1) < maData[1] && iHigh(_Symbol, _Period, 2) > maData[1]){
      gridSize = bid + gridSize_Spacing;     //--- 设置高于当前出价的网格触发器
      TakeProfit = bid - takeProfitPts;      //--- 设置卖出的 TP
      if(obj_Trade.Sell(LotSize, _Symbol, bid, 0, TakeProfit,"Initial Sell"))
         Print("Initial SELL order executed at ", bid, " with LotSize: ", LotSize);
      else
         Print("Initial SELL order failed at ", bid);
      isTradeAllowed = false;
   }
}

具体在这里。如果不需要,你可以改用这些函数,或者删除它们。这样说清楚了吗?谢谢。

 
double low1  = iLow(_Symbol, _Period, 1);

例如.....,您使用了 iLow 而不是 Low1 变量来发出买入信号

if (iLow(_Symbol, _Period, 1) > maData[1] && iLow(_Symbol, _Period, 2) < maData[1]){

仅用于我的研究,谢谢!!

 

这四行可以注释

// double low1  = iLow(_Symbol, _Period, 1);
// double low2  = iLow(_Symbol, _Period, 2);
// double high1 = iHigh(_Symbol, _Period, 1);
// double high2 = iHigh(_Symbol, _Period, 2);
 
testtestmio71 #:

这四行可以注释

当然,现在一切都还好吗?

 

is ok.....best EA。

对于新手来说,这 4 行很容易混淆

 
testtestmio71 #:

is ok.....best EA .

对于新手来说,这 4 行很容易混淆

好的

 

好文章 - 非常感谢...我正在学习交易方法,我将在自己的交易中对自定义 散列符号 进行编辑!

检查....