设为首页收藏本站

 找回密码
 注册
楼主: tmh402932
打印 上一主题 下一主题

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

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
11#
发表于 2016-4-13 10:08:16 |只看该作者
小米 发表于 2016-4-13 09:58
条件中的con1,con2的计算是用到了macdvalue和avgmacd得到的。。
变量avgmacd是计算用到了变量macdvalue,
...

恩,我是在看一本你们公司出的书“策略开发与应用”,其中书上有个策略是叫基于MACD判断的交易系统(first pull back system),代码如下,他的con1 与 con2也是用到了MACDLine,SignalLine,且都有用到close,就不懂这个到底有什么不同,这个不会出现讯号消失
Params
    Numeric FastMA(4);           //快速均线周期数
    Numeric SlowMA(10);   //慢速均线周期数
        Numeric AvgMA(16);     //通道突破的周期数
        Numeric ATRLen(10);   //ATR周期
        Numeric EATRPcnt(1);    //多少根bar的最低价作为跟踪止损价
        Numeric XATRPcnt(1); //初始进场头寸;
Vars
        NumericSeries MACDLine(0);   //快速均线
        NumericSeries SignalLine(0);   //慢速均线
        NumericSeries ZeroLine(0);
        NumericSeries AATR(0);
        BoolSeries UpTrend(False);
        BoolSeries DnTrend(False);
        BoolSeries BuySetup(False);
        NumericSeries CTrendLow(0);
        BoolSeries SignalFlag(False);
        Bool con1;
        Bool con2;
        Numeric MinPoint;
        NumericSeries Upperband;
        NumericSeries Exitband;
       
Begin
        //集合竞价和小节休息过滤
        if(!CallAuctionFilter()) Return;
        MinPoint = MinMove*PriceScale;
        MACDLine = XAverage(Close,FastMA)-XAverage(Close,SlowMA);//计算MACD快线
        SignalLine = XAverage(MACDLine,AvgMA);//计算MACD慢线
        AATR = AvgTrueRange(ATRLen);   //计算atr波动率
        ZeroLine = 0;
        con1 = CrossOver(MACDLine,SignalLine);
        PlotNumeric("SignalLine",SignalLine);
        PlotNumeric("ZeroLine",ZeroLine);
                PlotNumeric("MACDLine",MACDLine);
        if(con1){
                UpTrend = True;
                SignalFlag = False;
                PlotString("con1","con1");
        }
        con2 = CrossUnder(MACDLine,SignalLine);
        if(con2){
                UpTrend = False;
                BuySetup = False;
                SignalFlag = False;
                DnTrend = True;
                PlotString("con2","con2");
        }
       
        if(UpTrend == True){
                if(SignalFlag == False){
                        BuySetup = True;
                        CTrendLow = Low;
                }
               
                if(MACDLine < SignalLine And Low < CTrendLow[1])
                        CTrendLow = Low;
        }
                //入场价格及出厂价格
                if(BuySetup[1]==True And BuySetup[2] == False){
                        Upperband = Close[1] + (EATRPcnt*AATR[1]);
                        Exitband = Close[1] -(XATRPcnt*AATR[1]);
                }
                //系统入场
                if(BuySetup[1]==True AND MarketPosition == 0){
                        if(High >= Upperband and Vol>0){
                                Buy(0,Max(Open,Upperband));
                                BuySetup = False;
                                SignalFlag = True;
                        }
                }
                //系统出场
                if( MarketPosition == 1 And BarsSinceEntry >0 And Vol>0){
                        if(DnTrend[1] == True){
                                Sell(0,Open);                                       
                        }else if(Low <= CTrendLow[1]-MinPoint And CTrendLow[1]-MinPoint>=Exitband){   //持有多单后低于入场最低价格  出场
                       
                                Sell(0,Min(Open,CTrendLow[1]-MinPoint));
                        }Else if(Low <= Exitband){
                                Sell(0,Min(Open,Exitband));
                       
                        }
                }
       
End

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
12#
发表于 2016-4-13 10:20:39 |只看该作者
tmh402932 发表于 2016-4-13 10:08
恩,我是在看一本你们公司出的书“策略开发与应用”,其中书上有个策略是叫基于MACD判断的交易系统(firs ...[/quote]

[code]if(BuySetup[1]==True And BuySetup[2] == False){
                        Upperband = Close[1] + (EATRPcnt*AATR[1]);
                        Exitband = Close[1] -(XATRPcnt*AATR[1]);
                }
                //系统入场
                if(BuySetup[1]==True AND MarketPosition == 0){
                        if(High >= Upperband and Vol>0){
                                Buy(0,Max(Open,Upperband));
                                BuySetup = False;
                                SignalFlag = True;
                        }这里使用了回溯值,, 一定是上一个bar走完了,在下一个bar上出信号,自然是稳定的。

使用道具 举报

Rank: 1

精华
0
UID
227739
积分
19
帖子
17
主题
2
阅读权限
10
注册时间
2016-2-1
最后登录
2016-5-12
13#
发表于 2016-4-13 10:24:13 |只看该作者
小米 发表于 2016-4-13 10:20
tmh402932 发表于 2016-4-13 10:08
恩,我是在看一本你们公司出的书“策略开发与应用”,其中书上有个策略 ...


您的意思是 买卖信号的条件是稳定的就不会出现 讯号消失 的情况 ,上述代码中有用到的
if(con1){
                UpTrend = True;
                SignalFlag = False;
                PlotString("con1","con1");
        }
        con2 = CrossUnder(MACDLine,SignalLine);
        if(con2){
                UpTrend = False;
                BuySetup = False;
                SignalFlag = False;
                DnTrend = True;
                PlotString("con2","con2");
        }
因为在里面没有买入或者卖出,所以就不会讯号消失?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
14#
发表于 2016-4-13 10:52:05 |只看该作者
tmh402932 发表于 2016-4-13 10:24
您的意思是 买卖信号的条件是稳定的就不会出现 讯号消失 的情况 ,上述代码中有用到的
if(con1){
       ...

是的,信号由条件决定,条件稳定,信号就稳定。
con1,con2有决定后面某些平仓条件值 。。
比如,UpTrend,DnTrend,但这二个变量在使用时,也同样的是用了回溯值,不存在close会影响变化的可能。。

使用道具 举报

Rank: 1

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

好的,谢谢了,先研究研究,有问题了再来请教

使用道具 举报

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

使用道具 举报

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
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
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
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买入或者卖出 差了十万八千里)

使用道具 举报

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

bottom

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

GMT+8, 2024-4-25 11:59

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部