[PEL] 复制代码 WARNING_DISABLE:9; // 禁止图表与后台函数混用警告
// 全局变量定义
GLOBALVARIABLE:buy_order_id=0, sell_order_id=0; // 存储买入/卖出委托单ID
GLOBALVARIABLE:buy_filled=0, sell_filled=0; // 标记委托成交状态
GLOBALVARIABLE:buy_pending=0, sell_pending=0; // 标记委托挂起状态
GLOBALVARIABLE:last_trade_time=0; // 记录上次交易时间
VARIABLE:buy_price=0, sell_price=0; // 计算的买入/卖出价格
VARIABLE:run_mode=0; // 记录运行模式
VARIABLE:is_realtime=0; // 标记实时交易状态
VARIABLE:min_trade_interval=0; // 最小交易间隔(设为0允许连续交易)
VARIABLE:last_trade_minute=0; // 上次交易分钟数
VARIABLE:last_buy_price=0, last_sell_price=0; // 记录上次发出委托的价格
// 引用后台持仓和资金函数
MYHOLDING:=#MYHOUTAIFUN.MYHOLDING#; // 持仓数量
MYCASH:=#MYHOUTAIFUN.MYCASH#; // 可用资金
// 初始化:每个交易日开始时重置状态
if BARPOS=1 then
begin
buy_order_id := 0;
sell_order_id := 0;
buy_filled := 0;
sell_filled := 0;
buy_pending := 0;
sell_pending := 0;
last_trade_time := 0;
run_mode := WORKMODE;
is_realtime := 0;
last_trade_minute := 0;
last_buy_price := 0;
last_sell_price := 0;
end;
// 信号价格计算(基于当前价格)
buy_price := CLOSE * 0.995; // 下跌0.5%触发买入
sell_price := CLOSE * 1.01; // 上涨1%触发卖出
// 实时交易状态检测
current_minute := (TIME / 100) * 60 + MOD(TIME, 100); // 将TIME转换为分钟
is_realtime := (TIME > last_trade_time);
last_trade_time := TIME;
// 交易频率控制(设为0允许连续交易)
can_trade := (current_minute - last_trade_minute >= min_trade_interval) or (last_trade_minute = 0);
// 同时管理买入和卖出委托
if is_realtime and can_trade then
begin
// 无论是否有未成交委托,都重新计算并发送新委托
// 计算交易量
buy_volume := max(100, intpart(MYCASH * 0.3 / buy_price / 100) * 100);
sell_volume := MYHOLDING; // 卖出全部持仓
// 发送买入委托(开多)
if buy_volume > 0 then
begin
buy_order_id := tbuy(1, buy_volume, mkt);
buy_pending := buy_price;
last_buy_price := buy_price;
end;
// 发送卖出委托(平多)
if sell_volume >= 100 then
begin
sell_order_id := tsell(1, sell_volume, mkt);
sell_pending := sell_price;
last_sell_price := sell_price;
end;
end;
// 检查买入委托是否成交
if buy_pending>0 and MYHOLDING>ref(MYHOLDING,1) then
begin
buy_filled := 1;
buy_pending := 0;
// 买入成交后撤销所有卖出委托
TCANCEL(1, 2);
sell_pending := 0;
last_trade_minute := current_minute;
end;
// 检查卖出委托是否成交
if sell_pending>0 and MYHOLDING<ref(MYHOLDING,1) then
begin
sell_filled := 1;
sell_pending := 0;
// 卖出成交后撤销所有买入委托
TCANCEL(1, 1);
buy_pending := 0;
last_trade_minute := current_minute;
end;
// 显示当前状态
当前价:CLOSE, linethick0;
买入价:buy_price, colorblue, linethick0;
卖出价:sell_price, colorred, linethick0;
持仓数量:MYHOLDING, linethick0;
可用资金:MYCASH, linethick0;
买入委托ID:buy_order_id, linethick0;
卖出委托ID:sell_order_id, linethick0;
买入状态:buy_pending, linethick0;
卖出状态:sell_pending, linethick0;
上次买入价:last_buy_price, linethick0;
上次卖出价:last_sell_price, linethick0;
持续双向委托:
每个周期都基于当前价格计算买入和卖出触发价
同时发送买入和卖出委托,无论之前是否有未成交委托
成交后处理:
当买入成交时,立即撤销所有卖出委托(平多方向)
当卖出成交时,立即撤销所有买入委托(开多方向)
资金管理优化:
动态计算买入量,使用 30% 的可用资金
卖出时使用全部持仓
连续交易支持:
设置最小交易间隔为 0,允许连续交易
记录上次交易价格,便于跟踪
这个策略实现了你描述的功能:
以当前价格为基准,同时发出上涨 1% 卖出和下跌 0.5% 买入的委托
无论价格如何变动,持续更新并发送新的委托
当任意一个方向的委托成交后,立即撤销另一个方向的所有未成交委托
确保同一时间只有一个方向的交易生效,但不限制后续交易
你可以根据实际需要调整买入 / 卖出比例和资金使用比例。这个策略在波动较大的市场中可能会产生较多交易信号,建议先进行充分回测。 |