金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
楼主: 100019690

取交叉值问题,麻烦老师帮忙修正一下

[复制链接]

16

主题

139

帖子

139

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2022-8-16 10:25 | 显示全部楼层

老师,跟您请教一下
我现在想取  最高利润大于3.5 到现在的 K 线 数
           profitPct := if( holding < 0,( enterprice-low )/enterprice*100,DRAWNULL ) ;

           maxprofit := if( holding < 0,hhv( profitPct,enterbars+1 ),DRAWNULL ) ;

                 starA :  barslast( maxprofit > 3.5 ) ; // 表述1

表述1 只能是等平仓之后才开始计算, 也就是holding = 0 才计算根数



              starB :  if( holding < 0,barslast( maxprofit > 3.5 ) ,drawnull ) ;    // 表述2

表述2 得出的结果就是  0

请老师帮忙给一个正确的思路,就是 持仓 的时候,如果 最大利润大于3.5 ,就以这个为起点标记,开始计算 K 线根数

谢谢了
回复

使用道具 举报

16

主题

139

帖子

139

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2022-8-16 10:46 | 显示全部楼层
技术009 发表于 2022-8-16 10:37
VARIABLE:mark:=0;

if OPENPROFITPER>=3.5 then mark:=mark+1;

不用全局变量可以么,因为我会有很多思路用到这个取值计算方式,这样一来全局变量多了就很难维护
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-16 10:51 | 显示全部楼层
纠正下,前面全局变量方式不对,先不用管。

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

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-16 10:57 | 显示全部楼层
用BARSSINCE2 配合开仓历时 处理试下呢?
BARSSINCE2(OPENPROFITPER>3.5,ENTERBARS+1)
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

16

主题

139

帖子

139

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2022-8-16 11:13 | 显示全部楼层
技术009 发表于 2022-8-16 10:57
用BARSSINCE2 配合开仓历时 处理试下呢?
BARSSINCE2(OPENPROFITPER>3.5,ENTERBARS+1)


markA: barssince( OPENPROFITPER > 3.5 ),  NODRAW,colorwhite ;


markB: if( holding < 0, barssince2( maxprofit > 3.5,ENTERBARS+1),drawnull ),  NODRAW,colorwhite ;


markC: if( holding < 0, barssince( maxprofit  > 3.5 ),drawnull ),  NODRAW,colorwhite ;



第三个可以,markC, 第一个  计算幅度,,是变化的,有潜在的风险,markB ,未满足条件时的值为 返回  -1, markC  是符合我需求的,记录最大利润值之后,除非突破最大值,要不值是恒定的,谢谢老师

barssince 开启了我新的认知
回复

使用道具 举报

16

主题

139

帖子

139

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2022-10-8 21:15 | 显示全部楼层
技术009 发表于 2022-8-16 10:57
用BARSSINCE2 配合开仓历时 处理试下呢?
BARSSINCE2(OPENPROFITPER>3.5,ENTERBARS+1)

老师,我现在做策略整合了,就是几组策略整合到一个 模型, 来规避连亏问题,所以想让老师帮忙实现两个思路,具体需求如下


      Diff := rounds( ema( close,12 )-ema( close,26 ),2 ) ;

      Dea  := rounds( ema( diff,9 ),2 ) ;

      Macd := 2*( diff-dea ), colorstick;
               
                  
//  出 场                  
                  
                  
             if holding > 0 and ref( cross( dea,diff ),1 ) then    sell( holding > 0,holding,limitr, open - 1 * mindiff ),ignorecheckprice ;                              
                  
             if holding < 0 and ref( cross( diff,dea ),1 ) then    sellshort( holding < 0,holding,limitr, open + 1 * mindiff ),ignorecheckprice ;
                           


//  入 场
                                    
             if holding = 0 and ref( cross( diff,dea ),1 ) then    buy( 1,Unit,limitr, open + 1 * mindiff ),ignorecheckprice ;
  
             if holding = 0 and ref( cross( dea,diff ),1 ) then    buyshort( 1,Unit,limitr, open - 1 * mindiff ),ignorecheckprice ;
   
                                             
{  现 在 需 求: 1、 上一笔亏损额度 > 2  ( 即亏损幅度达到 2 % ),则 隔开  10 根 K 线之后  才 会 再次 开 仓

                 2、 统计 前面20个周期 中,如果出现 连亏 2 次,  则 也 隔开 10 根 K 线之后  才 会 再 次 开 仓
                 
                 
                 以上条件,不管多空都需要满足  
                 
}
                 



另外,如果一个交易模型的代码 有1500行左右,会不会极度影响运行效率
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-10-9 08:59 | 显示全部楼层
本帖最后由 技术009 于 2022-10-9 09:01 编辑

[PEL] 复制代码
Unit:=1;

Diff := rounds( ema( close,12 )-ema( close,26 ),2 ) ;
Dea  := rounds( ema( diff,9 ),2 ) ;
Macd := 2*( diff-dea ), colorstick;
lk:=0;             
mark:=0;                
//  出 场                                               
if holding > 0 and ref( cross( dea,diff ),1 ) then   
begin 
if OPENPROFITPER<=-2 then mark:=-1;
sell( holding > 0,holding,limitr, open - 1 * mindiff ),ignorecheckprice ;                                              
if NUMPROFIT(1)<0 and NUMPROFIT(2)<0 then lk:=1;
end 

if holding < 0 and ref( cross( diff,dea ),1 ) then   
begin 
if OPENPROFITPER<=-2 then mark:=-1;
sellshort( holding < 0,holding,limitr, open + 1 * mindiff ),ignorecheckprice ;
if NUMPROFIT(1)<0 and NUMPROFIT(2)<0 then lk:=1;
end  


Len:BARSLAST(mark=-1); //上次亏损2%位置距离当前的周期跨度  。这个亏损是以平仓时候浮亏比例判断的,也就是满足信号时候的浮亏盈亏情况作为判断依据。      
Len2:BARSLAST(lk=1);//连亏2次的平仓 距离当前的周期跨度              
//  入 场                                  
if holding = 0 and ref( cross( diff,dea ),1 ) and (Len>9 or VALID(Len)=0) and (Len2>9 or VALID(Len2)=0) then    buy( 1,Unit,limitr, open + 1 * mindiff ),ignorecheckprice ; 
if holding = 0 and ref( cross( dea,diff ),1 ) and (Len>9 or VALID(Len)=0) and (Len2>9 or VALID(Len2)=0) then    buyshort( 1,Unit,limitr, open - 1 * mindiff ),ignorecheckprice ;
   
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-10-9 09:05 | 显示全部楼层
1500行,代码量不少了。代码量是一部分,其次还要看里面的计算是否是比较复杂的计算。你可以看看运行时候的资源占有情况,如果占用很高,还是建议做一些优化。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

16

主题

139

帖子

139

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2022-10-9 12:14 | 显示全部楼层
技术009 发表于 2022-10-9 08:59
[mw_shl_code=pel,true]
Unit:=1;

谢谢老师帮忙,这个进场控制可能不是我需求的,因为我出场模式有十几种类型,如果每个类型出场都加入一个 mark 判断的话,代码会很繁杂,能否借用函数里的这种模式来判断

            Lastloss := if( holding = 0,numprofitper( 1 ),DRAWNULL) ;

              Encond := if( Lastloss <= -2,exitbars > 20,Exitbars = -1 ) ;


但是我发现,用这个模式判断,有些是没有交易的,具体问题我找不出在哪,所以才请教一下老师看看有没有更好的方法,或者是帮指点一下,用以上这个模式问题出哪里,谢谢了
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-10-9 13:42 | 显示全部楼层
[PEL] 复制代码
Unit:=1;
 
Diff := rounds( ema( close,12 )-ema( close,26 ),2 ) ;
Dea  := rounds( ema( diff,9 ),2 ) ;
Macd := 2*( diff-dea ), colorstick;
               
//  出 场                                               
if holding > 0 and ref( cross( dea,diff ),1 ) then  
begin
sell( holding > 0,holding,limitr, open - 1 * mindiff ),ignorecheckprice ;                                              
end
 
if holding < 0 and ref( cross( diff,dea ),1 ) then  
begin
sellshort( holding < 0,holding,limitr, open + 1 * mindiff ),ignorecheckprice ;
end 

cd:((NUMPROFIT(1)<0 and NUMPROFIT(2)<0)  or NUMPROFITPER(1)<=-2)  and  EXITBARS<10; 
//  入 场                                  
if holding = 0 and ref( cross( diff,dea ),1 ) and not(cd) then    buy( 1,Unit,limitr, open + 1 * mindiff ),ignorecheckprice ; 
if holding = 0 and ref( cross( dea,diff ),1 ) and not(cd)  then    buyshort( 1,Unit,limitr, open - 1 * mindiff ),ignorecheckprice ;
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 00:38 , Processed in 0.163948 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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