
等级: 新手上路
- 注册:
- 2025-3-12
- 曾用名:
|
完整程序:
INPUT: MA240周期(240), MA20周期(20), MA60周期(60), 手数(10,1,20,1), 加仓手数(1,1,20,1), 移动止损点数(35);
// 声明普通全局变量(图表级)
VARIABLE:
zs1:=0, // 初始化止损位
被打止损:=0, // 记录是否被打止损
止损价格:=0, // 记录止损时的价格
加仓次数:=0; // 记录加仓次数
// 均线系统
MA240:=MA(CLOSE,MA240周期);
MA20:=MA(CLOSE,MA20周期);
MA60:=MA(CLOSE,MA60周期);
MAday:=STKINDI('','ma.ma3(60)',0,6,0);
c60:=MA(CLOSE,60) - 5*MINDIFF;
c61:=MA(CLOSE,60) + 5*MINDIFF;
// MACD指标
DIFF := EMA(CLOSE,12) - EMA(CLOSE,26);
DEA := EMA(DIFF,9);
MACD := 2*(DIFF-DEA);
水上金叉 := CROSS(DIFF, DEA) AND DIFF > 0;
水下死叉 := CROSS(DEA, DIFF) AND DIFF < 0;
// 方向判断模块
多空方向 := IFF(CLOSE >= MA240 AND CLOSE >= MAday, 1, -1);
// 交易信号模块
金叉条件 := CROSS(MA20, MA60) AND REF(CLOSE,1) >= REF(MA60,1);
死叉条件 := CROSS(MA60, MA20) AND REF(CLOSE,1) <= REF(MA60,1);
// 主交易系统
IF HOLDING = 0 THEN BEGIN
// 开多条件
IF 多空方向 = 1 AND 金叉条件 THEN BEGIN
BUY(1, 手数, MARKET);
zs1 := CLOSE - 移动止损点数*MINDIFF; // 初始化多头止损
被打止损 := 0; // 重置被打止损标志
加仓次数 := 0; // 重置加仓次数
END
// 开空条件
IF 多空方向 = -1 AND 死叉条件 THEN BEGIN
BUYSHORT(1, 手数, MARKET);
zs1 := CLOSE + 移动止损点数*MINDIFF; // 初始化空头止损
被打止损 := 0; // 重置被打止损标志
加仓次数 := 0; // 重置加仓次数
END
// 回补仓逻辑 - 多单
IF 被打止损 = 1 AND 水上金叉 AND CLOSE > MA60 THEN BEGIN
BUY(1, 手数, MARKET);
zs1 := CLOSE - 移动止损点数*MINDIFF;
被打止损 := 0; // 重置被打止损标志
加仓次数 := 0; // 重置加仓次数
END
// 回补仓逻辑 - 空单
IF 被打止损 = -1 AND 水下死叉 AND CLOSE < MA60 THEN BEGIN
BUYSHORT(1, 手数, MARKET);
zs1 := CLOSE + 移动止损点数*MINDIFF;
被打止损 := 0; // 重置被打止损标志
加仓次数 := 0; // 重置加仓次数
END
END ELSE BEGIN
// 加仓逻辑 - 多单
IF HOLDING > 0 AND 加仓次数 < 2 AND 水上金叉 AND CLOSE > MA60 AND 被打止损 = 0 THEN BEGIN
BUY(1, 加仓手数, MARKET);
加仓次数 := 加仓次数 + 1;
// 更新止损位为最新加仓价格的移动止损
zs1 := MAX(zs1, CLOSE - 移动止损点数*MINDIFF);
END
// 加仓逻辑 - 空单
IF HOLDING < 0 AND 加仓次数 < 2 AND 水下死叉 AND CLOSE < MA60 AND 被打止损 = 0 THEN BEGIN
BUYSHORT(1, 加仓手数, MARKET);
加仓次数 := 加仓次数 + 1;
// 更新止损位为最新加仓价格的移动止损
zs1 := MIN(zs1, CLOSE + 移动止损点数*MINDIFF);
END
// 移动止损逻辑
IF HOLDING > 0 THEN BEGIN
// 多头移动止损(跟踪最高价)
zs1 := MAX(zs1, HIGH - 移动止损点数*MINDIFF);
END ELSE IF HOLDING < 0 THEN BEGIN
// 空头移动止损(跟踪最低价)
zs1 := MIN(zs1, LOW + 移动止损点数*MINDIFF);
END
// 平仓条件
IF HOLDING > 0 AND (死叉条件 OR CLOSE <= zs1 OR CLOSE < c60) THEN BEGIN
SELL(1, ABS(HOLDING), MARKET);
IF CLOSE <= zs1 THEN BEGIN // 记录被打止损
被打止损 := 1;
止损价格 := CLOSE;
END
加仓次数 := 0; // 重置加仓次数
END
IF HOLDING < 0 AND (金叉条件 OR CLOSE >= zs1 OR CLOSE > c61) THEN BEGIN
SELLSHORT(1, ABS(HOLDING), MARKET);
IF CLOSE >= zs1 THEN BEGIN // 记录被打止损
被打止损 := -1;
止损价格 := CLOSE;
END
加仓次数 := 0; // 重置加仓次数
END
END
// 仓位管理模块
IF HOLDING > 手数 THEN BEGIN
SELL(1, HOLDING - 手数, MARKET);
END
IF HOLDING < -手数 THEN BEGIN
SELLSHORT(1, ABS(HOLDING) - 手数, MARKET);
END
// 状态监控
AA: zs1, COLORRED; // 显示动态止损线
当前持仓:HOLDING,COLORGRAY,LINETHICK0;
被打止损标志:被打止损,COLORGRAY,LINETHICK0;
加仓次数显示:加仓次数,COLORGRAY,LINETHICK0;
1、我试过将鼠标移到信号位置,什么都不显示啊? |
|