金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 4733|回复: 6

全局变量无法控制加仓次数如何解决?

[复制链接]

79

主题

190

帖子

200

积分

Rank: 2

等级: 标准版

注册:
2022-1-10
曾用名:
发表于 2022-4-11 14:07 | 显示全部楼层 |阅读模式
公式如下,截图见附件。全局变量控制加仓次数失败,请问如何解决?

//MA1MA2 加仓2次
//假设检验:波动率是否有连续性,1,同样比例下注,3%。 2. 波动率增大时,仓位提高1倍。 3. 波动率减小时,仓位提高1倍。
// 该程序是对假设1 的检验, 使用3% 同样的比例下注
//参数设置:缺损值        最小值        最大值        步长
INPUT:N1(8,1,10,1);//收盘在均线之上持续时间周期
INPUT:N2(31,1,100,1);//价格移动平均值计算时间周期
INPUT:MUL(2,1,10,1);// 加仓用 ATR 倍数
INPUT:RS(0.005,0.005,0.1,0.005); //头寸规模确定,单次押注占总资产比例
INPUT:RT(0.1,0.005,0.1,0.005); //头寸规模确定,加完仓后总的仓位与总资产比例

//中间变量
TR1:=MAX((H-L),MAX(ABS(H-REF(C,1)),ABS(L-REF(C,1)))); // 当日真实波动幅度
ATR:=EMA(TR1,20);//20日平均真实波动幅度
RSV:= MAX((INTPART((ASSET*RS)/(ATR*MULTIPLIER))),1);// 单次押注占当前资金的比率
RTV:=INTPART((ASSET*RT)/(ATR*MULTIPLIER)); //  所有押注占当前资金的比率
//中间变量 计算移动平均值
MA1:MA(CLOSE,N1);
MA2:MA(CLOSE,N2);
//交易条件
PKKDCOND:=MA1>MA2; // 平多开空条件
PDKKCOND:=MA1<MA2; // 平空开多条件
//交易指令
VARIABLE:BK1:=0,BK2:=0,BK3:=0; //通过全局变量限制多仓开仓次数一共为3次
VARIABLE:SK1:=0,SK2:=0,SK3:=0; //通过全局变量限制空仓开仓次数一共为3次
SELLSHORT(PKKDCOND AND HOLDING<0,HOLDING,MARKET);
BUY(PKKDCOND AND HOLDING=0,RSV,MARKET);
BK1:=1;
SELL(PDKKCOND AND HOLDING>0,HOLDING,MARKET);
BUYSHORT(PDKKCOND AND HOLDING=0,RSV,MARKET);
SK1:=1;
// 加多条件
BUYADDCOND:=HOLDING>0 AND ATR>REF(ATR,1) AND CLOSE>=ENTERPRICE+MUL*ATR AND ABS(HOLDING)<RTV;
// 加空条件
BUYSHORTADDCOND:=HOLDING<0 AND ATR>REF(ATR,1) AND CLOSE<=ENTERPRICE-MUL*ATR AND ABS(HOLDING)<RTV;

//交易指令
BUY(BUYADDCOND AND BK1=1,RSV,MARKET);
BK2:=1;
BUY(BUYADDCOND AND BK2=1,RSV,MARKET);
BK3:=1;

BUYSHORT(BUYSHORTADDCOND AND SK1=1,RSV,MARKET);
SK2:=1;
BUYSHORT(BUYSHORTADDCOND AND SK2=1,RSV,MARKET);
SK3:=1;

//显示当前交易头寸规模 资产状态
当前持仓: HOLDING,COLORYELLOW,LINETHICK0;
//当前资产:ASSET,LINETHICK4,COLORCYAN,NOAXIS;



多头加仓次数.png
空头加仓次数.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2022-4-11 14:54 | 显示全部楼层
你这个写法是控制不住这个全局变量的,你现在是要平常反手开仓的时候和最后最多加仓2次,这样算最多开3次?
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

79

主题

190

帖子

200

积分

Rank: 2

等级: 标准版

注册:
2022-1-10
曾用名:
 楼主| 发表于 2022-4-11 15:03 | 显示全部楼层
反手算第一次,后面 再加2次。多空最多各3次。
问题出在哪里?代码顺序?
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2022-4-11 15:16 | 显示全部楼层
本帖最后由 技术010 于 2022-4-11 15:17 编辑

你的这种写法,每根K线上,都会把全局变量置为1的,满足条件就会下单了。其实用一个全局变量就可以控制加仓的次数了,参考如下:
INPUT:N1(8,1,10,1);//收盘在均线之上持续时间周期
INPUT:N2(31,1,100,1);//价格移动平均值计算时间周期
INPUT:MUL(2,1,10,1);// 加仓用 ATR 倍数
INPUT:RS(0.005,0.005,0.1,0.005); //头寸规模确定,单次押注占总资产比例
INPUT:RT(0.1,0.005,0.1,0.005); //头寸规模确定,加完仓后总的仓位与总资产比例

//中间变量
TR1:=MAX((H-L),MAX(ABS(H-REF(C,1)),ABS(L-REF(C,1)))); // 当日真实波动幅度
ATR:=EMA(TR1,20);//20日平均真实波动幅度
RSV:= MAX((INTPART((ASSET*RS)/(ATR*MULTIPLIER))),1);// 单次押注占当前资金的比率
RTV:=INTPART((ASSET*RT)/(ATR*MULTIPLIER)); //  所有押注占当前资金的比率
//中间变量 计算移动平均值
MA1:MA(CLOSE,N1);
MA2:MA(CLOSE,N2);
//交易条件
PKKDCOND:MA1>MA2; // 平多开空条件
PDKKCOND:MA1<MA2; // 平空开多条件
//交易指令
VARIABLE:CS:=0; //通过全局变量限制多仓开仓次数一共为3次

IF PKKDCOND THEN BEGIN
        IF HOLDING<0 THEN BEGIN
SELLSHORT(PKKDCOND AND HOLDING<0,HOLDING,MARKET);
CS:=0;
END
BUY(PKKDCOND AND HOLDING=0,RSV,MARKET);
END

IF PDKKCOND THEN BEGIN
        IF HOLDING>0 THEN BEGIN
SELL(PDKKCOND AND HOLDING>0,HOLDING,MARKET);
CS:=0;
END
BUYSHORT(PDKKCOND AND HOLDING=0,RSV,MARKET);
END

// 加多条件
BUYADDCOND:=HOLDING>0 AND ATR>REF(ATR,1) AND CLOSE>=ENTERPRICE+MUL*ATR AND ABS(HOLDING)<RTV;
// 加空条件
BUYSHORTADDCOND:=HOLDING<0 AND ATR>REF(ATR,1) AND CLOSE<=ENTERPRICE-MUL*ATR AND ABS(HOLDING)<RTV;

//交易指令
IF BUYADDCOND AND CS<2 THEN BEGIN
BUY(BUYADDCOND,RSV,MARKET);
CS:=CS+1;
END

IF BUYSHORTADDCOND AND CS<2 THEN BEGIN
BUYSHORT(BUYSHORTADDCOND,RSV,MARKET);
CS:=CS+1;
END


//显示当前交易头寸规模 资产状态
当前持仓: HOLDING,COLORYELLOW,LINETHICK0;
当前资产:ASSET,LINETHICK4,COLORCYAN,NOAXIS;
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

79

主题

190

帖子

200

积分

Rank: 2

等级: 标准版

注册:
2022-1-10
曾用名:
 楼主| 发表于 2022-4-11 16:21 | 显示全部楼层
谢谢。
如果把这种等仓位加仓,改成金字塔加仓,该怎么处理?金字塔特指押注比例依次递减,1, 0.5, 0.25.
第一个仓位:
RSV1:= MAX((INTPART((ASSET*RS)/(ATR*MULTIPLIER))),1);// 第一次押注占当前资金的比率计算结果值
第二个仓位:
RSV2:= INTPART((ASSET*RS*0.5)/(ATR*MULTIPLIER)));// 第二次押注占当前资金的比率计算结果值
第三个仓位:
RSV3:= INTPART((ASSET*RS*0.25)/(ATR*MULTIPLIER)));// 第三次押注占当前资金的比率计算结果值


回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2022-4-11 16:28 | 显示全部楼层
那就需要把加仓下单语句拆开来写了,加仓代码如下,平仓反手的开仓手数就是RSV1:
IF BUYADDCOND AND CS=0 THEN BEGIN
BUY(BUYADDCOND,RSV2,MARKET);
CS:=CS+1;
END

IF BUYADDCOND AND CS=1 THEN BEGIN
BUY(BUYADDCOND,RSV3,MARKET);
CS:=CS+1;
END

IF BUYSHORTADDCOND AND CS=0 THEN BEGIN
BUYSHORT(BUYSHORTADDCOND,RSV2,MARKET);
CS:=CS+1;
END

IF BUYSHORTADDCOND AND CS=1 THEN BEGIN
BUYSHORT(BUYSHORTADDCOND,RSV3,MARKET);
CS:=CS+1;
END
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

79

主题

190

帖子

200

积分

Rank: 2

等级: 标准版

注册:
2022-1-10
曾用名:
 楼主| 发表于 2022-4-11 20:06 | 显示全部楼层
谢谢,专业人士就是专业人士!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-18 07:30 , Processed in 0.145983 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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