为了方便研究交易模式,所以才有了这篇“指标模拟回测程序”。这个指标的主要作用在于帮助快速梳理日线中符合自己交易策略的买卖点,以此初步判断买卖交易策略的胜率,帮助后续优化策略。

📈 效果演示

以下是指标程序效果速览(后附指标源码):

图1:2025年06月23日吉大正元,标记2025年06月23买入,在不高开的时候卖出。红色线是总资产线,初始发放10,000元初始资产,买卖股票后会自动计算股票市值和盈亏金额。其它白色、橙色线因为数值和10,000差距明显,这里在图里显示不出来。白色线收益率统计,是基于10,000初始资金计算收益率。
在这里插入图片描述
图2:2025年05月19日中超控股,效果大致如下,在经历至少2个连板后,股价在5日内回踩10日线,且当日股价下跌至少2%时,若次日早盘竞价高开则是确定反转,以开盘价追高买入。若买入后次日早盘竞价低开则卖出,若一直未低开则一直持股。
在这里插入图片描述


💻 指标源码

以下是指标源码,这里不做过多解释,代码都已经注释好了。若后续想要改写指标,却无从下手,可以查看文章【同花顺公式编辑进阶教程】进阶问题1 声明变量与调用变量
在这里插入图片描述

// ================= 一、初始变量设置 =================
初始日=20241024;    // 【需要设置】开始测试的日期
初始资金=10000;     // 【需要设置】初始资金
IF(DATETIME=初始日){可用资金=初始资金;};
IF(DATETIME>初始日){可用资金=REF(可用资金,1);};
IF(DATETIME=初始日){持股数量:0;};
IF(DATETIME>初始日){持股数量:REF(持股数量,1);};
IF(DATETIME=初始日){持股价格:0;};
IF(DATETIME>初始日){持股价格:REF(持股价格,1);};

// ================= 二、卖出点位判断 =================
// 特殊条件:买入股票后开始观测,买入当天不能卖出
sellCOND0=(持股数量>0);
// 卖出条件1:买入持股期间若某日低开,则返回1。即开盘价<昨日收盘价,直接以开盘价卖出
sellCOND1=IF(OPEN<REF(CLOSE,1),1,0);
卖出价格=OPEN;                                // 确定卖出价格,早盘竞价低开,则以开盘价快速跑路

// ================= 三、执行卖出操作 =================
IF(sellCOND0 AND sellCOND1){
可用资金=REF(可用资金,1)+持股数量*卖出价格;      // ①回收资金
持股数量=0;                                    // ②扣除股票
持股价格=0;                                    // ③删除持仓成本信息
DRAWTEXT(1,CLOSE,'卖出');                      // ④标记卖出
};

// ================= 四、买入点位判断 =================
MA5=MA(C,5);
MA10=MA(C,10);

// 择时条件1:判断前10日内,至少存在2次涨停。满足则返回1,不满足则返回0。
COND1=COUNT((C-PRE)/PRE>0.098,10)>=2;
// 择时条件2:检测前5日内,最多存在1日的收盘价低于MA10(此函数会把今日也算上,所以必须设为至少存在1日)。
COND2=COUNT(C<MA10,5)<=1;
// 择时条件3:检测前5日内MA5持续大于MA10
COND3=COUNT(MA5>MA10,5)=5;
// 择时条件4:检测当日收盘价格,在M10价格正负1%的范围内
COND4=(C-MA10)/MA10>-0.01 AND (C-MA10)/MA10<0.01;
// 择时条件5:检测当日收盘价格,比较昨日下跌超过2%
COND5=(C-PRE)/PRE<-0.02;
// 择时条件6:检测次日高开
COND6=OPEN>REF(CLOSE,1);


// ================= 五、执行买入操作 =================
买入价格=OPEN;                                         // 确定买入价格,早盘竞价高开,追高买入
买入股数=FLOOR(REF(可用资金,1)/(买入价格*100))*100;     // 确定买入股数,确认买入的是100的整数倍数

// 买入条件1:如果以上6个择时条件均满足,则给出BUYCOND1买入信号,且输出红色箭头的icon作为标识
finalCond = REF(COND1,1) + REF(COND2,1) + REF(COND3,1) + REF(COND4,1) + REF(COND5,1) + COND6;
IF(finalCond = 6){BUYCOND1=1;DRAWICON(1,C,1);};       
// 买入条件2:判断账户是否有资金可用,即足够买最低1手,若满足则给出BUYCOND2买入信号
BUYCOND2=((REF(可用资金,1)/(买入价格*100))>=1);
// 以上两个买入信号同时满足,则执行买入操作
IF(BUYCOND1 AND BUYCOND2){
可用资金=REF(可用资金,1)-买入股数*买入价格;      // ①扣除资金
持股数量=买入股数;                              // ②划入股票
持股价格=买入价格;                              // ③记录成本
DRAWTEXT(1,CLOSE,'买入');                      // ④标记买入
};


// ================= 六、收盘计算持仓信息 =================
// 总资产:手中现金 + 以当日收盘价格计算持仓市值
IF(DATETIME>=初始日){总资产:可用资金+持股数量*CLOSE,colorred;};
// 收益率:以初始资金计算收益率
IF(DATETIME>=初始日){收益率:(总资产-初始资金)/初始资金*100,colorwhite;};

🤔 后续展望

  • 未设置手续费:这个指标程序未加入买卖手续费扣除,所以显示的收益存在一定水分,追求严谨,可以自行加入手续费部分的代码。
  • 只适用于日线:这个指标只适用于日周期k线,不能切换分时、周线、月线等周期,因为程序是基于“初始日=20241024”来执行的,这也就意味着你所有设定的买卖条件都只能调用日k内的技术指标要素。
  • 买卖模式优化:这里的买卖条件只是对几只走势较好的股票进行事后拟合,实际上适合这样模式的股票几乎万里挑一,错过了就永远错过了。
Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐