设为首页 收藏本站 切换语言 切换语言
雨湖天涯
D
| 发表于 2025-11-22 22:28:13 来自手机 | 显示全部楼层
input double WeeklyLossLimit = 8.0;    // 每周最大亏损百分比
input double EquityDrawdownLimit = 5.0;// 净值回撤熔断百分比
input int MaxOpenOrders = 3;           // 最大持仓单数
input double MaxSymbolExposure = 0.05; // 单品种最大风险敞口
input bool UseTrailingStop = true;     // 使用移动止损
input int TrailingStart = 50;          // 移动止损启动点数
input int TrailingStep = 20;           // 移动止损步长点数

//--- 全局变量
double InitialBalance;           // 初始余额
double DailyLossLevel;           // 当日亏损底线
double WeeklyLossLevel;          // 当周亏损底线
double EquityDrawdownLevel;      // 净值回撤熔断线
datetime LastTradeTime = 0;      // 最后交易时间
int MagicNumber = 12345;         // 魔术码,用于标识EA订单

//+------------------------------------------------------------------+
//| 专家初始化函数                                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   InitialBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   UpdateLossLevels();
   
   Print("=== 智能MA EA已启动 ===");
   Print("账户余额: ", InitialBalance);
   Print("单笔风险: ", RiskPercent, "%");
   Print("每日亏损限制: ", DailyLossLimit, "%");
   Print("每周亏损限制: ", WeeklyLossLimit, "%");
   Print("净值回撤熔断: ", EquityDrawdownLimit, "%");
   Print("最大持仓单数: ", MaxOpenOrders);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 专家逆初始化函数                                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print("EA已卸载,原因: ", reason);
}

//+------------------------------------------------------------------+
//| 专家订单处理函数                                                 |
//+------------------------------------------------------------------+
void OnTick()
{
   if(TimeCurrent() - LastTradeTime < 60) return;
   
   if(!GlobalRiskCheck()) return;
   
   int signal = CheckMASignal();
   
   if(signal != 0 && RiskManagementCheck(signal))
   {
      if(ExecuteTrade(signal))
      {
         LastTradeTime = TimeCurrent();
         Print("交易执行成功,信号: ", signal);
      }
   }
   
   ManageOpenOrders();
}

//+------------------------------------------------------------------+
//| 移动平均线交叉信号检测                                           |
//+------------------------------------------------------------------+
int CheckMASignal()
{
   double fastMA_current = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double fastMA_prev = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double slowMA_current = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double slowMA_prev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   if(fastMA_prev <= slowMA_prev && fastMA_current > slowMA_current)
   {
      Print("生成买入信号: 快速MA(", FastMAPeriod, ")上穿慢速MA(", SlowMAPeriod, ")");
      return 1;
   }
   
   if(fastMA_prev >= slowMA_prev && fastMA_current < slowMA_current)
   {
      Print("生成卖出信号: 快速MA(", FastMAPeriod, ")下穿慢速MA(", SlowMAPeriod, ")");
      return -1;
   }
   
   return 0;
}

//+------------------------------------------------------------------+
//| 综合风控检查(开仓前)                                           |
//+------------------------------------------------------------------+
bool RiskManagementCheck(int signal)
{
   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);
   
   if(equity < EquityDrawdownLevel)
   {
      Print("风控触发:净值回撤达到熔断线");
      return false;
   }
   
   if(equity < DailyLossLevel)
   {
      Print("风控触发:当日亏损已达上限");
      return false;
   }
   
   if(equity < WeeklyLossLevel)
   {
      Print("风控触发:当周亏损已达上限");
      return false;
   }
   
   int openOrders = CountOpenOrders();
   if(openOrders >= MaxOpenOrders)
   {
      Print("风控触发:持仓单数已达上限");
      return false;
   }
   
   return true;
}

//+------------------------------------------------------------------+
//| 全局风控检查(每次报价都执行)                                    |
//+------------------------------------------------------------------+
bool GlobalRiskCheck()
{
   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   
   if(equity < EquityDrawdownLevel)
   {
      Print("风控熔断触发:净值回撤超过限制,平仓所有订单!");
      CloseAllOrders();
      return false;
   }
   
   MqlDateTime currentTime;
   TimeToStruct(TimeCurrent(), currentTime);
   MqlDateTime lastTime;
   TimeToStruct(LastTradeTime, lastTime);
   
   if(currentTime.day != lastTime.day)
   {
      UpdateLossLevels();
   }
   
   return true;
}

//+------------------------------------------------------------------+
//| 更新亏损限额水平                                                  |
//+------------------------------------------------------------------+
void UpdateLossLevels()
{
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);
   DailyLossLevel = balance * (1 - DailyLossLimit / 100);
   WeeklyLossLevel = balance * (1 - WeeklyLossLimit / 100);
   EquityDrawdownLevel = InitialBalance * (1 - EquityDrawdownLimit / 100);
}

//+------------------------------------------------------------------+
//| 执行交易                                                         |
//+------------------------------------------------------------------+
bool ExecuteTrade(int signal)
{
   string symbol = Symbol();
   int ticket = -1;
   double price = 0;
   double stoploss = 0;
   double takeprofit = 0;
   double lotsize = CalculateLotSize(StopLossPoints);
   
   if(lotsize <= 0)
   {
      Print("错误:计算的手数无效");
      return false;
   }
   
   if(signal > 0)
   {
      price = Ask;
      stoploss = NormalizeDouble(price - StopLossPoints * Point, Digits);
      takeprofit = NormalizeDouble(price + TakeProfitPoints * Point, Digits);
      
      ticket = OrderSend(symbol, OP_BUY, lotsize, price, 3, stoploss, takeprofit,
                        "MA Buy", MagicNumber, 0, clrGreen);
   }
   else if(signal < 0)
   {
      price = Bid;
      stoploss = NormalizeDouble(price + StopLossPoints * Point, Digits);
      takeprofit = NormalizeDouble(price - TakeProfitPoints * Point, Digits);
      
      ticket = OrderSend(symbol, OP_SELL, lotsize, price, 3, stoploss, takeprofit,
                        "MA Sell", MagicNumber, 0, clrRed);
   }
   
   if(ticket > 0)
   {
      Print("订单执行成功: ", symbol, " ", lotsize, "手,订单号: ", ticket);
      return true;
   }
   else
   {
      Print("订单执行失败,错误代码: ", GetLastError());
      return false;
   }
}

//+------------------------------------------------------------------+
//| 计算合适的手数(基于风险百分比)                                 |
//+------------------------------------------------------------------+
double CalculateLotSize(double stoplossPoints)
{
   if(stoplossPoints <= 0) return 0.01;
   
   double riskMoney = AccountInfoDouble(ACCOUNT_EQUITY) * RiskPercent / 100;
   double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
   double pointValue = MarketInfo(Symbol(), MODE_POINT);
   
   if(tickValue <= 0 || pointValue <= 0) return 0.01;
   
   double lotSize = riskMoney / (stoplossPoints * pointValue * tickValue);
   lotSize = NormalizeDouble(lotSize, 2);
   
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   
   if(lotSize < minLot) lotSize = minLot;
   if(lotSize > maxLot) lotSize = maxLot;
   
   lotSize = MathRound(lotSize / lotStep) * lotStep;
   
   return lotSize;
}

//+------------------------------------------------------------------+
//| 管理已有订单(移动止损等)                                       |
//+------------------------------------------------------------------+
void ManageOpenOrders()
{
   if(!UseTrailingStop) return;
   
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
         OrderMagicNumber() == MagicNumber &&
         OrderSymbol() == Symbol())
      {
         double newStopLoss = 0;
         double currentProfit = 0;
         
         if(OrderType() == OP_BUY)
         {
            currentProfit = (Bid - OrderOpenPrice()) / Point;
            if(currentProfit >= TrailingStart)
            {
               newStopLoss = OrderOpenPrice() + (currentProfit - TrailingStep) * Point;
               newStopLoss = NormalizeDouble(newStopLoss, Digits);
               
               if(newStopLoss > OrderStopLoss() || OrderStopLoss() == 0)
               {
                  bool modifyResult = OrderModify(OrderTicket(), OrderOpenPrice(), newStopLoss,
                             OrderTakeProfit(), 0, clrBlue);
                  if(modifyResult)
                     Print("移动止损更新成功 - 订单: ", OrderTicket(), ",新止损: ", newStopLoss);
               }
            }
         }
         else if(OrderType() == OP_SELL)
         {
            currentProfit = (OrderOpenPrice() - Ask) / Point;
            if(currentProfit >= TrailingStart)
            {
               newStopLoss = OrderOpenPrice() - (currentProfit - TrailingStep) * Point;
               newStopLoss = NormalizeDouble(newStopLoss, Digits);
               
               if(newStopLoss < OrderStopLoss() || OrderStopLoss() == 0)
               {
                  bool modifyResult = OrderModify(OrderTicket(), OrderOpenPrice(), newStopLoss,
                             OrderTakeProfit(), 0, clrBlue);
                  if(modifyResult)
                     Print("移动止损更新成功 - 订单: ", OrderTicket(), ",新止损: ", newStopLoss);
               }
            }
         }
      }
   }
}

//+------------------------------------------------------------------+
//| 统计开仓订单数量                                                 |
//+------------------------------------------------------------------+
int CountOpenOrders()
{
   int count = 0;
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
         OrderMagicNumber() == MagicNumber)
      {
         count++;
      }
   }
   return count;
}

//+------------------------------------------------------------------+
//| 平仓所有订单                                                     |
//+------------------------------------------------------------------+
void CloseAllOrders()
{
   int closedCount = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
         OrderMagicNumber() == MagicNumber)
      {
         bool result = false;
         if(OrderType() == OP_BUY)
            result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrYellow);
         else if(OrderType() == OP_SELL)
            result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrYellow);
         else
            result = OrderDelete(OrderTicket());
            
         if(result) closedCount++;
      }
   }
   Print("熔断平仓完成,共平仓 ", closedCount, " 个订单");
}
//+------------------------------------------------------------------+
``
举报

点赞 评论 使用道具

雨湖天涯
D
| 发表于 2025-11-22 22:29:49 来自手机 | 显示全部楼层
雨湖天涯 发表于 2025-11-22 22:28
input double WeeklyLossLimit = 8.0;    // 每周最大亏损百分比
input double EquityDrawdownLimit = 5.0; ...

大佬能帮我看一下吗
举报

点赞 评论 使用道具

westwuwei
DDD
| 发表于 2025-11-23 07:23:28 | 显示全部楼层
雨湖天涯 发表于 2025-11-22 22:28
input double WeeklyLossLimit = 8.0;    // 每周最大亏损百分比
input double EquityDrawdownLimit = 5.0; ...

这种弄个“双均线金叉死叉”开仓,然后推2、30个小点移动止损的EA,如果还让你花了几十块钱买来用,那就是骗子。这种东西偶尔几天赚钱,策略是稳定亏损的。

相对于一个可能稳定盈利的EA,这种EA只具有不足几十分之一的细节功能。
举报

点赞 评论 使用道具

雨湖天涯
D
| 发表于 2025-11-23 08:36:34 来自手机 | 显示全部楼层
westwuwei 发表于 2025-11-23 07:23
这种弄个“双均线金叉死叉”开仓,然后推2、30个小点移动止损的EA,如果还让你花了几十块钱买来用,那就 ...

新手小白啥也不懂,这是自己瞎琢磨的
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-23 09:41:51 来自手机 | 显示全部楼层
雨湖天涯 发表于 2025-11-22 22:29
大佬能帮我看一下吗

老板你想看啥?你别光说帮你看看呀。要讲清楚具体诉求是什么
举报

点赞 评论 使用道具

westwuwei
DDD
| 发表于 2025-11-23 10:39:51 | 显示全部楼层
xinsanban186 发表于 2025-11-23 09:41
老板你想看啥?你别光说帮你看看呀。要讲清楚具体诉求是什么

我的理解是想让你看看源码内容能不能稳定赚钱,让你给免费修改成赚钱的EA。
举报

点赞 评论 使用道具

westwuwei
DDD
| 发表于 2025-11-23 10:45:37 | 显示全部楼层
雨湖天涯 发表于 2025-11-23 08:36
新手小白啥也不懂,这是自己瞎琢磨的

其实代码好写,底层逻辑难求。这就好像很多小孩儿以为用DeepSeek 就能搞软件研发了,其实DeepSeek能做的事情就相当于软件公司里边所有最平庸的人的工作的总和,DeepSeek可以迅速抄袭剽窃别人发表的内容。但是要想用DeepSeek编写出解决问题的大型软件,你首先得能够用更加高级、全面的软件系统分析的术语、领域专家的知识、有条理的底层逻辑框架,告诉DeepSeek你要什么?!如果你说需求的时候层次很低,那么DeepSeek给你输出的也是很低级的东西。就是这么一个意思。
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-23 17:48:38 | 显示全部楼层
雨湖天涯 发表于 2025-11-22 22:29
大佬能帮我看一下吗

你这个代码应该是直接用Ai生成的,而且策略应该也是ai直接生成的吧?
你懒到自己连策略都不去思考,这东西你说能用吗?实盘肯定用不了啊还用看吗
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-23 17:49:53 | 显示全部楼层
westwuwei 发表于 2025-11-23 10:39
我的理解是想让你看看源码内容能不能稳定赚钱,让你给免费修改成赚钱的EA。 ...

看完了,99.9%是AI生成的,策略都是ai给出的。
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-23 18:05:57 | 显示全部楼层
5656.png
filetype

[EAHub]a_W_ea(5).mq4

41.92 KB, 下载次数: 14, 下载积分: 活跃度 -5  [下载]

举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-23 18:06:31 | 显示全部楼层
aoe123 发表于 2025-11-21 22:15
楼主,能帮忙改一下ea吗
一、穿越均线时会来回(开仓平仓)
改为:可以线上多线下空(对锁)但要到达止损位 ...

修改完了,230楼你自己下载测试看看。
举报

点赞 评论 使用道具

aoe123
D
| 发表于 2025-11-23 19:25:18 | 显示全部楼层
xinsanban186 发表于 2025-11-23 18:06
修改完了,230楼你自己下载测试看看。

多谢楼主,感谢感谢
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-11-24 09:08:06 | 显示全部楼层
aoe123 发表于 2025-11-23 19:25
多谢楼主,感谢感谢

不客气,祝你交易顺利
举报

点赞 评论 使用道具

lonerjay
DDD
| 发表于 2025-11-29 22:45:57 | 显示全部楼层
请楼主帮忙,想实现的目标:
用户给出一个金额,按照这个金额程序自动计算出离开仓价格相应的距离,并自动进行止盈和止损的价格设定。比如,我设定5000的金额,那么程序识别到不管哪个合约开仓后自动添加止盈和止损,保证该合约最终止盈或者止损金额都是5000美元。

注意的点:
1、有的平台是小数点后4位报价,有的平台是小数点后5位报价,程序要考虑这两种平台的差异,能够自动识别兼容。
2、程序要考虑同一平台下,开不同合约的仓位进行计算,并在相应价位进行止盈和止损的设置(每个合约的盈亏都是设定金额,设定值不是几个合约的总盈亏)。
3、增加一个设置选项,用户可选是否在设定的金额中包含手续费。

前段时间楼主比较忙,希望空了能帮我搞一下,万分感谢!
举报

点赞 评论 使用道具

killerwpc
D
| 发表于 2025-12-2 19:29:43 | 显示全部楼层
可以可以,老板大气,必然发达。
举报

点赞 评论 使用道具

小宝贝321
DD
| 发表于 2025-12-6 20:59:46 | 显示全部楼层
楼主大爱 给我写一个mt4 EA策略逻辑;多空双开 如果没有订单就同时开(多/空)两个单.如果行情上涨 每次多单上涨浮盈 ≥ 200点 → 多单平仓+重开多单同时加个逆势单(不设置止盈止损)逆势单一直持仓
直到行情回调盈利调达到设定金额(10美元)所有空单获利就平仓 .亏损达到10000美元停止开单   加仓倍数:(用马丁最小的加仓倍数自动计算比如开始0.01 0.01 0.01 0.02 0.02 0.02).   空单反之
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-12-11 09:59:18 | 显示全部楼层
多空双开 如果没有订单就同时开(多/空)两个单.如果行情上涨 每次多单上涨浮盈 ≥ 200点 → 多单平仓+重开多单同时加个逆势单(不设置止盈止损)逆势单一直持仓
直到行情回调盈利调达到设定金额(10美元)所有空单获利就平仓 .亏损达到10000美元停止开单   加仓倍数:(用马丁最小的加仓倍数自动计算比如开始0.01 0.01 0.01 0.02 0.02 0.02).   空单反之
filetype

多空双开ea.mq4

33.28 KB, 下载次数: 0, 下载积分: 活跃度 -5  [下载]

举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-12-11 09:59:43 | 显示全部楼层
小宝贝321 发表于 2025-12-6 20:59
楼主大爱 给我写一个mt4 EA策略逻辑;多空双开 如果没有订单就同时开(多/空)两个单.如果行情上涨 每次多 ...

你好,237楼下载测试一下
举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-12-11 20:52:01 | 显示全部楼层
237楼的不能加载,下载这个
filetype

多空双开ea.mq4

32.27 KB, 下载次数: 2, 下载积分: 活跃度 -5  [下载]

举报

点赞 评论 使用道具

xinsanban186
B
 楼主 | 发表于 2025-12-11 20:52:26 | 显示全部楼层
小宝贝321 发表于 2025-12-6 20:59
楼主大爱 给我写一个mt4 EA策略逻辑;多空双开 如果没有订单就同时开(多/空)两个单.如果行情上涨 每次多 ...

237楼的不能加载,下载239楼修改后的吧
举报

点赞 评论 使用道具

EA交易
您需要登录后才可以评论 登录 | 立即注册

 简体中文国旗 简体中文
 繁體中文国旗 繁體中文
 English国旗 English(英语)
 日本語国旗 日本語(日语)
 Deutsch国旗 Deutsch(德语)
 Русский язык国旗 Русский язык(俄语)
 بالعربية国旗 بالعربية(阿拉伯语)
 Türkçe国旗 Türkçe(土耳其语)
 Português国旗 Português(葡萄牙语)
 ภาษาไทย国旗 ภาษาไทย(泰国语)
 한어国旗 한어(朝鲜语/韩语)
 Français国旗 Français(法语)
翻译