大家好,
今天来给大家更新一下我的《简单有效的突破策略》。在这个代码中,我增加了一些针对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;
希望这个脚本对你们有所帮助!