金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 3030|回复: 9

请问如何实现以下加减仓逻辑

[复制链接]

9

主题

18

帖子

18

积分

Rank: 1

等级: 新手上路

注册:
2023-6-13
曾用名:
发表于 2023-9-4 09:59 | 显示全部楼层 |阅读模式
开仓:周期均线上穿10周期均线,就开仓做多,开仓1个单位
平仓:如果价格上涨超过开仓价格1%就平仓,下跌超过1%也平仓

只要5周期均线上穿10周期均线,就开仓做多,开仓1个单位,记录此次开仓的开仓价格, 如果价格上涨超过开仓价格1%就平仓,下跌超过1%也平仓,上面算一次开平仓算完成一次交易。无论上一次交易平仓与否,只要再次出现开仓信号, 就继续开仓,并记录开仓价格,依照此次开仓价格进行平仓操作。每次开仓平仓都是独立的
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-9-4 10:20 | 显示全部楼层
“每次开仓平仓都是独立的” 这个是无法实现的。无法根据每次开仓的价格来单独做止盈止损。

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

使用道具 举报

30

主题

100

帖子

110

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2023-9-4 10:49 | 显示全部楼层
老师,请问我这样做行不行呢?
VARIABLE:ENTERPRICES[10000]:=0;//每次开仓价格  
VARIABLE:I:=0; //独立开仓次数
VARIABLE:J:=1;//未平仓位起始序号
VARIABLE:Q:=1;

INPUT:ZS(1);
MA1:MA(C,5);
MA2:MA(C,10);
KD:CROSS(MA1,MA2);
IF KD THEN BEGIN
        开多:BUY(KD,1,THISCLOSE);
        I:=I+1; //记录独立的开仓次数
        ENTERPRICES[I]:=ENTERPRICE;  //记录每次开仓价格  
END
RECORD:=0; //是否已经记录未平仓位起始序号

IF HOLDING>0 && ENTERBARS>0 THEN BEGIN
        FOR K=J TO I DO BEGIN    //从未平仓位起始序号开始循环
                PD1:C < ENTERPRICES[K] *(1-ZS/100);  //低于第K次开仓价格1%平仓
                PD2:C > ENTERPRICES[K] *(1+ZS/100);         //高于第K次开仓价格1%平仓
                IF NOT(PD1 || PD2) && RECORD=0 THEN  //如果当前价格不满足K次开仓的平仓价格,则记录未平仓位序号
                BEGIN
                        Q:=J;  //记录未平仓位序号
                        RECORD:=1;
                        CONTINUE;
                END               
                平多1:SELL(PD1,1,THISCLOSE);                       //平多信号
                平多2:SELL(PD2,1,THISCLOSE);                       //平多信号                               
        END
        J:=Q;
END
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-9-4 11:09 | 显示全部楼层
循环里 相同的一行下单语句是不会触发多次信号的,虽然在图表上如果同时满足多次 会显示多个信号,实际只会执行其中一个。

所以你这种 如果是行情高开,低开这种,实际交易时候会失效的,只会执行一次平仓。另外还有一点就是 如果你开仓的价格是不规则分布的,你这里每次记录未平仓的序号 是有问题的,可能会把前面没满足的平仓的部分舍弃掉了。恐怕还是得全部循环一次比较合适,平仓后可以把数组值设为0,然后循环时候遇到0 直接continue 到下一次即可。  这个思路在后台上是可行的,后台可以在一个语句上多次下单,使用allowrepeat解除下单限制就行了。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

30

主题

100

帖子

110

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2023-9-4 11:29 | 显示全部楼层
技术009 发表于 2023-9-4 11:09
循环里 相同的一行下单语句是不会触发多次信号的,虽然在图表上如果同时满足多次 会显示多个信号,实际只会 ...

“你这里每次记录未平仓的序号 是有问题的,可能会把前面没满足的平仓的部分舍弃掉了”

我从上一次未平仓的序号开始进行循环,只要一遇到未平仓的仓位,就把这个未平仓的序号记录下来,但是只记录一次,后面再遇到未平仓的都不记录序号了,这样前面没满足的平仓的部分都不会被舍弃掉。上面代码里面record这个变量就是表明已经遇到未平仓的仓位,记录序号Q,以后再遇到未平仓的就不记录序号了,下一根k线检查平仓的循环就从Q这个位置开始。

但是上面代码遇到的问题是一开仓就平仓,尽管PD1,PD2是0,如下图


C:\Users\luli3\Desktop\trade\rec\QQ截图20230904112808.png
      
回复

使用道具 举报

30

主题

100

帖子

110

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2023-9-4 11:30 | 显示全部楼层
QQ截图20230904112808.png

本帖子中包含更多资源

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

x
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

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

除非最后一次循环 时候满足条件,否则这里会以最后一次的为准。

在图表上你最好不要用循环处理信号,因为这个问题绕不过去的:“
循环里 相同的一行下单语句是不会触发多次信号的,虽然在图表上如果同时满足多次 会显示多个信号,实际只会执行其中一个。” 比如你价格高开了,图上可能会显示2个平仓。但是实际因为是相同语句触发的,只会执行其中一个。

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

使用道具 举报

30

主题

100

帖子

110

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2023-9-4 14:41 | 显示全部楼层
技术009 发表于 2023-9-4 14:10
除非最后一次循环 时候满足条件,否则这里会以最后一次的为准。

在图表上你最好不要用循环处理信号,因 ...

后台交易应该怎么修改 能否一下上面的代码 做个参考 谢谢!
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

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

想了下 应该也有处理办法,就是你在循环中累计需要平仓的手数 。循环结束时候按照这个手数平仓,这样就算 你历史开仓有多个同时满足止盈或者止损 实际交易时候也会 成功执行,不会被系统过滤掉信号。
测试代码:
[PEL] 复制代码
variable:enterprices[10000]:=0;//每次开仓价格  
variable:i:=0; //独立开仓次数
variable:j:=1;//未平仓位起始序号
variable:q:=1;

input:zs(1);
kd:mod(todaybar,3)=0;

if kd then begin
        开多:buy(kd,1,thisclose);
        i:=i+1; //记录独立的开仓次数
        enterprices[i]:=enterprice;  //记录每次开仓价格  
end
record:=0; //是否已经记录未平仓位起始序号

if holding>0 && enterbars>0 then begin
zs_n:0;
zy_n:0;
for k=j to i do begin    //从未平仓位起始序号开始循环
                if enterprices[k]=0 then 
                begin
                continue;         
                end 
                pd1:c <enterprices[k]-15*mindiff;  //低于第k次开仓价格1%平仓
                pd2:c >enterprices[k]+20*mindiff;  //高于第k次开仓价格1%平仓
                if not(pd1 || pd2) && record=0  then  //如果当前价格不满足k次开仓的平仓价格,则记录未平仓位序号
                begin
                        q:=j;  //记录未平仓位序号
                        record:=1;
                        continue;
                end 
                  
                if pd1 then
                begin 
                zs_n:=zs_n+1;
                enterprices[k]:=0;
                end   
                if pd2 then
                begin 
                zy_n:=zy_n+1;
                enterprices[k]:=0;
                end                           
        end
        止损:sell(zs_n>0,zs_n,thisclose);                       //平多信号
        止盈:sell(zy_n>0,zy_n,thisclose);                       //平多信号     
        record:=0;//重置下
        j:=q;
end



在螺纹上测试的效果,感觉没啥大问题。



上面这个思路得话,后台图表都有效,也不需要考虑循环内相同语句信号被过滤问题了,因为满足条件的次数折算成平仓手数了 只需要2个在循环外的语句去执行就行了。

本帖子中包含更多资源

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

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

使用道具 举报

30

主题

100

帖子

110

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2023-9-4 14:59 | 显示全部楼层
技术009 发表于 2023-9-4 14:47
想了下 应该也有处理办法,就是你在循环中累计需要平仓的手数 。循环结束时候按照这个手数平仓,这样就算  ...

太好了!感谢 感谢!我再研究一下 有不懂的再请教你们!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 04:16 , Processed in 0.118356 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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