开拓者期货期权程序化系统交易论坛

标题: 小白提问 [打印本页]

作者: ppzcgg    时间: 2018-10-24 10:42:35     标题: 小白提问

为什么单独写如下语句不能开空仓
If(close[1]>=MidLine)//MidLine是boll中轨
{
        SellShort(1,0);//平掉所有多仓,当前价开空
}

而加上下面的Buy语句,就可以开仓了,这是为什么?
If(close[1]>=MidLine)
{       
        SellShort(1,0);//平掉所有多仓,当前价开空
}               
               
If(close[1]<DownLine)
{
        Buy(1,0); //平掉所有空仓,当前价开多
}       
作者: 小米    时间: 2018-10-24 10:45:01

单写sellshort也能开仓。只不过信号只在图表左边会有1个或几个开空的信号,没有平仓,没有再次开仓等。
作者: ppzcgg    时间: 2018-10-24 10:49:02

小米 发表于 2018-10-24 10:45
单写sellshort也能开仓。只不过信号只在图表左边会有1个或几个开空的信号,没有平仓,没有再次开仓等。 ...

不加上buy,就不能开仓,图表左边也没有开空的信号,这是为什么呢?
作者: 小米    时间: 2018-10-24 14:43:58

ppzcgg 发表于 2018-10-24 10:49
不加上buy,就不能开仓,图表左边也没有开空的信号,这是为什么呢?

midline的值是于小于close[1]呢?
如果就你当前的代码,且条件满足,是会有信号的呀。
你可以使用commentary输出注释来看看条件 的满足情况。
作者: ppzcgg    时间: 2018-10-24 17:14:47

小米 发表于 2018-10-24 14:43
midline的值是于小于close[1]呢?
如果就你当前的代码,且条件满足,是会有信号的呀。
你可以使用comment ...

感谢版主回复,
If(close[1]>=MidLine)
{
        FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        SellShort(1,0);//平掉所有多仓,当前价开空
}
加了log信息,a.log中显示执行了FileAppend,但却不执行SellShort(,这是为什么呢?
作者: 小米    时间: 2018-10-25 08:22:06

ppzcgg 发表于 2018-10-24 17:14
感谢版主回复,
If(close[1]>=MidLine)
{

全局交易设置里的初始资金是多少?
另外在公式里加上这一句再看看输出值commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));
作者: ppzcgg    时间: 2018-10-25 08:33:44

小米 发表于 2018-10-25 08:22
全局交易设置里的初始资金是多少?
另外在公式里加上这一句再看看输出值commentary("max="+text(maxbarsb ...

一千万的模拟资金,加上commentary图表没变化。
作者: 小米    时间: 2018-10-25 08:46:41

ppzcgg 发表于 2018-10-25 08:33
一千万的模拟资金,加上commentary图表没变化。

commentary是注释语句,不会改变信号标识。是要看注释内容来判断问题。。
作者: ppzcgg    时间: 2018-10-25 08:49:35

我把所有语句都注释掉,公式中只剩下面的句子,把MidLine变为常数10800,居然也不能执行SellShort,这是为什么呢?
If(close[1]>=10800)//MidLine)
{
               
        FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));
        SellShort(1,0);//平掉所有多仓,当前价开空
}
作者: ppzcgg    时间: 2018-10-25 09:01:06

小米 发表于 2018-10-25 08:46
commentary是注释语句,不会改变信号标识。是要看注释内容来判断问题。。


非得像下面这样才能执行,这是为什么呢?
If(close[1]>=12200)//MidLine)
{       
        FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));
        SellShort(1,0);//平掉所有多仓,当前价开空
}               
       
If(close[1]<10700)//DownLine)
{
        Buy(1,0); //平掉所有空仓,当前价开多
}
作者: 小米    时间: 2018-10-25 09:04:14

ppzcgg 发表于 2018-10-25 09:01
非得像下面这样才能执行,这是为什么呢?
If(close[1]>=12200)//MidLine)
{       

将9楼与10楼的信号图表分别贴图我看一下。。
切记,是要将K线显示到最左边的位置后再截图的。
作者: ppzcgg    时间: 2018-10-25 09:10:40

本帖最后由 ppzcgg 于 2018-10-25 09:12 编辑
小米 发表于 2018-10-25 09:04
将9楼与10楼的信号图表分别贴图我看一下。。
切记,是要将K线显示到最左边的位置后再截图的。 ...


搞错了,9楼也执行了,刚才没看清

9楼图片:
[attach]37251[/attach]
10楼图片:
[attach]37252[/attach]
作者: 小米    时间: 2018-10-25 09:17:47

ppzcgg 发表于 2018-10-25 09:10
搞错了,9楼也执行了,刚才没看清

9楼图片:

OK,问题解决了就好。
作者: ppzcgg    时间: 2018-10-25 09:19:47

小米 发表于 2018-10-25 09:17
OK,问题解决了就好。

其实也没解决,换成变量MidLine就不行了,是不是重复开仓的问题?因为图表中有很多次会出现close[1]>=MidLine的情况
作者: 小米    时间: 2018-10-25 09:51:46

ppzcgg 发表于 2018-10-25 09:19
其实也没解决,换成变量MidLine就不行了,是不是重复开仓的问题?因为图表中有很多次会出现close[1]>=Mid ...

commentary输出midline的值是看看是多少?
作者: ppzcgg    时间: 2018-10-25 10:28:01

小米 发表于 2018-10-25 09:51
commentary输出midline的值是看看是多少?

图表上没commentary输出,倒是a.log上有很多输出
//close[1]:10828//MidLine:10797.7
//close[1]:10825//MidLine:10797.7
//close[1]:10814//MidLine:10797.7
//close[1]:10816//MidLine:10797.7
//close[1]:10820//MidLine:10797.7
//close[1]:10813//MidLine:10797.7
//close[1]:10820//MidLine:10797.7
//close[1]:10817//MidLine:10794.75
//close[1]:10796//MidLine:10794.75
作者: ppzcgg    时间: 2018-10-25 13:59:35

小米 发表于 2018-10-25 09:51
commentary输出midline的值是看看是多少?

是不是在菜单中设置不能连续建仓了?
作者: ppzcgg    时间: 2018-10-25 14:43:17

使用A_SendOrder可以开仓,只有一种解释,那就是SellShort函数内部不知道什么原因,不开仓!版主能回答吗?
作者: ppzcgg    时间: 2018-10-25 14:54:36

加上MarketPosition!=-1就能执行了,这是为什么呢?
If(close[1]>=MidLine && MarketPosition!=-1)
{       
        FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        //commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));               
        SellShort(1,0);//平掉所有多仓,当前价开空
        //A_SendOrder(Enum_Sell,Enum_Entry,1,close);
}
作者: 小米    时间: 2018-10-26 08:28:36

ppzcgg 发表于 2018-10-25 14:43
使用A_SendOrder可以开仓,只有一种解释,那就是SellShort函数内部不知道什么原因,不开仓!版主能回答吗? ...

版主回答不了。
要不直接将你的代码以及你所说的不出信号的图表一并贴出来看一下吧。。。
否则版本说一个可能你否定一个可能,看不到代码确实没法知道你的问题到底长啥样啊。。

作者: ppzcgg    时间: 2018-10-26 09:18:48

小米 发表于 2018-10-26 08:28
版主回答不了。
要不直接将你的代码以及你所说的不出信号的图表一并贴出来看一下吧。。。
否则版本说一个 ...

Begin

        mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);//mtBarCnt表示的是从当前小周期的Bar到对应的大周期的Bar需要回溯的BAR数
        mtClose = refClose;       
       
        //获得大周期的20日平均值       
        SumValue = MtSummation(mtClose,mtBarCnt,Length);//取大周期的收盘价之和
        MidLine = SumValue/Length;       
       
        //Band = StandardDev(Close,Length,2);
        //求20日标准差
        VarPSValue = MtVvv(mtClose, mtBarCnt, Length, 2);

        If (VarPSValue > 0)
        {
                Band = Sqrt(VarPSValue);
        }Else
        {
                Band = 0;
        }       
       
       
        UpLine = MidLine + Offset * Band;
        DownLine = MidLine - Offset * Band;
        PlotNumeric("UpLine",UpLine);
        PlotNumeric("DownLine",DownLine);
        PlotNumeric("MidLine",MidLine);       
       
       
        // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
        //FileAppend("f:\\a.log","//Low:"+Text(Low)+"//High:"+Text(High)+"//DownLine:"+Text(DownLine)+"//UpLine:"+Text(UpLine));       
       
        //FileAppend("f:\\a.log","33333333 //close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        //如果碰boll中轨,开空,平多
       
        If(close[1]>=MidLine)
        {
               
                FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
                //commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));               
                SellShort(1,0);//平掉所有多仓,当前价开空
                //A_SendOrder(Enum_Sell,Enum_Entry,1,close);
        }
       
        /*
        If(close[1]<DownLine)
        {
                Buy(1,0); //平掉所有空仓,当前价开多
        }*/
       
End

全部代码贴上了MidLine是60分钟级别的boll中轨线
作者: 小米    时间: 2018-10-26 09:47:17

ppzcgg 发表于 2018-10-26 09:18
Begin

        mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOp ...

参数与变量都没有给啊

作者: ppzcgg    时间: 2018-10-26 10:03:54

小米 发表于 2018-10-26 09:47
参数与变量都没有给啊

Params
        Numeric TimeFrame(60);                // 目标时间周期参数,参数说明参见MtBar
        Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数       
        Numeric Length(20);                       
        Numeric Offset(2);                            
Vars
        NumericSeries MA1;
        NumericSeries mtBarCnt;
        NumericSeries mtClose;
        Numeric refCurBar;
        Numeric refOpen;
        Numeric refHigh;
        Numeric refLow;
        Numeric refClose;
        Numeric refVol;
        Numeric refOpenInt;
       
        Numeric UpLine;                //上轨
        Numeric DownLine;                //下轨
        Numeric MidLine;        //中间线
        Numeric Band;
        Numeric SumValue(0);       
       
        Numeric VarPSValue;       
Begin

        mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);//mtBarCnt表示的是从当前小周期的Bar到对应的大周期的Bar需要回溯的BAR数
        mtClose = refClose;       
       
        //获得大周期的20日平均值       
        SumValue = MtSummation(mtClose,mtBarCnt,Length);//取大周期的收盘价之和
        MidLine = SumValue/Length;       
       
        //Band = StandardDev(Close,Length,2);
        //求20日标准差
        VarPSValue = MtVvv(mtClose, mtBarCnt, Length, 2);

        If (VarPSValue > 0)
        {
                Band = Sqrt(VarPSValue);
        }Else
        {
                Band = 0;
        }       
       
       
        UpLine = MidLine + Offset * Band;
        DownLine = MidLine - Offset * Band;
        PlotNumeric("UpLine",UpLine);
        PlotNumeric("DownLine",DownLine);
        PlotNumeric("MidLine",MidLine);       
       
       
        // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
        //FileAppend("f:\\a.log","//Low:"+Text(Low)+"//High:"+Text(High)+"//DownLine:"+Text(DownLine)+"//UpLine:"+Text(UpLine));       
       
        //FileAppend("f:\\a.log","33333333 //close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
        //如果碰boll中轨,开空,平多
       
        If(close[1]>=MidLine && MarketPosition!=-1)
        {
               
                FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
                //commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));               
                SellShort(1,0);//平掉所有多仓,当前价开空
                //A_SendOrder(Enum_Sell,Enum_Entry,1,close);
        }
       
        /*
        If(close[1]<DownLine)
        {
                Buy(1,0); //平掉所有空仓,当前价开多
        }*/
       
End
作者: ppzcgg    时间: 2018-10-29 08:16:36

谁帮忙回答一下
作者: 小米    时间: 2018-10-29 14:38:01

ppzcgg 发表于 2018-10-26 10:03
Params
        Numeric TimeFrame(60);                // 目标时间周期参数,参数说明参见MtBar
        Numeric BarsBack(1) ...

你这有自定义的函数,而函数代码也没有提供,工作人员没法重现您的问题啊。。
建议您还是通过注释信息进行代码的排查吧。。
作者: ppzcgg    时间: 2018-10-30 09:57:39

本帖最后由 ppzcgg 于 2018-10-30 09:58 编辑
小米 发表于 2018-10-29 14:38
你这有自定义的函数,而函数代码也没有提供,工作人员没法重现您的问题啊。。
建议您还是通过注释信息进 ...


Params
        Numeric Length(20);                       
        Numeric Offset(2);                            
Vars
        Numeric UpLine;                //上轨
        Numeric DownLine;                //下轨
        NumericSeries MidLine;        //中间线
        Numeric Band;
Begin
        MidLine = AverageFC(Close,Length);
        Band = StandardDev(Close,Length,2);
        UpLine = MidLine + Offset * Band;
        DownLine = MidLine - Offset * Band;
        PlotNumeric("UpLine",UpLine);
        PlotNumeric("DownLine",DownLine);
        PlotNumeric("MidLine",MidLine);
       
        If(close[1]>=UpLine)
        {
               
                //FileAppend("f:\\a.log","//close[1]:"+Text(close[1])+"//MidLine:"+Text(MidLine));
                //commentary("max="+text(maxbarsback)+"currentbar="+text(currentbar));               
                SellShort(1,0);//平掉所有多仓,当前价开空
                //A_SendOrder(Enum_Sell,Enum_Entry,1,close);
        }
       
        /*
        If(close[1]<DownLine)
        {
                Buy(1,0); //平掉所有空仓,当前价开多
        }*/       
       
End

直接在boll公式上加上SellShort,也是不能开仓,大致找到原因了,问题出在SellShort内部,SellShort肯定是被执行了,只不过没真正执行平仓和开空仓动作罢了,至于为什么不执行真正的平仓和开仓动作,只能去SellShort内部看了。
作者: 小米    时间: 2018-10-30 13:46:56

本帖最后由 小米 于 2018-10-30 13:49 编辑
ppzcgg 发表于 2018-10-30 09:57
Params
        Numeric Length(20);                       
        Numeric Offset(2);                            


注释内容以及所在图表位置能否截个图呢?




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2