金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 4739|回复: 17

新手求助,帮检查下代码

[复制链接]

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
发表于 2023-10-13 10:41 | 显示全部楼层 |阅读模式

刚开始使用金字塔,语言还不是很熟练,策略如上,根据这个思路写了段代码,但回测结果总感觉有点问题,想请老师帮看看代码尤其是交易逻辑编写有没有问题

//声明变量
input:s(12,5,40,4),p(26,20,100,8),m(9,1,100,10);
input:n(2,1,10,1),m1(20,1,1000,1);
input:m2(14,1,50,1);
input:amounts(1);
input:s1(0.02,0,0.2,0.01);
input:s2(0.95,0.5,1,0.01),s3(1.05,1,1.5,0.01);

//中间变量
DIFF:=EMA(CLOSE,S) - EMA(CLOSE,P);
DEA:=EMA(DIFF,M);
MACD1:=2*(DIFF-DEA), COLORSTICK;

BBI:(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12)+MA(CLOSE,24))/4;
UPR:BBI+N*STD(BBI,M1);
DWN:BBI-N*STD(BBI,M1);

TR1:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:=MA(TR1,M2);

//交易条件
cond_buy1:=cross(diff,dea);  //macd金叉
cond_buy3:=close/bbi>s2 and close/bbi<s3;  //0.95<最新价/bbi<1.05

cond_sell1:=cross(dea,diff);  //macd死叉
cond_sell2:=cross(close,upr) or cross(close,dwn);  // 最新价穿过boll上轨或下轨
cond_stop:=enterprice-close>=2*atr;  //两倍atr止损
cond_buy4:=close>=enterprice-2*atr;   //止损后反弹至止损位时重新开入订单

//执行交易
if holding=0 then
        buy(cond_buy1 and cond_buy3,amounts,market);   //买入条件1且条件3
if holding>0 then begin
        sell(cond_stop,holding,market);  //当买入后触发2倍atr止损
        if holding=0 then
                buy(cond_buy4,amounts,market);       //止损后反弹至2倍atr后重新买入
end
if holding>0 then  
        sell(cond_sell1 or cond_sell2,holding,market);    //卖出条件1或条件2








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-10-13 11:24 | 显示全部楼层
[PEL] 复制代码
//声明变量
input:s(12,5,40,4),p(26,20,100,8),m(9,1,100,10);
input:n(2,1,10,1),m1(20,1,1000,1);
input:m2(14,1,50,1);
input:amounts(1);
input:s1(0.02,0,0.2,0.01);
input:s2(0.95,0.5,1,0.01),s3(1.05,1,1.5,0.01);

variable:mark:=0;

//中间变量
diff:=ema(close,s) - ema(close,p);
dea:=ema(diff,m);
macd1:=2*(diff-dea), colorstick;

bbi:(ma(close,3)+ma(close,6)+ma(close,12)+ma(close,24))/4;
upr:bbi+n*std(bbi,m1);
dwn:bbi-n*std(bbi,m1);

tr1:=max(max((high-low),abs(ref(close,1)-high)),abs(ref(close,1)-low));
atr:=ma(tr1,m2);

//交易条件
cond_buy1:=cross(diff,dea);  //macd金叉
cond_buy3:=close/bbi>s2 and close/bbi<s3;  //0.95<最新价/bbi<1.05

cond_sell1:=cross(dea,diff);  //macd死叉
cond_sell2:=cross(close,upr) or cross(close,dwn);  // 最新价穿过boll上轨或下轨
cond_stop:=enterprice-close>=2*atr;  //两倍atr止损
cond_buy4:=close>=enterprice-2*atr;   //止损后反弹至止损位时重新开入订单

//执行交易
if holding=0 and mark=0 then buy(cond_buy1 and cond_buy3,amounts,market);   //买入条件1且条件3


if holding>0 and cond_stop and enterbars>0 then begin 
止损:sell(1,holding,market);  //当买入后触发2倍atr止损
mark:=1;//标记下 当前触发了止损了
end

if holding=0 and mark=1 and cond_buy4 then 
begin 
反弹开仓:buy(1,amounts,market);       //止损后反弹至2倍atr后重新买入
mark:=0;
end 

if holding>0 and enterbars>0 then  sell(cond_sell1 or cond_sell2,holding,market);    //卖出条件1或条件2

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

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-19 19:43 | 显示全部楼层
收到,看了下还有点不太明白,为啥在止损和离场的卖出交易函数,都需要加上个enterbar>0的条件判断?
回复

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-19 19:46 | 显示全部楼层
另外再单独问个哈,就是在交易函数中使用close和thisclose函数有什么区别的,如sell(1,0,close) 和sell(1,0,thisclose)
回复

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-19 20:03 | 显示全部楼层
还有个,就是按照理解我的交易函数使用的是次周期入场,不应该是当macd金叉判断成立后的下一个交易日开多仓,然后价格上穿boll上轨的下一个交易日平仓卖出嘛,但是我看图表好像是当根k线产生了交易信号

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-19 20:40 | 显示全部楼层
还有个小需求,就是这个阶段第二次止损的时候止损价是在反弹买入价下跌后的2倍atr,而我想把止损价仍然设置为买入开多仓时候下跌2倍atr,就是止损交易条件里边cond_stop:=enterprice-close>=2*atr中,enterprice能否限定为入场时的买入价,而不包括反弹止损后的买入价

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-19 21:26 | 显示全部楼层
刚开始上手,一次性提的问题有点小多哈
回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2023-10-20 08:07 | 显示全部楼层
PIN 发表于 2023-10-19 20:03
还有个,就是按照理解我的交易函数使用的是次周期入场,不应该是当macd金叉判断成立后的下一个交易日开多仓 ...

1.限制信号产生的位置,避免开仓时enterbar的影响。你自己输出看下它更容易理解。
2.前者在实际交易时按照最新价委托,后者按照对手价委托
3.信号产生的位置不会改变。次周期指令只会使用下个周期的价格做成成交价。
4.这种你可以考虑使用全局变量记录自己需要的买入价。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

33

主题

145

帖子

145

积分

等级: 免费版

注册:
2023-10-12
曾用名:
 楼主| 发表于 2023-10-20 17:07 | 显示全部楼层
我看了下这两段学习材料,可以这样理解嘛:
1. 如果是次周期入场的话,实际上当回测或实盘交易的时候,仍然是在下根K线上下单的,只不是信号出现在当根K线上
2. 如果采用了固定轮询模式,则交易函数需使用本周期入场,如采用了走完K线模式,则交易函数需使用次周期入场;如果是这样的话,不对应使用会产生什么后果

然后第4个小疑问,使用全局变量记录自己需要的买入价,当前还是有点不太会,可以有代码支持嘛,才看明白用mark来记录止损的操作

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2023-10-20 21:05 | 显示全部楼层
PIN 发表于 2023-10-20 17:07
我看了下这两段学习材料,可以这样理解嘛:
1. 如果是次周期入场的话,实际上当回测或实盘交易的时候,仍 ...

1.理解正确
2.提供者2中不同的指令区分,就是为了能够提现出运行模式的差异,
[PEL] 复制代码

//定义全局变量,用于记录开仓时的成交价
variable:one_enterprice:=0;
 
//开多条件语句
if holding=0 and mark=0 then begin
	buy(cond_buy1 and cond_buy3,amounts,market);   //买入条件1且条件3
	one_enterprice:=enterprice;//记录开仓后的开仓价,用于之后作为止损的因子使用
end

//止损条件
cond_stop:=one_enterprice-close>=2*atr;  //两倍atr止损
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-1 00:45 , Processed in 0.128742 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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