首页 系统交易 帖子

使用Prop Firm助手函数的突破策略 - MetaTrader 5专家分享

附件
49713.zip (3.14 KB, 下载 0次)

大家好,

今天来给大家更新一下我的《简单有效的突破策略》。在这个代码中,我增加了一些针对prop firm挑战的助手函数。

通常来说,要通过prop firm的挑战,你需要满足以下三个主要条件:

  • 目标利润
  • 不违反最大日损失
  • 不违反最大损失

在这个代码中,我加入了两个函数来检查“目标利润”和“接近违反最大日损失”的情况,以便自动平掉所有仓位并删除所有未决订单。而对于“最大损失”,这实际上取决于你的交易策略和风险管理,所以在这个MQL5脚本中不再提及。

//+------------------------------------------------------------------+
//| Prop Firm助手函数                                       |
//+------------------------------------------------------------------+

// 删除所有未决订单并平掉所有仓位
void ClearAll(string message)
{
   Comment(message);
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      ulong orderTicket = OrderGetTicket(i);
      if (OrderSelect(orderTicket)) 
      {
         trade.OrderDelete(orderTicket);
      }
   }

   for (int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong posTicket = PositionGetTicket(i);
      trade.PositionClose(posTicket);
   }
}

// 检查是否达到了利润目标
bool isPassed()
{
   return AccountInfoDouble(ACCOUNT_EQUITY) > PASS_CRITERIA;
}

// 检查是否即将违反最大日损失
bool isDailyLimit()
{
   MqlDateTime date_time;
   TimeToStruct(TimeCurrent(), date_time);
   int current_day = date_time.day, current_month = date_time.mon, current_year = date_time.year;
   
   // 当前余额
   double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
   
   // 获取今天已平仓交易的盈亏
   HistorySelect(0, TimeCurrent());
   int orders = HistoryDealsTotal();
   
   double PL = 0.0;
   for (int i = orders - 1; i >= 0; i--)
   {
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket==0)
      {
         Print("HistoryDealGetTicket失败,没有交易历史");
         break;
      }
      double profit = HistoryDealGetDouble(ticket,DEAL_PROFIT);
      if (profit != 0)
      {
         // 获取交易时间
         MqlDateTime deal_time;
         TimeToStruct(HistoryDealGetInteger(ticket, DEAL_TIME), deal_time);
         // 检查交易时间
         if (deal_time.day == current_day && deal_time.mon == current_month && deal_time.year == current_year)
         {
            PL += profit;
         }
         else
            break;
      }
   }
   double starting_balance = current_balance - PL;
   double current_equity   = AccountInfoDouble(ACCOUNT_EQUITY);
   return current_equity < starting_balance - DAILY_LOSS_LIMIT;
}

我们需要指定的参数如下:

input string dd = "-------------PROP FIRM CHALLENGE-----------------";
input bool   isChallenge = false;
input double PASS_CRITERIA = 110100;
input double DAILY_LOSS_LIMIT = 4500;

希望这个脚本对你们有所帮助!


相关帖子

评论 (0)