金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2522|回复: 9

指标编写问题

[复制链接]

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
发表于 2023-12-4 16:07 | 显示全部楼层 |阅读模式
daily_return:=close/REF(close,1)-1;
i:=BARPOS;
for j=i downto 1 do
BEGIN
  if sum(SGN(daily_return(j-4:j)))>0
     if sum(daily_return(j-4:j))<0
       cw[j]:=1;
     else if (high-open)/(open-low)>=1
       cw[j]:=1;
     else
       cw[j]:=-1;
     end;
  else
     if sum(daily_return(j-4:j))>=0
       cw[j]:=1;
     else if (high-open)/(open-low)>=1
       cw[j]:=1;
     else
       cw[j]:=-1;
     end;
   end;
end;

老师,这串代码运行一直提示缺少分号,麻烦帮忙看下是什么问题,谢谢

回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2023-12-4 16:11 | 显示全部楼层
本帖最后由 技术006 于 2023-12-4 16:20 编辑

你策略逻辑缺失关键词。if语句的语法是

if  ...... then begin

end

else if  ...... then begin

end

else  ..... then begin

end

由于你的代码逻辑是多分支的,代码块的组合有很多种,只有你自己进行调整。注:pel中没有这种写法daily_return(j-4:j)
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2023-12-4 16:21 | 显示全部楼层
if sum(SGN(daily_return(j-4:j)))>0

请问这个长度不能大于20字符是要改成什么样才能行
回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2023-12-4 16:23 | 显示全部楼层
没有这种写法,不知道这句haunt表达的是什么意思。pel都是序列变量。建议你遵循下pel的基本语法定义。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2023-12-4 16:25 | 显示全部楼层
就是想表达最近4根K线的daily_return之和,那我只能用ref来一个一个加了是吗
回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2023-12-4 16:26 | 显示全部楼层
那你循环的作用是什么?或者说你这段代码想达到什么效果
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2023-12-5 09:09 | 显示全部楼层
daily_return:=close/REF(close,1)-1;
SDR:=SGN(daily_return);
if REF(SDR,1)+REF(SDR,2)+REF(SDR,3)+REF(SDR,4)+REF(SDR,5)>0 then BEGIN
   if REF(daily_return,1)+REF(daily_return,2)+REF(daily_return,3)+REF(daily_return,4)+REF(daily_return,5)<0 then BEGIN
     cw:=1;
   END;
   else if (ref(h,1)-REF(o,1))/(REF(o,1)-REF(l,1))>=1 then BEGIN
     cw:=1;
   END;
   else
     cw:=-1;
   END;
else
   if REF(daily_return,1)+REF(daily_return,2)+REF(daily_return,3)+REF(daily_return,4)+REF(daily_return,5)>=0 then BEGIN
     cw:=1;
   END;
   else if (ref(h,1)-REF(o,1))/(REF(o,1)-REF(l,1))>=1 then BEGIN
     cw:=1;
   END;
   else
     cw:=-1;
AA:cw

老师,我昨天看了下,确实不需要用到循环。然后我重新改了一下,发现cw一直显示等于1,请问是嵌套哪里出了问题吗?
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-12-5 09:12 | 显示全部楼层
因为你用在了序列模式下。这种使用if语句的 代码不用在序列下使用。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2023-12-5 09:27 | 显示全部楼层
哦哦,我改成逐K模式就对了,谢谢老师
回复

使用道具 举报

22

主题

149

帖子

149

积分

等级: 免费版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2023-12-5 10:44 | 显示全部楼层
if cw=1
then begin 开多: BUY(HOLDING=0,1,MARKET,OPEN);
end;
if holding>0
then begin 平多: SELL(HOLDING>0,1,MARKET,close);
end;

老师,我希望达到的效果是cw=1就当日开盘价做多,然后收盘价平仓。但是这串代码回测结果好像是同一个价格开仓平仓,麻烦看下有啥问题,谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-2 21:51 , Processed in 0.105407 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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