求助:如何修改WeeklyProfit函数实现按交易品种统计每周盈亏
按交易品种拆分统计每周盈亏的实现方案
要实现按单个货币对拆分统计每周盈亏,核心是用键值对形式的数组组合跟踪每个品种的累计盈亏,替代原来的单一盈亏变量。以下是具体实现步骤和修改后的代码:
核心思路
- 用两个平行数组模拟关联映射:一个存货币对名称,一个存对应品种的累计盈亏(包含利润、隔夜息、手续费)
- 遍历历史订单时,先过滤本周内的订单,再按品种更新对应盈亏值
- 最后遍历数组,拼接每个品种的盈亏结果
修改后的代码
string WeeklyProfitBySymbol() { string result = ""; int hstTotal = OrdersHistoryTotal(); datetime weeklyStartTime = iTime(Symbol(), PERIOD_W1, 0); // 获取本周起始时间 // 定义平行数组,存储品种名称和对应盈亏 double symbolProfits[]; string symbols[]; int symbolCount = 0; for(int i = 0; i < hstTotal; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // 仅统计本周内的订单 if(OrderOpenTime() >= weeklyStartTime) { string currentSymbol = OrderSymbol(); double orderTotal = OrderProfit() + OrderSwap() + OrderCommission(); bool symbolExists = false; // 检查当前品种是否已在数组中,存在则累加盈亏 for(int j = 0; j < symbolCount; j++) { if(symbols[j] == currentSymbol) { symbolProfits[j] += orderTotal; symbolExists = true; break; } } // 若为新品种,添加到数组中 if(!symbolExists) { ArrayResize(symbols, symbolCount + 1); ArrayResize(symbolProfits, symbolCount + 1); symbols[symbolCount] = currentSymbol; symbolProfits[symbolCount] = orderTotal; symbolCount++; } } } } // 格式化拼接结果字符串 for(int k = 0; k < symbolCount; k++) { result += StringFormat("%s: %.2f %s\n", symbols[k], symbolProfits[k], AccountCurrency()); } return result; }
关键说明
- MQL4原生无字典类型,用
symbols和symbolProfits两个平行数组实现品种与盈亏的映射 - 每次处理订单时先检查品种是否已存在,避免重复创建条目
- 用
StringFormat格式化输出,保留两位小数让结果更易读
内容的提问来源于stack exchange,提问作者mraniki
相关产品推荐
相关产品推荐

