设为首页收藏本站

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

新手随便写了一个策略,但提示“交易讯号消失,可能导致您的持仓不匹配 ”,求救 [复制链接]

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
跳转到指定楼层
1#
发表于 2016-4-12 14:17:20 |只看该作者 |正序浏览
下面是源码,请高手点出到底是哪一个环节 导致交易讯号消失,可能导致您的持仓不匹配 的错误
Params
        Numeric FastLength(12);
        Numeric SlowLength(26);
        Numeric MACDLength(9);
        Numeric Hand(1);
Vars
        NumericSeries MACDValue;
        Numeric AvgMACD;
        Numeric MACDDiff;
Begin
        MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;       
        AvgMACD = XAverage(MACDValue[1],MACDLength);
        MACDDiff = MACDValue - AvgMACD;
        PlotNumeric("MACD",MACDValue);
        PlotNumeric("MACDAvg",AvgMACD);
                If (MACDDiff >= 0)       
                PlotNumeric("MACDDiff",MACDDiff,0,Red);
        Else
                PlotNumeric("MACDDiff",MACDDiff,0,Green);
        PlotNumeric("零线",0);
                // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
        If(MarketPosition <>1 && MACDDiff>0)
        {
                Buy(Hand,Open);
                PlotString("买入","buy");
        }
       
        If(MarketPosition <>-1 && MACDDiff<0)
        {
                SellShort(Hand,Open);
                PlotString("卖出","sell");
        }
       
                        
       

End

Rank: 1

精华
0
UID
231077
积分
1
帖子
1
主题
0
阅读权限
10
注册时间
2016-3-29
最后登录
2018-6-6
24#
发表于 2017-6-16 17:33:57 |只看该作者
mark

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
23#
发表于 2016-4-15 15:31:19 |只看该作者
小米 发表于 2016-4-15 15:02
抱歉呀。工作人员的人力精力都有限,没法帮您一个个地策略找问题。
建议还是自己按我前面说的方法来自行 ...

好的,谢谢

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
22#
发表于 2016-4-15 15:02:12 |只看该作者
tmh402932 发表于 2016-4-15 14:40
您好,我这边写了一个策略,但是测的时候还是一直提示“交易讯号消失”,我看了下判断条件,好像没啥问题 ...

抱歉呀。工作人员的人力精力都有限,没法帮您一个个地策略找问题。
建议还是自己按我前面说的方法来自行排查,输出注释,定位问题。。

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
21#
发表于 2016-4-15 14:40:31 |只看该作者
小米 发表于 2016-4-13 13:51
在这后面不应该是currentbar>Lcount+1?

您好,我这边写了一个策略,但是测的时候还是一直提示“交易讯号消失”,我看了下判断条件,好像没啥问题,实在看不出是哪里导致的问题,请帮忙看下,谢谢
Params
    Bool    bInitStatus(false);//初始化标志,修改初始仓位时需设置为True
    Numeric InitMyRealMp(0);//初始当前仓位,正数表示多单,负数表示空单
    Numeric FirstGrid(10);//第一笔交易的间距,最小跳动
    Numeric AddGrid(30);//加仓间距,最小跳动
    Numeric TotalGrids(10);//最大交易次数
    Numeric TrailingGrid(10);//移动止损间距,最小跳动
    Numeric EveryLots(1);//每次开仓手数
    Numeric OffSet(1);//委托价偏差,默认买卖价偏差1个滑点
    Numeric ExitOnCloseMins(15.00);//收盘平仓时间
Vars
    Numeric HighAfterlongEntry;
    Numeric  LowAfterShortEntry;
    Numeric    MyRealMp(0);
    Numeric   MinPoint;
    Numeric  TmpPrice;
    Numeric   TmpLots;
Begin
    MinPoint=MinMove*PriceScale;//当前商品最小变动量*当前商品的计数单位
    MyRealMp=GetGlobalVar(0); //获取MyRealMp全局变量值
    HighAfterlongEntry=GetGlobalVar(1);
    LowAfterShortEntry=GetGlobalVar(2);
    If(BarStatus==0 And (MyRealMp==InvalidNumeric||bInitStatus))     //当前bar为第一个bar且MyRealMp为无效值 ,那么初始当前仓位 0
    {MyRealMp=InitMyRealMp;}
    If(Date<>Date[1]){               //当前Bar的日期 不等于 上一个 Bar的日期说明 隔夜了
                HighAfterlongEntry=High[1];     // 设置 HighAfterlongEntry的值为当前Bar的最高价
                LowAfterShortEntry=Low[1];                 // 设置 LowAfterShortEntry的值为当前Bar的最低价
                MyRealMp=0;
    }Else{
                HighAfterlongEntry=Max(HighAfterlongEntry,High[1]);
                LowAfterShortEntry=Min(LowAfterShortEntry,Low[1]);
        }
        if (Time<ExitOnCloseMins/100){                  //当前Bar的时间 小于 收盘时间               
                If(MyRealMp>0 And HighAfterlongEntry-Low[1]>=TrailingGrid*MinPoint And(High[1]-Low[1]<TrailingGrid*MinPoint Or (High[1]-Low[1]>=TrailingGrid*MinPoint And Close[1]>Open))){
                          PlotString("a","a");
                          TmpPrice=Max(HighAfterLongEntry-(TrailingGrid-OffSet)*MinPoint,Low[1]);
                          TmpLots=Abs(MyRealMp*EveryLots);
                          Sell(TmpLots,TmpPrice);
                          MyRealMp=0;
                          LowAfterShortEntry=Low[1];
                 }else If(MyRealMp<0 And High-LowAfterShortEntry>=TrailingGrid*MinPoint And (High[1]-Low[1]<TrailingGrid*MinPoint Or (High[1]-Low[1]>=TrailingGrid*MinPoint And Close[1]<Open))){
                          TmpPrice=Min(LowAfterShortEntry+(TrailingGrid+OffSet)*MinPoint,High[1]);
                          TmpLots=Abs(MyRealMp*EveryLots);
                          BuyToCover(TmpLots,TmpPrice);
                          MyRealMp=0;
                          HighAfterLongEntry=0;
                 }
         If(MyRealMp==0 And High[1]-LowAfterShortEntry>=FirstGrid*MinPoint){       //第一笔多单开仓
                           TmpPrice=Min(LowAfterShortEntry+(FirstGrid+OffSet)*MinPoint,High[1]);
                           TmpLots=EveryLots;
                           Buy(TmpLots,TmpPrice);
                           MyRealMp=1;
                           HighAfterLongEntry=High[1];
          }Else If(MyRealMp>0 And MyRealMp<TotalGrids And High[1]-LowAfterShortEntry>=(FirstGrid+MyRealMp*AddGrid)*MinPoint){        //多单加仓                          
                          TmpPrice=Min(LowAfterShortEntry+(FirstGrid+MyRealMp*AddGrid+OffSet)*MinPoint,High[1]);
                           TmpLots=EveryLots;
                           Buy(TmpLots,TmpPrice);
                           MyRealMp=MyRealMp+1;
          }else If(MyRealMp==0 And HighAfterLongEntry-Low[1]>=FirstGrid*MinPoint){   //第一笔空单开仓
                           TmpPrice=Max(HighAfterLongEntry-(FirstGrid-OffSet)*MinPoint,Low[1]);
                           TmpLots=EveryLots;
                           SellShort(TmpLots,TmpPrice);
                           MyRealMp=-1;
                           LowAfterShortEntry=Low[1];
          }else If(MyRealMp<0 And -1*MyRealMp<TotalGrids And HighAfterLongEntry-Low[1]>=(FirstGrid+Abs(MyRealMp*AddGrid))*MinPoint){    //空单加仓
                           PlotString("f","f");       
                           TmpPrice=Max(HighAfterLongEntry-(FirstGrid-Abs(MyRealMp*AddGrid)-OffSet)*MinPoint,Low[1]);
                           TmpLots=EveryLots;
                           SellShort(TmpLots,TmpPrice);
                           MyRealMp=MyRealMp-1;
                   }
       }else If(Time>=ExitOnCloseMins/100){           //当前Bar的时间 大于等于 收盘时间
                  
                  
                   If(MyRealMp>0)
                   {
                           TmpLots=Abs(MyRealMp*EveryLots);
                           TmpPrice=Close[1];
                           Sell(0,TmpPrice);
                           MyRealMp=0;
                        }
                   If(MyRealMp<0)
                   {
                           TmpLots=Abs(MyRealMp*EveryLots);
                           TmpPrice=Close[1];
                           BuyToCover(0,TmpPrice);
                           MyRealMp=0;
                        }
           }
       SetGlobalVar(0,MyRealMp);
       SetGlobalVar(1,HighAfterLongEntry);
       SetGlobalVar(2,LowAfterShortEntry);
       Commentary("MyRealMp="+Text(MyRealMp));
       Commentary("HighAfterLLowAfterShortEntry="+Text(LowAfterShortEntry));
       End

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
20#
发表于 2016-4-13 15:22:54 |只看该作者
本帖最后由 tmh402932 于 2016-4-13 15:25 编辑
小米 发表于 2016-4-13 13:51
在这后面不应该是currentbar>Lcount+1?


恩,应该是currentbar>Lcount+1,如果是currentbar<Lcount+1那么又会造成交易讯号消失,我现在想写一个利用MACD快慢线交叉来判断买入或者卖出,从这几天写的代码看来,只能在交叉出现的后一个bar去买入或者卖出,有没有办法能在交叉点上买入或者卖出(之前写的在交叉点上买入或者卖出都提示交易讯号消失。。,看了下测试报告,在交叉点和在交叉点后一个bar买入或者卖出 差了十万八千里)

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
19#
发表于 2016-4-13 13:51:57 |只看该作者
tmh402932 发表于 2016-4-13 13:23
好,我下午测下,LCount是金叉的时候记录当时的bar数,SCount是死叉的时候记录当时的bar数,currentbar<  ...

在这后面不应该是currentbar>Lcount+1?

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
18#
发表于 2016-4-13 13:23:05 |只看该作者
小米 发表于 2016-4-13 12:15
不好说,我确定不了,Lcount,Scount的值是什么样的,与currentbar< Lcount,Scount+1的判断,这个逻辑是否 ...

好,我下午测下,LCount是金叉的时候记录当时的bar数,SCount是死叉的时候记录当时的bar数,currentbar< Lcount,Scount+1我是想在买入或者卖出的时候保证当前bar在金叉或者死叉后一个bar

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
17#
发表于 2016-4-13 12:15:55 |只看该作者
tmh402932 发表于 2016-4-13 11:59
如果我改成这样应该就不会出现 “交易讯号消失”的情况了吧

Params

不好说,我确定不了,Lcount,Scount的值是什么样的,与currentbar< Lcount,Scount+1的判断,这个逻辑是否合理。。
你可以用模拟测试一下啊。

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
16#
发表于 2016-4-13 11:59:55 |只看该作者
小米 发表于 2016-4-13 10:52
是的,信号由条件决定,条件稳定,信号就稳定。
con1,con2有决定后面某些平仓条件值 。。
比如,UpTrend ...

如果我改成这样应该就不会出现 “交易讯号消失”的情况了吧

Params
        Numeric FastLength(12);
        Numeric SlowLength(26);
        Numeric MACDLength(9);
        Numeric ChLen(5);
        Numeric ExtraPercentage(30);   //通道突破的幅度(万分比) 300 = 3%
        Numeric Hand(1);
Vars
        NumericSeries MACDValue;
        Numeric AvgMACD;
        Numeric MACDDiff;
        Bool con1;
        Bool con2;
        NumericSeries LEntryPrice;   //开多的突破价格
        NumericSeries SEntryPrice;   //开空的突破价格
        Numeric lavger;
        Numeric savger;
        NumericSeries LCount;   //均线金叉后记录bar序号
        NumericSeries SCount;   //均线死叉后记录bar序号
        BoolSeries Upflag;
        BoolSeries Dnflag;
Begin
        MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;       
        AvgMACD = XAverage(MACDValue,MACDLength);
        PlotNumeric("MACD",MACDValue);
        PlotNumeric("MACDAvg",AvgMACD);
                // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
        con1 = CrossOver(MACDValue,AvgMACD);
        con2 = CrossUnder(MACDValue,AvgMACD);
        lavger = AverageFC(Close,ChLen);
        If(con1)     //金叉   设置买入价格
        {
                Upflag = True;
                //记录bar序号以控制只在金叉后Chlen根bar内进场否则放弃本次交易
                LCount = CurrentBar;
               
        }
       
        If(MarketPosition <>1 && Upflag[1] && CurrentBar <=LCount+1 && Vol>0 )
        {
                Buy(Hand,Open);
                PlotString("买入","buy");
                LCount = -999;
        }
        savger = AverageFC(Close,ChLen);
        If(con2){
                Dnflag = True;
                SCount = CurrentBar;
        }
       
        If(MarketPosition <>-1 && Dnflag[1] && CurrentBar <=SCount+1 && Vol>0 )
        {
                SellShort(Hand,Open);
                PlotString("卖出","sell");
                SCount = -999;
        }       
       

End

使用道具 举报

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

bottom

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

GMT+8, 2024-5-4 11:41

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部