请问论坛汇友,修改均线ea

 

建立一个mt4软件根据均线智能开仓平仓ea程序,生成.ex4文件 在15分钟周期图表,MA80金叉MA320做多,死叉平仓。

在15分钟周期图表,MA80死叉MA320做空,金叉平仓。

固定开仓0.1手,单品种盈利1美金加仓1次0.1,单品种盈利3美金加仓0.2,合计加仓0.3 在15分钟图表显示交易成交轨迹线路

这个思路可以做出ea吗?


代码这样,还需要怎么修正,请教汇友们


//+------------------------------------------------------------------+

//|                                                      YourEA.mq4 |

//|                        Generated by Bing AI                      |

//+------------------------------------------------------------------+

#property strict


// 输入参数

input int ma80_period = 80;

input int ma320_period = 320;

input double lotSize = 0.1; // 初始手数

input double profitTarget1 = 1; // 盈利目标1(美元)

input double profitTarget2 = 3; // 盈利目标2(美元)


// 全局变量

int crossOver = 0; // 金叉标志

int crossUnder = 0; // 死叉标志

double totalProfit = 0; // 总盈利


//+------------------------------------------------------------------+

//| 专门用于检测均线交叉的函数                                      |

//+------------------------------------------------------------------+

void CheckCrossOver() {

   if (iMA(NULL, 15, ma80_period, 0, MODE_SMA, PRICE_CLOSE, 0) > iMA(NULL, 15, ma320_period, 0, MODE_SMA, PRICE_CLOSE, 0)) {

      crossOver = 1;

      crossUnder = 0;

   } else {

      crossOver = 0;

   }

}


void CheckCrossUnder() {

   if (iMA(NULL, 15, ma80_period, 0, MODE_SMA, PRICE_CLOSE, 0) < iMA(NULL, 15, ma320_period, 0, MODE_SMA, PRICE_CLOSE, 0)) {

      crossUnder = 1;

      crossOver = 0;

   } else {

      crossUnder = 0;

   }

}


//+------------------------------------------------------------------+

//| 专门用于执行交易的函数                                          |

//+------------------------------------------------------------------+

void ExecuteTrade(int type, double lotSize) {

   if (type == OP_BUY) {

      // 执行做多操作

      OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, 0, 0, "Buy Order", 0, 0, Green);

   } else if (type == OP_SELL) {

      // 执行做空操作

      OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, 0, 0, "Sell Order", 0, 0, Red);

   }

}


//+------------------------------------------------------------------+

//| 专门用于平仓的函数                                              |

//+------------------------------------------------------------------+

void CloseTrade() {

   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol()) {

         OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, White);

      }

   }

}


//+------------------------------------------------------------------+

//| 专门用于资金管理和加仓的函数                                      |

//+------------------------------------------------------------------+

void ManageRisk() {

   double profit = AccountBalance() - AccountEquity();


   if (profit >= profitTarget1 && totalProfit < profitTarget1) {

      // 达到盈利目标1,加仓0.1手

      totalProfit = profitTarget1;

      lotSize += 0.1;

   } else if (profit >= profitTarget2 && totalProfit < profitTarget2) {

      // 达到盈利目标2,加仓0.2手

      totalProfit = profitTarget2;

      lotSize += 0.2;

   }

}


//+------------------------------------------------------------------+

//| EA 初始化函数                                                   |

//+------------------------------------------------------------------+

int OnInit() {

   // 在这里执行初始化操作,如果有的话

   return(INIT_SUCCEEDED);

}


//+------------------------------------------------------------------+

//| EA 主循环函数                                                   |

//+------------------------------------------------------------------+

void OnTick() {

   // 在这里执行每次价格变动时的操作

   CheckCrossOver();

   CheckCrossUnder();


   // 在这里添加开仓、平仓、资金管理等逻辑

   if (crossOver == 1) {

      // 金叉,执行做多操作

      ExecuteTrade(OP_BUY, lotSize);

   } else if (crossUnder == 1) {

      // 死叉,执行做空操作

      ExecuteTrade(OP_SELL, lotSize);

   } else {

      // 无交叉,平仓

      CloseTrade();

   }


   // 执行资金管理和加仓逻辑

   ManageRisk();

}


 
目視就發現很多問題了
1/.金叉死叉應該是 MA80,K1< MA320,K1 &&  MA80,K0> MA320,K0 需要兩根以上K線作判斷 只用K0做判斷你會產生很多個交易信號
2/.

void CloseTrade() {

   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) 

應該使用持倉的部分OrdersTotal() ,OrderSelect(i, SELECT_BY_POS ,MODE_TRADE)
使用 History使過濾已經平倉的部分
3/.  ManageRisk()邏輯錯誤

 

您好。


AI生成的文档在英文论坛和其他语种的论坛一般是会被下架的,因为提问者大多不擅长编程,沟通中会产生误解。

可以在自由职业者招募。

既然已经有大神给您回复了,暂且保留。


另外例行提醒一下。

【如何防止机器人误判】讨论代码时请使用代码表述功能
【如何防止机器人误判】讨论代码时请使用代码表述功能
【如何防止机器人误判】讨论代码时请使用代码表述功能
  • 2023.06.13
  • www.mql5.com
大家好,我是官网版主。 官网内部有机器人辅助管理,目的是自动下架一些有误导性的内容。 内容过长,或同一个IP多次注册,容易导致机器人误判,而被无辜删帖。 如果您被无故删帖,我们对这种体验感到万分抱歉。 为了防止机器人误判,请在讨论代码的时候使用代码表述功能。(如图) 感谢您的配合...