金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
楼主: 半生瓜

求技术人员帮忙写策略

[复制链接]

9

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2023-8-7
曾用名:
 楼主| 发表于 2023-8-8 11:33 | 显示全部楼层
细节1.     持仓期最高价-收盘前5秒的价格>=3*当前最新atr 平仓,大于号前边得加上绝对值,如果是开空不加绝对值就是负数了。
细节2.     开仓手数要取整。
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-8-8 14:07 | 显示全部楼层
本帖最后由 技术009 于 2023-8-8 14:14 编辑

[PEL] 复制代码
//n1,n2是均线参数;m是高点判定周期,默认值是9;
//q是总资金的百分百
//n是品种数,这里建议回测品种数 和这个参数保持一致。否则代码本身无法知道你回测的品种数量的。
//y是表示3倍ATR回撤的参数
input:n1(5,1,500,1),n2(40,1,1000,1),m(9,2,1000,1),q(0.3,0.01,1,0.01),y(3,1,100,1),n(10,1,300,1);

 
//均线1,均线2.
ma5:ma(c,n1);
ma40:ma(c,n2);
 
//5日均线上穿40日均线,注意这里不是大于 是上穿. 
kd:cross(ma5,ma40) and h=hhv(h,m);
kk:cross(ma40,ma5) and l=llv(l,m);
 
//调用日线当前最新的ATR值
atr:"atr.atr#DAY"(14);
//进行手数的计算,不用取值,下单时候系统会自动处理的
ss:tasset*q/(n*3*multiplier*atr);


//时间条件。回测中无法精确控制时间,因此在回测时候直接按照日线收盘时候作为条件处理,实际运行中则判断当前时间是否大于等于145955;
//不建议在不活跃品种中使用这个时间控制
tcd:1;
//实际运行时候注释上面这句,把下面这句注释去掉
//tcd:CURRENTTIME>=145955;


//实际运行中这里建议换成dynainfo(  7) 获取最新值
最新价:c;
 
多可用:tbuyholdingex('','',1);
空可用:tsellholdingex('','',1);
 
净持仓:多可用+空可用;

//开多 
if kd and 多可用=0 and 净持仓=0 and  tcd then
begin
tbuy(1,ss,mkt);
end
 
//开空
if kk and 空可用=0  and  净持仓=0 and tcd then
begin
tbuyshort(1,ss,mkt);
end


//表示当前品种持仓期间最高盈利价格的全局变量名称
strx:STKLABEL&'_maxp';

maxp:=EXTGBDATA(strx);//开仓后最高价或者最低价
多均价:=tavgenterpriceex2('','',0);
//持仓后,更新开多后的最高价
if tbuyholdingex('','',1)<>0 then
begin
if maxp=0 then maxp:=多均价; 
if 最新价>maxp then begin
EXTGBDATASET(strx,最新价);        
end
end
 

空均价:=tavgenterpriceex2('','',1);
//持仓后,更新开空后的最低价
if tsellholdingex('','',1)<>0  then
begin
if  maxp=0 then maxp:=空均价;
if 最新价<maxp then
begin
EXTGBDATASET(strx,最新价);        
end
 
end
 
//从盈利最高价回撤 y倍atr平多仓
if (maxp-最新价)>=y*abs(atr) and 多可用>0 then
begin
tsell(1,0,mkt);
EXTGBDATASET(strx,0);          
end
 
 
if (最新价-maxp)>=y*abs(atr) and 空可用>0 then
begin
tsellshort(1,0,mkt);
EXTGBDATASET(strx,0);         
end
 




几个需要注意的点:

1.代码逻辑 在回测中无法完全体现,这个主要是回测机制缘故。收盘前5秒这个部分无法体现出来。
在日线上回测都是只能以日线结束时候的价格来操作。我在代码中tcd附近注释中有详细说明。
实际跑模拟或者实盘时候,务必按照注释说明 使用能在实际运行中奏效的代码。

2.下单条件里的均线条件是按照金叉死叉来的,不是均线大于和小于条件,这个有区别,所以额外说明下。按照金叉死叉 你这个开仓信号其实不会很多。  最高最低价是按照日线最高价是新高来的,不是按照你下单时候的价格是新高。比如今天日内最高价是100,收盘附近价格是80,只要100满足了新高 就开仓。  








3.资金控制这块,实际运行中和回测中恐怕都无法很好的控制。 主要你平仓必然是不同品种错位的,这样会释放资金的。 可能第一次开仓时候都是基于相同的总资金。但是后续就无法再按照这个初始资金来了。比如都是1号开仓的,4号时候出现第一个平仓的品种。其他品种还在持仓。这样的错位会让你的资金分配 逻辑变的复杂。   所以这块的逻辑可能还需要进一步调整,反正在回测上是无法很好的体现出效果来。

4.参数说明在注释中有简单说明,建议自行阅读下开头的注释部分。


设置相关的:
务必多补充些历史日线数据,否则你这个回测不出效果:
截图202308081400081269.png


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-8-8 14:15 | 显示全部楼层
另外就是,策略里使用了全局变量来记录持仓期间的盈利最高价:
截图202308081414371303.png

这个是在本地保存的。所以如果你手工清仓了,或者不连续的交易。这里是需要你手工清空的。否则程序会从这里读取之前保存的价格,有可能会导致程序逻辑误判的。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2023-8-7
曾用名:
 楼主| 发表于 2023-8-9 09:08 | 显示全部楼层
资金控制这块,实际运行中和回测中恐怕都无法很好的控制。 主要你平仓必然是不同品种错位的,这样会释放资金的。
这里不明白你说的什么意思,比如我100万初始资金,10个品种,现在开了5个品种,总资金达到110了,那么需要记录我的总资金为110。下次别的品种开仓就需要按照110来计算开仓手数了。
说的简单点就是开仓的时候需要获取账户实时的总值(已持仓+剩余资金),来推算开仓手数。
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-8-9 09:32 | 显示全部楼层
每个品种入场,离场必然是不同时间点错位的。

假设初始资金是100W。

所有品种第一次开仓都是以100W作为基准,那么现在存在的问题是:
品种A 第一次入场,然后又满足了条件平仓了,资金到达了120W。品种B也第一次入场了,但是暂时还没有触发平仓。
这时候品种A又触发了开仓,如果以当前权益120w开仓。 那么等B离场后再次开仓,它必然又是以另外一个权益数值为基准开仓的。 实际结果就是a,b 再次入场时候 就不是依照相同的资金分配来入场了。比如a是120w,b可能是140w作为分配的资金入场。


当然  如果你始终只按照百分百计算,不在乎每个品种 入场时候资金差异 那就无所谓了。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2023-8-7
曾用名:
 楼主| 发表于 2023-8-9 09:39 | 显示全部楼层
不是要所有品种第一次开仓以100万为基准,每次开仓数量=获取账户实时总值*0.3/品种数/止损倍数/ATR/每手乘数。
从第一笔交易说起,A品种用100万来开仓,持仓过程中盈利了5万,还未平仓。这时候B出现了开仓信号,那么获取当时的账户总值105万,按照105万来计算B的开仓手数,不知道这样表述你是否明白了。
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-8-9 09:40 | 显示全部楼层
那这样就无所谓了呀,始终按照当前资产百分百,而不是某个固定值的百分百,那现在的代码就是这样处理的。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2023-8-7
曾用名:
 楼主| 发表于 2023-8-9 09:42 | 显示全部楼层
if tbuyholdingex('','',1)<>0 then
begin
if maxp=0 then maxp:=多均价;
if 最新价>maxp then begin
EXTGBDATASET(strx,最新价);      
end
这几行能做个注释吗?看不太懂。代码估计还是有问题,昨天回测,收益和实际相比差比较多呀
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-8-9 09:46 | 显示全部楼层
回测有局限性。前面帖子里已经说过了,用日线回测,它只能以日线结束时候价格计算信号的。

你直接用模拟柜台测试跑吧。

上面那个就是在有持仓时候 更新持仓的最高 或者最低价,并且把这个价格写入到本地全局变量里的。

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2023-8-7
曾用名:
 楼主| 发表于 2023-8-9 09:49 | 显示全部楼层
用日线回测,它只能以日线结束时候价格计算信号的。即便是这样差别应该不会太大,模拟柜台跑就是模拟测试?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 06:43 , Processed in 0.146382 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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