feat: 完善突破策略
This commit is contained in:
@@ -763,23 +763,35 @@ bool OpenPosition(ENUM_ORDER_TYPE order_type, double wave_high, double wave_low,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取刚刚开仓的订单ticket
|
|
||||||
ulong ticket = trade.ResultOrder();
|
|
||||||
if(ticket == 0) {
|
|
||||||
ticket = trade.ResultDeal();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 等待持仓信息更新
|
// 等待持仓信息更新
|
||||||
Sleep(100);
|
Sleep(100);
|
||||||
|
|
||||||
// 选择该持仓
|
// 通过符号和魔术号查找刚开的持仓
|
||||||
if(!PositionSelectByTicket(ticket)) {
|
ulong ticket = 0;
|
||||||
Print("无法选择持仓 ticket:", ticket);
|
double open_price = 0;
|
||||||
return false;
|
|
||||||
|
for(int i = PositionsTotal() - 1; i >= 0; i--) {
|
||||||
|
if(!PositionSelectByTicket(PositionGetTicket(i)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(PositionGetString(POSITION_SYMBOL) != _Symbol)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(PositionGetInteger(POSITION_MAGIC) != InpMagicNumber)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 找到最新的持仓(没有SL/TP的)
|
||||||
|
if(PositionGetDouble(POSITION_SL) == 0 && PositionGetDouble(POSITION_TP) == 0) {
|
||||||
|
ticket = PositionGetTicket(i);
|
||||||
|
open_price = PositionGetDouble(POSITION_PRICE_OPEN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取实际成交价
|
if(ticket == 0) {
|
||||||
double open_price = PositionGetDouble(POSITION_PRICE_OPEN);
|
Print("无法找到刚开的持仓");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// 基于实际成交价计算止损金额
|
// 基于实际成交价计算止损金额
|
||||||
double stop_loss_amount = open_price * InpStopLossPercent / 100.0;
|
double stop_loss_amount = open_price * InpStopLossPercent / 100.0;
|
||||||
@@ -790,6 +802,14 @@ bool OpenPosition(ENUM_ORDER_TYPE order_type, double wave_high, double wave_low,
|
|||||||
stop_loss_amount = min_stop_loss;
|
stop_loss_amount = min_stop_loss;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取平台的最小止损距离
|
||||||
|
int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
|
||||||
|
double min_stop_distance = stops_level * _Point;
|
||||||
|
|
||||||
|
// 获取当前市场价格
|
||||||
|
double current_bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
||||||
|
double current_ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
|
||||||
|
|
||||||
double sl = 0, tp = 0;
|
double sl = 0, tp = 0;
|
||||||
|
|
||||||
if(order_type == ORDER_TYPE_BUY) {
|
if(order_type == ORDER_TYPE_BUY) {
|
||||||
@@ -799,6 +819,22 @@ bool OpenPosition(ENUM_ORDER_TYPE order_type, double wave_high, double wave_low,
|
|||||||
double actual_sl_amount = open_price - sl;
|
double actual_sl_amount = open_price - sl;
|
||||||
double take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
double take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
||||||
tp = NormalizeDouble(open_price + take_profit_amount, _Digits);
|
tp = NormalizeDouble(open_price + take_profit_amount, _Digits);
|
||||||
|
|
||||||
|
// 检查止损距离(多单检查与Bid的距离)
|
||||||
|
if(stops_level > 0 && (current_bid - sl) < min_stop_distance) {
|
||||||
|
sl = NormalizeDouble(current_bid - min_stop_distance, _Digits);
|
||||||
|
// 重新计算止盈
|
||||||
|
actual_sl_amount = open_price - sl;
|
||||||
|
take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
||||||
|
tp = NormalizeDouble(open_price + take_profit_amount, _Digits);
|
||||||
|
Print("止损距离不足,已调整 - 新止损:", sl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查止盈距离
|
||||||
|
if(stops_level > 0 && (tp - current_ask) < min_stop_distance) {
|
||||||
|
tp = NormalizeDouble(current_ask + min_stop_distance, _Digits);
|
||||||
|
Print("止盈距离不足,已调整 - 新止盈:", tp);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 先标准化止损价
|
// 先标准化止损价
|
||||||
sl = NormalizeDouble(open_price + stop_loss_amount, _Digits);
|
sl = NormalizeDouble(open_price + stop_loss_amount, _Digits);
|
||||||
@@ -806,11 +842,31 @@ bool OpenPosition(ENUM_ORDER_TYPE order_type, double wave_high, double wave_low,
|
|||||||
double actual_sl_amount = sl - open_price;
|
double actual_sl_amount = sl - open_price;
|
||||||
double take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
double take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
||||||
tp = NormalizeDouble(open_price - take_profit_amount, _Digits);
|
tp = NormalizeDouble(open_price - take_profit_amount, _Digits);
|
||||||
|
|
||||||
|
// 检查止损距离(空单检查与Ask的距离)
|
||||||
|
if(stops_level > 0 && (sl - current_ask) < min_stop_distance) {
|
||||||
|
sl = NormalizeDouble(current_ask + min_stop_distance, _Digits);
|
||||||
|
// 重新计算止盈
|
||||||
|
actual_sl_amount = sl - open_price;
|
||||||
|
take_profit_amount = actual_sl_amount * InpRiskRewardRatio;
|
||||||
|
tp = NormalizeDouble(open_price - take_profit_amount, _Digits);
|
||||||
|
Print("止损距离不足,已调整 - 新止损:", sl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查止盈距离
|
||||||
|
if(stops_level > 0 && (current_bid - tp) < min_stop_distance) {
|
||||||
|
tp = NormalizeDouble(current_bid - min_stop_distance, _Digits);
|
||||||
|
Print("止盈距离不足,已调整 - 新止盈:", tp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改持仓的SL/TP
|
// 修改持仓的SL/TP
|
||||||
if(!trade.PositionModify(ticket, sl, tp)) {
|
if(!trade.PositionModify(ticket, sl, tp)) {
|
||||||
Print("修改SL/TP失败: ", trade.ResultRetcode(), " - ", trade.ResultRetcodeDescription());
|
Print("修改SL/TP失败 - Ticket:", ticket,
|
||||||
|
" 错误码:", trade.ResultRetcode(),
|
||||||
|
" 描述:", trade.ResultRetcodeDescription(),
|
||||||
|
" 止损:", sl, " 止盈:", tp,
|
||||||
|
" 平台最小距离:", stops_level, "点");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 225 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 446 KiB |
Reference in New Issue
Block a user