设为首页收藏本站

 找回密码
 注册
查看: 2519|回复: 8
打印 上一主题 下一主题

下面的程序能正常交易,但是经常出现信号消失,请高手帮忙检查检查错误之处! [复制链接]

Rank: 1

精华
0
UID
230921
积分
29
帖子
18
主题
7
阅读权限
10
注册时间
2016-3-26
最后登录
2017-3-17
跳转到指定楼层
1#
发表于 2016-4-8 15:26:00 |只看该作者 |倒序浏览
下面的程序能模拟交易,但是经常出现"下单之后讯号消失,可能会导致您持仓不匹配,请检查你的算法"之类的提示. 我找不出来哪里出错,还请高手帮忙修改一下.不胜感激,特此谢过!

//程序的意思很简单:开仓如果赚钱,上移止损后就加仓, 直到止盈为止. 开仓后如果亏损,若单个商品亏损达到2500或者所有商品总亏损达到9500就全部砍掉.是日内交易模型.由于尾盘清仓模块我是照抄的F1文档里的,所以本处先略去.请高手帮助检查错误之处!谢谢!

Params       
        Numeric TP(2);                        //止盈2%,若本值设为涨跌停板值,则表示当天不设止盈
        Numeric BSx(10);                                //BS微调节器

        Bool AllowedToAddLots(true);                //允许加仓
        Bool AllowedToBuy(True);
        Bool AllowedToSell(True);
       
Vars
        NumericSeries A;
       
        Numeric UnitEquity(10000);                         //本策略本品种单位资金
        Numeric UnitMargin;
       
        Numeric Minpoint;
        Numeric Lots;
        Numeric myEntryPrice;
        Numeric myExitPrice;
        Numeric myExitPrice1;
        Numeric myExitPrice2;
       
        Bool EntryBuy;
        Bool EntrySell;
        Bool StopBuy;
        Bool StopSell;
       
        Numeric TurtleMA(60);
        Numeric RiskRatio(1);                        //止损范围
        Numeric ATR;
        Numeric N;
        Numeric n1(1);
       
        NumericSeries HPAE;                  //HigherAfterEntry;开仓后出现的最高价
        NumericSeries LPAE;                        //LowerAfterEntry; 开仓后出现的最低价
        Numeric profit;
               
Begin
        //初始化模块=============================================================

        If(!CallAuctionFilter()||date<>date[1] && high==Low||CurrentTime<=0.0900 && High==Low) Return;                // 集合竞价和小节休息过滤
       
        //--------------------------------------------------------------------------------------------------
        Minpoint=MinMove*PriceScale;
       
        UnitMargin=ContractUnit*MarginRatio*Close;
        lots=UnitEquity/UnitMargin;
        Lots=Max(IntPart(lots/k),1);                //取整数,最小值为1

               
        //资金管理模块------------------------------------------------------------------------------
        If(BarStatus==2)
                {       
                If(ContractProfit/UnitMargin<=-2500)                //每手亏损达到保证金的loss%或者亏损达到2500后强行平仓
                //防止大亏
                        {
                        profit=PositionProfit;
                       
                        Sell(0,Close);
                        BuyToCover(0,Close);
                       
                        Commentary("资金管理 IS止损= "+Text(profit));
                        }
                Else If(MarketPosition==1 && (Close-AvgEntryPrice)*CurrentContracts<=-2500)
                        {
                        Sell(0,Close);
                        Commentary("资金管理 IS止损");
                        }
                Else If(MarketPosition==-1 && (AvgEntryPrice-Close)*CurrentContracts<=-2500)
                        {
                        BuyToCover(0,Close);
                        Commentary("资金管理 IS止损");
                        }
                Else If(A_CurrentEquity-A_PreviousEquity<=-9500)          //帐户总浮亏超过1万则全部砍仓
                        {
                        Sell(0,Close);
                        BuyToCover(0,Close);
                       
                        Commentary("当日总浮亏超过1万,资金管理全部砍仓");
                        }
                       
       
        //正式策略模块,A引擎===============================================================================
        A=OpenD(0)+(CloseD(1)-CloseD(2));
        PlotNumeric("A",A);
       
        //创新高且收阳线则作多,以免高开大阴线套牢
        EntryBuy =C[1]>A[1] && H>H[1] && Close>Open;               
        EntrySell=C[1]<A[1] && L<L[1] && Close<Open;

       
        //防止假突破,当盈利全部回吐,且被套同等程度时,不必等到趋势反转,直接 IS 砍掉
        //防止假突破,分跳空和不跳空两种情况
        StopBuy = (Close<2*H[1]-High) && Open<= H[1]||(Close<2*Open-High) && Open>H[1];
        StopSell= (Close>2*L[1]-Low ) && Open>=L[1] ||(Close>2*Open-Low ) && Open<L[1];

        //A引擎开仓和反手模块=========================================================
        if(EntryBuy)                 //先平空,再做多,不加多
                {
                If(MarketPosition==-1)       
                        {
                        BuyToCover(0,Max(Open,H[1]));
                        Commentary("空单平仓");
                       
                        If(AllowedToBuy)                         //本节分开写的好处是为了防止在停板上禁止做多或做空功能后,原有仓单不会平仓
                                {
                                Buy(lots,Max(Open,H[1]));         
                                Commentary("反手做多");
                                }
                        }
                Else If(MarketPosition==0 && AllowedToBuy)       
                        {
                        BuyToCover(0,Max(Open,H[1]));                //确保信号消失时的空仓被平仓
                        //此处需要判断二次进场时不能追高
                       
                        If(myExitPrice1==0)
                                Buy(lots,Max(Open,H[1]));                        //首次进场直接开仓做多
                        Else
                                If(Open<myExitPrice1) Buy(lots,Max(Open,H[1]));        //在第一次顺利BS/TP之后,二次进场不愿意追高
                               
                        Commentary("A引擎开仓做多");       
                        }
                       
                Else If(MarketPosition==1 && AllowedToBuy)
                        {
                        lots=lots/(2^CurrentEntries);                //金字塔式加仓
                        lots=Max(IntPart(lots),1);
                       
                        //If(AllowedToAddLots) Buy(lots,Max(Open,H[1])));                       
                        //Commentary("A引擎加多");
                        }
                }
               
        if(EntrySell)                //先平多,再做空,不加空
                {
                If(MarketPosition==1)
                {
                        Sell(0,Min(Open,L[1]));
                        Commentary("多单平仓");
                       
                        If(AllowedToSell)
                                {
                                SellShort(lots,Min(Open,L[1]));       
                                Commentary("反手做空");
                                }
                        }
                Else If(MarketPosition==0 && AllowedToSell)
                        {
                        Sell(0,Min(Open,L[1]));                //确保信号消失时的多单被平仓
                        //此处若首次顺利BS/TP,则二次进场不愿意低空
                       
                        If(myExitPrice2==0)
                                SellShort(lots,Min(Open,L[1]));                //首次做空
                        Else
                                if(Open>myExitPrice2) SellShort(lots,Min(Open,L[1]));                //二次逢高做空
                               
                        Commentary("开仓做空");
                        }
                Else If(MarketPosition==-1 && AllowedToSell)       
                        {
                        lots=lots/(2^CurrentEntries);                //金字塔式加仓
                        lots=Max(IntPart(lots),1);
                       
                        //If(AllowedToAddLots) SellShort(lots,Min(Open,L[1])));       
                        //Commentary("A引擎加空");
                        }
                }
               
        //IS止损模块--------------------------------------------------------
        If(StopBuy)
                {
                If(MarketPosition==1) Commentary(Text(Time)+"假突破!多单已经IS");
               
                If(Open<= H[1]) Sell(0,Min(2*H[1]-High,Close));
                Else Sell(0,Min(2*Open-High,Close));
                }
        Else If(StopSell)
                {
                If(MarketPosition==-1) Commentary(Text(Time)+"假突破!空单已经IS");
               
                If(Open>=L[1]) BuyToCover(0,Max(2*L[1]-Low,Close));
                Else BuyToCover(0,Max(2*Open-Low,Close));
                }
       

Rank: 1

精华
0
UID
230921
积分
29
帖子
18
主题
7
阅读权限
10
注册时间
2016-3-26
最后登录
2017-3-17
2#
发表于 2016-4-8 15:26:27 |只看该作者

        //记录浮动盈亏极值--------------------------------------------------
        If(BarsSinceLastEntry==0)
                {   
                HPAE=AvgEntryPrice;
                LPAE=AvgEntryPrice;
                Commentary("HPAE="+Text(HPAE) +", LPAE="+Text(LPAE));
                }
        Else If(BarsSinceLastEntry>0)
                {
                HPAE=Max(Max(HPAE[1],High[1]),High);
                LPAE=Min(Min(LPAE[1],Low[1]),Low);
                Commentary("HPAE="+Text(HPAE)+", LPAE="+Text(LPAE));
                }
        Else
                {
                HPAE=0;
                LPAE=0;
                }
               
        //在BS功能启动后,为扩大利润,启用BS加仓功能
       
        If(MarketPosition==1)                        
                {               
                If(BarsSinceLastEntry==0)                  //开仓K线上BS要用CLOSE,不能用HPAE
                        {
                        If(High>=AvgEntryPrice+minpoint*BSx*2)
                                {
                                myEntryPrice=AvgEntryPrice+minpoint*BSx*2;
                                myExitPrice1=AvgEntryPrice+minpoint*bsx;                               
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/2),1);
                               
                                If(AllowedToAddLots) Buy(lots,myEntryPrice);
                               
                                Commentary("BS引擎追多1次,总持仓= "+Text(CurrentContracts));
                                }
                               
                        Else If(High>=AvgEntryPrice+minpoint*BSx*3)
                                {
                                myEntryPrice=AvgEntryPrice+minpoint*BSx*3;
                                myExitPrice1=AvgEntryPrice+minpoint*bsx*1.5;                        //BS
                               
                                //第二个加仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/4),1);
                               
                                If(AllowedToAddLots) Buy(lots,myEntryPrice);
                       
                                Commentary("BS引擎追多2次,总持仓= "+Text(CurrentContracts));
                                }
                               
                        }
                Else
                        {
                        If(HPAE>=AvgEntryPrice+minpoint*BSx*2)                         //次bar上要用HPAE,不能再用Close
                                {
                                myEntryPrice=AvgEntryPrice+minpoint*BSx*2;
                                myExitPrice1=AvgEntryPrice+minpoint*bsx;       
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/2),1);
                               
                                If(AllowedToAddLots) Buy(lots,myEntryPrice);
               
                                Commentary("BS引擎追多1次,总持仓= "+Text(CurrentContracts));
                                }
                               
                        Else If(HPAE>=AvgEntryPrice+minpoint*BSx*3)
                                {
                                myEntryPrice=AvgEntryPrice+minpoint*BSx*3;
                                myExitPrice1=AvgEntryPrice+minpoint*bsx*1.5;                        //BS
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/4),1);
                               
                                If(AllowedToAddLots) Buy(lots,myEntryPrice);
                       
                                Commentary("BS引擎追多2次,总持仓= "+Text(CurrentContracts));
                                }
                               
                        }
               
                        Commentary("BS= "+Text(myExitPrice1));
                       
                        If(myExitPrice1!=0)                
                                {
                                If(BarType==0)                        //TP,日线级别允许开仓BAR平仓
                                        if(Close<=myExitPrice1 || (Close>=AvgEntryPrice*(1+tp/100)))
                                                {
                                                Sell(0,close);                                                                               
                                                Commentary("日线多单 BS止盈成功");
                                                }
                               
                                If(BarType==1 && BarsSinceLastEntry>=1)                //TP,日内交易禁止开仓BAR平仓
                                        if(Close<=myExitPrice1 || Close>=AvgEntryPrice*(1+tp/100))                                                       
                                                {
                                                Sell(0,close);               
                                                Commentary("日内多单 BS止盈成功");
                                                }
                                }
                        Else Commentary("BS未启动");
                        }
               
        else if(MarketPosition==-1)        
                {
                If(BarsSinceLastEntry==0)                        //BS,开仓K线上要用CLOSE,不能用LPAE
                        {
                        If(Low<=AvgEntryPrice-minpoint*BSx*2)
                                {
                                myEntryPrice=AvgEntryPrice-minpoint*BSx*2;
                                myExitPrice2=AvgEntryPrice-minpoint*bsx;                       
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/2),1);
                               
                                If(AllowedToAddLots) SellShort(lots,myEntryPrice);
                               
                                Commentary("BS引擎追空1次,总持仓= "+Text(CurrentContracts));               
                                }
                               
                        Else If(Low<=AvgEntryPrice-minpoint*BSx*3)
                                {
                                myEntryPrice=AvgEntryPrice-minpoint*BSx*3;
                                myExitPrice2=AvgEntryPrice-minpoint*bsx*1.5;               
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/4),1);
                               
                                If(AllowedToAddLots) SellShort(lots,myEntryPrice);
               
                                Commentary("BS引擎追空2次,总持仓= "+Text(CurrentContracts));
                                }
                       
                        }
                Else If(BarsSinceLastEntry>0)                //BS,次bar上要用LPAE,不能再用Close
                        {
                        If(LPAE<=AvgEntryPrice-minpoint*BSx*2)
                                {
                                myEntryPrice=AvgEntryPrice-minpoint*BSx*2;
                                myExitPrice2=AvgEntryPrice-minpoint*bsx;
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/2),1);
                               
                                If(AllowedToAddLots) SellShort(lots,myEntryPrice);
                       
                                Commentary("BS引擎追空1次,总持仓= "+Text(CurrentContracts));       
                                }
                               
                        Else If(LPAE<=AvgEntryPrice-minpoint*BSx*3)
                                {
                                myEntryPrice=AvgEntryPrice-minpoint*BSx*3;
                                myExitPrice2=AvgEntryPrice-minpoint*bsx*1.5;                                               
                               
                                //第二个追仓引擎BS启动,为了提高成功率,仅限于前2次追单
                                lots=Max(IntPart(lots/4),1);
                               
                                If(AllowedToAddLots) SellShort(lots,myEntryPrice);
               
                                Commentary("BS引擎追空2次,总持仓= "+Text(CurrentContracts));
                                }
                               
                        }
                       
                        Commentary("BS= "+Text(myExitPrice2));

                        If(myExitPrice2!=0)                        //本节BS不够精确
                                {
                                If(BarType==0)                        //TP,日线级别允许开仓BAR平仓
                                        if(Close>=myExitPrice2 || (Close<=AvgEntryPrice*(1-tp/100)))
                                                {
                                                BuyToCover(0,Close);
                                                Commentary("日线空单 BS止盈成功");
                                                }
                               
                                If(BarType==1 && BarsSinceLastEntry>=1)                //TP,日内交易禁止开仓BAR平仓
                                        if(Close>=myExitPrice2||Close<=AvgEntryPrice*(1-tp/100))                       
                                                {
                                                BuyToCover(0,Close);
                                                Commentary("日内空单 BS止盈成功");
                                                }
                                }
                               
                        Else Commentary("BS未启动");
                        }
       
End

使用道具 举报

Rank: 1

精华
0
UID
230921
积分
29
帖子
18
主题
7
阅读权限
10
注册时间
2016-3-26
最后登录
2017-3-17
3#
发表于 2016-4-8 15:29:49 |只看该作者
源程序有点长,辛苦大家了. 为了方便起见,大家可以只需要在要修改的地方涂鸦即可.

使用道具 举报

Rank: 1

精华
0
UID
230921
积分
29
帖子
18
主题
7
阅读权限
10
注册时间
2016-3-26
最后登录
2017-3-17
4#
发表于 2016-4-12 11:11:12 |只看该作者
刚才在I9888上发出了做多信号,马上又消失!
现在还有2手作多的小箭头在图表上闪烁

经常出现这种情况,比如:
图表上出现买入箭头,它就买了1手铁矿石,但是刚刚买入之后,价格只要稍稍下跌一点,图表上的买入箭头马上不见, 这就导致刚刚买入的1手单它不管了,既不平仓也不止损,如果后面再涨,它再重新买入1手,如果后面出现了做空信号,它也重新做空1手,这一手多单它完全不管

我不知道是什么原因
还请高手解答
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
5#
发表于 2016-4-12 13:27:57 |只看该作者
greatricher2016 发表于 2016-4-12 11:11
刚才在I9888上发出了做多信号,马上又消失!
现在还有2手作多的小箭头在图表上闪烁

这么长的代码,确实没法帮您逐一排查。
大致看了一下您的公式里就有6、7个buy的语句,建议先在每一个指令条件上输出注释语句,先判断是哪个条件下发的信号会忽闪消失,再着重排查该条件上的变量。。

使用道具 举报

Rank: 2

精华
0
UID
173393
积分
107
帖子
89
主题
10
阅读权限
30
注册时间
2013-10-9
最后登录
2023-4-4
6#
发表于 2016-4-12 17:05:48 |只看该作者
你开平仓,用了close价。先把这个弄好吧。

使用道具 举报

Rank: 2

精华
0
UID
173393
积分
107
帖子
89
主题
10
阅读权限
30
注册时间
2013-10-9
最后登录
2023-4-4
7#
发表于 2016-4-12 17:07:08 |只看该作者
TB基本的东西先弄好,写那么长代码,累不累?

使用道具 举报

Rank: 2

精华
0
UID
213293
积分
97
帖子
85
主题
5
阅读权限
30
注册时间
2015-7-9
最后登录
2017-3-13
8#
发表于 2016-4-13 09:17:06 |只看该作者
greatricher2016 发表于 2016-4-8 15:26
//记录浮动盈亏极值--------------------------------------------------
        If(BarsSinceLastEntry==0)
         ...

If(ContractProfit/UnitMargin<=-2500)  这是个未来函数

ContractProfit会随着某根Bar的tick而时时变化。
举例而言, Profit到达1000元时止盈。 那么当前Bar冲高时会出信号,但是如果Bar结束前,行情又回落,该信号则消失。

这样的函数不能用于回测。更不能用于实盘。

使用道具 举报

Rank: 1

精华
0
UID
230921
积分
29
帖子
18
主题
7
阅读权限
10
注册时间
2016-3-26
最后登录
2017-3-17
9#
发表于 2016-4-20 15:56:22 |只看该作者
谢谢各位!我的信号消失问题现在基本上解决了

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-8 01:16

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部