
等级: 专业版
- 注册:
- 2024-7-16
- 曾用名:
|
// 修正后的后台程序化交易策略 - 169日均线突破策略
// 参数定义
INPUT:MA_PERIOD(169,10,300,1); // 均线周期参数
INPUT:MAX_HOLDING(1,1,100,1); // 最大持仓手数
INPUT:VOLATILITY_THRESH(0.4,0.1,5,0.1); // 价格波动阈值(%)
INPUT:ORDER_TIMEOUT(5,1,60,1); // 订单超时时间(秒)
INPUT:DELAY_MINUTES(1,1,60,1); // 交易后冷却时间(分钟)
// 全局变量声明
GLOBALVARIABLE:order_placed:=0; // 记录是否已下单
GLOBALVARIABLE:order_time:=0; // 记录下单时间
GLOBALVARIABLE:initial_holding:=0; // 记录初始持仓
GLOBALVARIABLE:program_active:=1; // 程序运行标志
GLOBALVARIABLE:last_trade_time:=0; // 记录最后成交时间
GLOBALVARIABLE:is_delaying:=0; // 延时状态标志
// 计算169日均线
MA169:MA(CLOSE,MA_PERIOD);
// 安全计算价格波动百分比(使用可回溯的REF函数替代DYNAINFO)
prev_close := REF(CLOSE,1);
price_change_pct := IF(VALID(prev_close), ABS(prev_close-C)/prev_close*100, 0);
// 初始化记录持仓
IF BARPOS=1 THEN initial_holding:=TBUYHOLDINGEX('','',1);
// 交易条件(增加数据有效性验证)
加多条件 : VALID(MA169) AND VALID(prev_close) AND
CROSS(CLOSE,MA169) AND program_active=1 AND
price_change_pct <= VOLATILITY_THRESH AND
NOT(TISREMAIN(1)) AND
TBUYHOLDINGEX('','',1) < MAX_HOLDING;
// 价格波动过大条件
volatility_too_high := price_change_pct > VOLATILITY_THRESH;
// 下单逻辑(增加时间戳验证)
IF 加多条件 AND order_placed=0 AND TIME>last_trade_time THEN BEGIN
TBUY(1,MAX_HOLDING,MKT,0,0,'');
order_placed:=1;
order_time:=TIMETOT0(TIME);
initial_holding:=TBUYHOLDINGEX('','',1);
// DEBUGFILE('D:\TradeLog.txt','[安全模式]开多单 @%.2f 时间:%s',C,NUMTOSTR(TIME,0));
END;
// 其他逻辑保持不变...
// 波动过大警告
IF CROSS(CLOSE,MA169) AND volatility_too_high AND program_active=1 THEN BEGIN
DRAWTEXT(ISLASTBAR,HIGH,'波动过大放弃交易'),COLORYELLOW;
END;
// 撤单逻辑(超时未成交)
IF order_placed=1 AND (TIMETOT0(TIME)-order_time)>ORDER_TIMEOUT THEN BEGIN
TCANCEL(1=1,1); // 撤所有开多未成交单
order_placed:=0; // 重置下单标志
DEBUGFILE('D:\TradeLog.txt','撤单 @%.2f 超时未成交',C);
END;
// 检查持仓变化
IF order_placed=1 AND (TBUYHOLDINGEX('','',1)-initial_holding)>=1 THEN BEGIN
last_trade_time := TIMETOT0(TIME); // 记录成交时间
is_delaying := 1; // 进入延时状态
order_placed:=0; // 重置下单标志
//DEBUGFILE('D:\TradeLog.txt','成交 @%.2f 持仓:%d',C,TBUYHOLDINGEX('','',1));
END;
// 冷却期处理
IF is_delaying=1 THEN BEGIN
elapsed_seconds := TIMETOT0(TIME) - last_trade_time;
// 冷却时间到达
IF elapsed_seconds >= (DELAY_MINUTES*60) THEN BEGIN
program_active:=0; // 停止程序
is_delaying := 0; // 重置延时状态
// DEBUGFILE('D:\TradeLog.txt','策略冷却完成,停止交易');
END;
END;
// 可视化
//DRAWKLINE(H,O,L,C);
//DRAWLINE1(MA169,COLORBLUE);
DRAWTEXT(ISLASTBAR AND 加多条件,LOW,'加多信号'),COLORRED;
DRAWTEXT(ISLASTBAR AND program_active=0,HIGH,'程序已停止'),COLORGREEN;
DRAWNUMBER(ISLASTBAR,C,price_change_pct,2),COLORWHITE;
|
|