等级: 机构版
- 注册:
- 2021-5-20
- 曾用名:
|
您好!
我想实现在10分钟K线图表中实现如下功能:
1、当上一根60分钟K线满足60分钟开多条件后,在60分钟结束后的第一根10分钟K线结束后开多;
当60分钟触发止损或者平多条件,则平多,同样在满足条件的60分钟结束后的第一根10分钟K线平多。
2、在60分钟满足持有多单的条件下,如果10分钟满足开空条件,则开空单。
在10分钟满足平空条件下,则平空(平空不需要60分钟持有多单的条件限制
我回测过程中,在10分钟图表上滑动鼠标,左上角显示的多单和空单数量的变化,就是我想要实现的,时间节点也都正确,但是有一个问题,测试报告中,只有多单开仓和平仓记录,而没有空单的开平仓记录,我找不到原因,请帮忙指点一下,万分谢谢!
下面是鼠标在10分钟K线移动过程中,多单和空单实际变化情况,和我想要的一致,下图截取的是2022-1-17日10:40分(开多)-2022-1-24日10:40分平多,这一段多单持有期间,多单空单数量变化情况。
图片上面有标注执行的时间节点,可能看不清楚,我列个表格如下:
但是,回测报告明细中,并没有空单开平仓记录:
万分感谢!
我的代码如下:
//////////////////////////////////////////////////////////////////////////////////////////
variable:B[1]:=(1);//1手多单
variable:S[1]:=(1);//1手空单
variable:ZSDS=50;//止损点数
variable:lotsB=0;//持有多单数量
variable:lotsS=0;//持有空单数量
60_l:=CALLSTOCK('',vtlow,5,-1);//60分钟最低价
60_c:=CALLSTOCK('',vtclose,5,-1);//60分钟收盘价
MA5_60:=Stkindiex('','MY_MA.MYMA5',0,5,-1,0),COLORGREEN,LINETHICK2; //60分钟5均线
{MY_MA里面代码:
MYMA5:=MA(C,5);
}
DIF60:=Stkindiex('','macd.diff(26,12,9)',0,5,-1,0),nodraw;
DEA60:=Stkindiex('','macd.dea(26,12,9)',0,5,-1,0),nodraw;
MACD60:=2*(DIF60-DEA60);
deathcross60:=CROSS(DEA60,DIF60);//60分钟死叉
J60:=Stkindiex('','MYKDJ.J',0,5,-1,0),nodraw;//60分钟J值
{MYKDJ里面代码:
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
}
DRAWTEXT(CROSS(J60,0),60_l*0.998,'底'),COLORRED;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//开多单
CON_BUY1:=CROSS(J60,0);//60分钟J值从0以下上穿
CON_BUY2:=MACD60>REF(MACD60,1);//60分钟MACD柱体放大
CON_SELL1:=deathcross60;//60分钟DIF和DEA死叉
KDuo:=CON_BUY1 AND CON_BUY2; //开多条件
PDuo:=CON_SELL1;//平多条件
//如果上面60分钟持有多单,仍然满足持有条件,那么10分钟上面只要出现10分钟收盘价格低于上一根60分钟5均线值,并且10分钟DIF和DEA死叉,则开对冲的1手空单。
DIF10:=Stkindiex('','macd.diff(26,12,9)',0,18,0,0),nodraw;
DEA10:=Stkindiex('','macd.dea(26,12,9)',0,18,0,0),nodraw;
J10:=Stkindiex('','MYKDJ.J',0,18,0,0),nodraw;
CON1:=DIF10<DEA10;//10分钟DIF和DEA死叉
CONS:=DIF10>DEA10;//10分钟DIF和DEA金叉
PKong:=CONS; //10分钟平空条件
KKong:=CON1;// 10分钟开空条件
////////////////////////////////////////////////////////////////////////////////////////////
IF lotsB>0 THEN begin
//如果持有多单过程中,如果此时满足10分钟开空条件,则在10分钟K线开空单
IF KKONG and lotsS=0 THEN begin
开空:=BuySHORT(1,S[1],NEXTOPEN);
lotsS:=S[1];
end
//止损
IF ENTERPRICE-60_c>=ZSDS THEN
BEGIN
多损:SELL(1,B[1],MARKET),ORDERQUEUE;
lotsB:=0;
END
{平多单}
IF PDuo THEN BEGIN
平多:=Sell(1,B[1],NEXTOPEN);
lotsB:=0;
end
END
{开多单}
IF KDuo and lotsB=0 THEN begin
开多:=Buy(1,B[1],NEXTOPEN);
lotsB:=B[1];
end
///////////////////////////////////////////////////////////////////////////////////////////////
//平空单,不需要满足60分钟多单持有条件,只需要满足10分钟平空条件即可
IF PKong AND lotsS>0 THEN BEGIN
平空:=SellSHORT(1,S[1],NEXTOPEN);
lotsS:=0;
END
空单:lotsS,linethick0;
多单:lotsB,linethick0;
资产:=asset-10000000,colorred,noaxis;
最大回撤:=MaxDrawDown,nodraw;
盈亏比:=资产/最大回撤,nodraw;
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?
x
|