金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 532|回复: 12

追撤单问题

[复制链接]

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
发表于 2025-4-14 09:58 | 显示全部楼层 |阅读模式
后台追撤单的代码范例
https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=13562
[PEL] 复制代码
{撤单,挂单}
if canceltime1 then begin
	tcancelex(tisremainex(0,'','')>0,0,'','');
	tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),lmt,tavgenterpriceex2('','',0)+mindiff);
	tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),lmt,tavgenterpriceex2('','',1)-mindiff);
end
{仍有持仓,撤单,市价平仓}
if canceltime2 then begin
	tcancelex(tisremainex(0,'','')>0,0,'','');
	tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),mkt);
	tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),mkt);
end

问题1:以上代码,是否需要注意该文章提到的点?


Snipaste_2025-04-12_11-17-13.png
问题2:canceltime1部分,似乎会反复的撤单挂单?用全局变量控制?
问题3:策略会持仓多张单,所以,在canceltime1部分,使用tavg(持仓均价)挂单平仓是否合理?



补充内容 (2025-4-13 09:22):
canceltime1部分,单子挂出去,若不能立即成交,或单量太大单子太多时,确实会反复挂撤单
回复

使用道具 举报

2

主题

4982

帖子

4982

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2025-4-14 10:27 | 显示全部楼层
1. 你这里影响不大。你反正是在指定时间内操作,一轮不行,下一轮运行时候单子状态已经更新好了 再平仓就是。

2.最好是用全局变量做记录 来限制只操作一次比较好。

GLOBALVARIABLE:iscancel1:=0;
{撤单,挂单}
if canceltime1 then begin
        if iscancel1=0 and tisremainex(0,'','')>0 then
        begin
    tcancelex(1,0,'','');
    iscancel1:=1;
    end
    tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),lmt,tavgenterpriceex2('','',0)+mindiff);
    tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),lmt,tavgenterpriceex2('','',1)-mindiff);
end


3.多张单子都是汇总的。用均价其实也没什么问题吧。不用均价 逻辑上无法处理的。
回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 11:19 | 显示全部楼层
回测中出问题了。其他品种问题相同,我这里只截了2个。

问题:
1.为什么到31s时,多空限价单只平了1手?
2.为什么到46s时,反复出现多空市价平仓?

这是我的代码,请老师结合本贴的时间轴图,分析问题。
[PEL] 复制代码
input:nmin1(0.5),nmin2(0.25);
input:ss(1);
globalvariable:cancelflag:=0;
if not(islastbar) then exit;

closemid1:=t0totime(timetot0(closetime1)-nmin2*60);
closemid4:=t0totime(timetot0(closetime4)-nmin2*60);
canceltime1:=(time_>close1 and time_<closemid1) or (time_>close4 and time_<closemid4);
canceltime2:=(time_>closemid1 and time_<closetime1) or (time_>closemid4 and time_<closetime4);
{撤单,挂单}
if canceltime1 then begin
	if cancelflag=0 and tisremainex(0,'','')>0 then begin
		tcancelex(1,0,'','');
		cancelflag:=1;
     	end
	tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),lmt,tavgenterpriceex2('','',0)+mindiff);
	tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),lmt,tavgenterpriceex2('','',1)-mindiff);
end
{仍有持仓,撤单,市价平仓}
if canceltime2 then begin
	tcancelex(tisremainex(0,'','')>0,0,'','');
	tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),mkt);
	tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),mkt);
end

截图202504141119145651.png
截图202504141119266482.png
回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 11:20 | 显示全部楼层
资深技术05 发表于 2025-4-14 10:27
1. 你这里影响不大。你反正是在指定时间内操作,一轮不行,下一轮运行时候单子状态已经更新好了 再平仓就是 ...

新问题,请回复。
回复

使用道具 举报

2

主题

4982

帖子

4982

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2025-4-14 13:35 | 显示全部楼层
本帖最后由 资深技术05 于 2025-4-14 13:37 编辑

1.从这部分代码的确看不出来问题,仓位都是全平 怎么会出现剩余仓位呢。你是不是实际回测用的还是之前的固定手数的那部分代码。
2.cancelflag 这个变量调整下逻辑,否则不间断运行或者回测时候可能会影响下一个交易日的逻辑。
if canceltime1 then begin
    if  date>cancelflag and tisremainex(0,'','')>0 then begin
        tcancelex(1,0,'','');
       cancelflag:=date;
        end



回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 15:07 | 显示全部楼层
资深技术05 发表于 2025-4-14 13:35
1.从这部分代码的确看不出来问题,仓位都是全平 怎么会出现剩余仓位呢。你是不是实际回测用的还是之前的固 ...

老师,我刚刚用录屏软件给录下来了。
代码是今天早上您修改的【if iscancel1=0 ......】

至于今天下午写的【date>cancelflag】,还没用,连续测两个太乱了,今晚再试试。
回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 15:30 | 显示全部楼层
我逐帧看了下。

1.最后的3张空单怎么平的?没见到挂单???
2.怎么多单还漏了1张,之后15s时才市价平仓?

感觉代码还是有点粗糙了,似乎是间隔时间太短导致的?

补充内容 (2025-4-14 15:34):
我重新再看了下,最后那张多单,是限价平的???

1 .mp4

3.62 MB, 下载次数: 115

PleaceOrder.txt

294.07 KB, 下载次数: 131

回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 15:48 | 显示全部楼层
资深技术05 发表于 2025-4-14 13:35
1.从这部分代码的确看不出来问题,仓位都是全平 怎么会出现剩余仓位呢。你是不是实际回测用的还是之前的固 ...

1.我确实没改成固定手数ss作为平仓,因为根本平不完啊。(第2个参数我改成0都不会改成ss)

2.用date可行。
那么是不是也可以在【if canceltime2 then begin】中设置重置globalvariable,cancelflag:=0;
回复

使用道具 举报

38

主题

157

帖子

157

积分

Rank: 4

等级: 专业版

注册:
2025-4-7
曾用名:
 楼主| 发表于 2025-4-14 16:28 | 显示全部楼层
破案了。。。

我又测了好几次,果然是globalvariable没重置的问题。
不管是date重置,还是第2个部分添加cancelflag:=0;重置,都行。
只要重置了,就不会出现市价反复平仓的问题了。
回复

使用道具 举报

2

主题

4982

帖子

4982

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2025-4-14 16:55 | 显示全部楼层
1.空单正常平的。日志里有记录的。只是动作比较快。
2.多单这个情况我看了日志,应该是遇到临界情况了,撤单瞬间 仓位状态没更新过来,导致最后留了一手到最后平的。


稍微调整下代码再试下:


[PEL] 复制代码
input:nmin1(0.5),nmin2(0.25);
input:ss(1);
globalvariable:cancelflag:=0;
if not(islastbar) then exit;
 
closemid1:=t0totime(timetot0(closetime1)-nmin2*60);
closemid4:=t0totime(timetot0(closetime4)-nmin2*60);
canceltime1:=(time_>close1 and time_<closemid1) or (time_>close4 and time_<closemid4);
canceltime2:=(time_>closemid1 and time_<closetime1) or (time_>closemid4 and time_<closetime4);
{撤单,挂单}
if canceltime1 then 
begin	
//没有任何未成交时	
if tglobalsubmitex(0,'','' ,0)=0 then 
begin 
tsell(tbuyholdingex('','',1)>0 ,tbuyholdingex('','',1),lmt,tavgenterpriceex2('','',0)+mindiff);
tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),lmt,tavgenterpriceex2('','',1)-mindiff);
end

if cancelflag>date and tisremainex(0,'','')>0 then begin
tcancelex(1,0,'','');
cancelflag:=date;
end

end
{仍有持仓,撤单,市价平仓}
if canceltime2 then begin

//没有任何未成交时	
if tglobalsubmitex(0,'','' ,0)=0 then 
begin
tsell(tbuyholdingex('','',1)>0,tbuyholdingex('','',1),mkt);
tsellshort(tsellholdingex('','',1)>0,tsellholdingex('','',1),mkt);
end 	

tcancelex(tisremainex(0,'','')>0,0,'','');

end


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 21:37 , Processed in 0.140357 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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