金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 1571|回复: 137

后台多策略以净持仓方式发开平指令

[复制链接]

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
发表于 2024-10-9 15:39 | 显示全部楼层 |阅读模式
两套简单的策略,分别独立运行,各自图表出各自理论信号,持仓判断也是图表上的理论持仓,仅有后台下单的指令。如何编写图表上的两套策略的总的图表理论净持仓,或总的一个下单信号,用于后台下单?有没有范例?目的是节省一部分手续费和滑点损失
策略全部是走完K下单


策略1//中间变量MA1:=MA(CLOSE,10);MA2:=MA(CLOSE,30);手数:=1;//交易条件开多条件:=CROSS(MA1,MA2);//开多条件开空条件:=CROSS(MA2,MA1);//开空条件平多条件:=C<MA2; //平多条件平空条件:= C>MA2;//平空条件//交易系统if HOLDING=0 THEN  BEGIN    TBUY(开多条件,手数,MKT);        BUY(开多条件,手数,MARKET);    TBUYSHORT(开空条件,手数,MKT);        BUYSHORT(开空条件 ,手数,MARKET);  ENDif HOLDING>0  THEN  BEGIN      TSELL(平多条件,手数,MKT);        SELL(平多条件,手数,MARKET);  ENDif HOLDING<0  THEN  BEGIN        TSELLSHORT(平空条件,手数,MKT);    SELLSHORT(平空条件,手数,MARKET);  END策略2MA25:=EMA(CLOSE,25);DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26);DEA:=EMA(DIFF,9);MACD:=2*(DIFF-DEA);手数:=1;//交易条件开多条件:=CROSS(MACD,0);//开多条件开空条件:=CROSS(0,MACD);//开空条件平多条件:=C<MA25; //平多条件平空条件:= C>MA25;//平空条件//交易系统if HOLDING=0 THEN  BEGIN    TBUY(开多条件,手数,MKT);        BUY(开多条件,手数,MARKET);    TBUYSHORT(开空条件,手数,MKT);        BUYSHORT(开空条件 ,手数,MARKET);  ENDif HOLDING>0  THEN  BEGIN      TSELL(平多条件,手数,MKT);        SELL(平多条件,手数,MARKET);  ENDif HOLDING<0  THEN  BEGIN        TSELLSHORT(平空条件,手数,MKT);    SELLSHORT(平空条件,手数,MARKET);  END
回复

使用道具 举报

2

主题

4433

帖子

4433

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2024-10-9 15:44 | 显示全部楼层
这个有现成范例可参考的:
https://www.weistock.com/bbs/for ... &extra=page%3D1

你需要在你的策略1,2,3 里再额外定义一个表示 理论持仓的变量。

ho:holding;

之后,完全新建一个策略,策略代码参考前面链接里的。你只需要在新策略里汇总 调用到的理论持仓就可以了。





回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-10 13:04 | 显示全部楼层
//策略理论持仓
ho策略1:stkindiex(stklabel,'策略1.ho',0,1,0,500);
//上一根k线的理论持仓
before_ho策略1:stkindiex(stklabel,'策略1.ho',0,1,-1,500);
//策略理论持仓
ho策略2:stkindiex(stklabel,'策略2.ho',0,1,0,500);
//上一根k线的理论持仓
before_ho策略2:stkindiex(stklabel,'策略2.ho',0,1,-1,500);


ho1:ho策略1+ho策略2;
before_ho1:before_ho策略1+before_ho策略2;



//账户多头持仓
tbuyho:tbuyholdingex('',STKLABEL,1);
//账户空头持仓
tsellho:tsellholdingex('',STKLABEL,1);
//是否有未成交单,返回1表示有未成交
is_order:TGLOBALSUBMITEX(0,'',stklabel,0);

//如果当前品种有挂单或者理论策略的当根k理论持仓有变化,就不执行
if is_order or (ho1<>before_ho1) then exit;
else
BEGIN
        //多头部分                       
        if ho1>=0 and tsellho>0 then tsellshort(1,tsellho,mkt);
        //理论持仓大于0,补仓
        if ho1>0 and ho1>tbuyho then
        BEGIN
                tbuy(1,ho1-tbuyho,mkt);
        END
        //理论持仓大于0,减仓
        if ho1>0 and ho1<tbuyho then
        BEGIN
                tsell(1,tbuyho-ho1,mkt);
        END

        //空头部分
        if ho1<=0 and tbuyho>0 then tsell(1,tbuyho,mkt);
        //理论持仓小于0,补仓
        if ho1<0 and abs(ho1)>tsellho then
        BEGIN
                tbuyshort(1,abs(ho1)-tsellho,mkt);
        END
        //理论持仓小于0,减仓
        if ho1<0 and abs(ho1)<tsellho then
        BEGIN
                tsellshort(1,tsellho-abs(ho1),mkt);
        END                        
END
ho:holding;

回复

使用道具 举报

2

主题

4433

帖子

4433

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2024-10-10 13:16 | 显示全部楼层
对的。多策略是这样汇总的。

回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-10 13:31 | 显示全部楼层
1、若引用两个策略的话,我在上面的用红字体改写的对不对?2、ho1的值=净持仓策略最后执行完开平指令后的持仓状态值?3、我想让这个净持仓的策略分别输出ho1的值和最后执行完开平指令后的持仓状态,策略1和策略2的语句最后加上ho:holding;可以体现,在这个净持仓策略上ho:holding;也放最后行不?
回复

使用道具 举报

2

主题

4433

帖子

4433

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2024-10-10 13:47 | 显示全部楼层
1.对的。
2.这个框架的逻辑就是信号稳定时候才执行的。

这里做了限制

//如果当前品种有挂单或者理论策略的当根k理论持仓有变化,就不执行
if is_order or (ho1<>before_ho1) then exit;

3.
ho:holding;
就正常放在最后面就行,你不需要放到前面。  你担心的问题 前面贴的那句代码就已经处理了。
回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-10 18:29 | 显示全部楼层
我们从图表转入后台时候往往会发现后台没有持仓同步这个功能,那是因为后台本质上使用的是账户持仓而非理论持仓
那么如果我们还是想要实现这个功能怎么办呢,这边给出一个模板范例大致原理就是获取图表策略的理论持仓holding然后和账户持仓做匹配。
此外范例增加了有未成交单或者图表最新的持仓和上一根不一样(最新k有发生持仓变化),此时同步不会执行。

注意:所引用的策略最后要输出一个ho:holding;用来被调用,另外这里默认调用500根k计算得出持仓结果,如果要和图表上进行对应也需要控制图表k线数量在500
另外这里策略理论持仓是一个策略的,如果你有多个策略引用可以进行多个策略的stkindiex,然后把引用过来的持仓加起来得到一个总的理论持仓.


这段话里讲的是净持仓策略里引用的策略1和策略2的K线数量都是500,那后台运行时选择K线数量能否是5或100?因为运行的净持仓策略也有50多个,担心K线数量太多导致电脑资源不够用
回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-10 18:34 | 显示全部楼层
若不行的话 ,我改下面引用策略1和策略2的K线数量为100,然后净持仓策略也用100,这样可以么

ho策略1:stkindiex(stklabel,'策略1.ho',0,1,0,100);

before_ho策略1:stkindiex(stklabel,'策略1.ho',0,1,-1,100);

ho策略2:stkindiex(stklabel,'策略2.ho',0,1,0,100);

before_ho策略2:stkindiex(stklabel,'策略2.ho',0,1,-1,100);
回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-10 21:25 | 显示全部楼层
如图:策略1在10月10日显示持仓0,策略2在10月10日显示持仓1,为什么净持仓策略引用的策略2显示持仓为0呢?是公式有问题还是其它原因?

策略1

策略1

策略2

策略2

净持仓

净持仓
回复

使用道具 举报

33

主题

213

帖子

213

积分

Rank: 4

等级: 专业版

注册:
2024-6-21
曾用名:
 楼主| 发表于 2024-10-11 07:49 | 显示全部楼层
数据量都设置的是500,不仅是这一个品种,50多个品种里其它好多品种持仓也都对不上
12.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-12-24 11:36 , Processed in 0.127858 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表