设为首页收藏本站

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

这段止盈代码的问题在哪里? [复制链接]

Rank: 5Rank: 5

精华
0
UID
15203
积分
1411
帖子
397
主题
35
阅读权限
60
注册时间
2010-8-14
最后登录
2017-12-29
跳转到指定楼层
1#
发表于 2012-9-3 12:52:06 |只看该作者 |倒序浏览
下面代码的思路就是两根均线,金叉做多,死叉做空,价格盈利达到400点后,止盈价 = 达到过的最高价 — (达到过的最高价 — 开仓价) * 0.5。
以TA为例,假设金叉开多的价格为7000元,那么价格在达到7400后,比如价格最高到过7500,那么如果价格回落到 7500 - (7500 - 7000) * 0.5 = 7250元时,平多止盈。

但编译后测试,如果开了空单,必定在开空的第二个K线处平空,而多单就没有这个问题。但多单也不会按照设计的方式止盈,而是在均线死叉后反手。


Params
        Numeric longpara(30);
        Numeric shortpara(10);
        Numeric StopWin(0.5); //止盈系数,最大盈利回吐该系数作为止盈价
        Numeric WinPoint(400); //开启止盈时的浮盈点数(以价格计算)
Vars
        NumericSeries MAlong; //长周期均线
        NumericSeries MAshort; //短周期均线
        Bool buycond;
        Bool sellcond;
        Numeric BuyOpen(100000); //多单开仓价
        Numeric SellOpen(0); //空单开仓价
        Numeric BuyStopWin(0); //多单止盈价
        Numeric SellStopWin(0); //空单止盈价
        Numeric OpenBar; //开仓K线的索引值
        Numeric OpenCount; //当前K线到开仓K线之间的个数
        Numeric MostHigh; //开仓后达到过的最高价
        Numeric MostLow; //开仓后达到过的最低价
Begin
        MAlong = Average(Close, longpara);
        MAshort = Average(Close, shortpara);

        buycond = CrossOver(MAshort, MAlong);
        sellcond = CrossUnder(MAshort, MAlong);
        
        //止盈代码
        If(MarketPosition == 1)
        {
                OpenCount = CurrentBar - OpenBar;
                MostHigh = Highest(High, OpenCount);
                If(MostHigh - BuyOpen >= WinPoint)
                {BuyStopWin = MostHigh - (MostHigh - BuyOpen) * StopWin;}
        }
        If(MarketPosition == -1)
        {
                OpenCount = CurrentBar - OpenBar;
                MostLow = Lowest(Low, OpenCount);
                If(SellOpen - MostLow >= WinPoint)
                {SellStopWin = MostLow + (SellOpen - MostLow) * StopWin;}
        }
        
        If(MarketPosition == 1 And Low <= BuyStopWin)
        {
                Sell(0, Min(Open, BuyStopWin));
        }
        If(MarketPosition == -1 And High >= SellStopWin)
        {
                BuyToCover(0, Max(Open, SellStopWin));
        }
        //止盈代码结束

        If(buycond)
        {
                BuyOpen = Close;
                Buy(0, BuyOpen);
                OpenBar = CurrentBar;
                Return;
        }
        If(sellcond)
        {
                SellOpen = Close;
                SellShort(0, SellOpen);
                OpenBar = CurrentBar;
                Return;
        }
End

知行合一
利润来自追杀

Rank: 5Rank: 5

精华
0
UID
15203
积分
1411
帖子
397
主题
35
阅读权限
60
注册时间
2010-8-14
最后登录
2017-12-29
2#
发表于 2012-9-3 12:54:12 |只看该作者
后来有人说在IF内外要使用全局变量,于是我改成了下面的代码,使用了全局变量,似乎多单能正确止盈了,但空单仍然有同样的问题,在开仓的第二个K线就会平仓。
请高手帮忙看看,测试一下。我现在怀疑是TB本身的bug。

Params
        Numeric longpara(30);
        Numeric shortpara(10);
        Numeric StopWin(0.5); //止盈系数,最大盈利回吐该系数作为止盈价
        Numeric WinPoint(400); //止盈起始值(以价格计算)
Vars
        NumericSeries MAlong; //长周期均线
        NumericSeries MAshort; //短周期均线
        Bool buycond;
        Bool sellcond;
        Numeric BuyOpen(100000); //多单开仓价
        Numeric SellOpen(0); //空单开仓价
        Numeric BuyStopWin(0); //多单止盈价
        Numeric SellStopWin(0); //空单止盈价
        Numeric OpenBar; //开仓K线的索引值
        Numeric OpenCount; //当前K线到开仓K线之间的个数
        Numeric MostHigh; //开仓后达到过的最高价
        Numeric MostLow; //开仓后达到过的最低价
Begin
        MAlong = Average(Close, longpara);
        MAshort = Average(Close, shortpara);

        buycond = CrossOver(MAshort, MAlong);
        sellcond = CrossUnder(MAshort, MAlong);
        
        //止盈代码
        OpenCount = CurrentBar - GetGlobalVar(1); //计算开仓K线到当前K线的个数
        If(MarketPosition == 1)
        {
                MostHigh = Highest(High, OpenCount); //计算开仓后到当前K线为止的最高价
                If(MostHigh - GetGlobalVar(0) >= WinPoint) //开仓后最大浮盈(以价格计算)超过止盈起始值
                {BuyStopWin = MostHigh - (MostHigh - GetGlobalVar(0)) * StopWin;} //计算止盈价格
                If(Low <= BuyStopWin) //达到止盈条件时止盈
                {Sell(0, Min(Open, BuyStopWin));}
        }
        If(MarketPosition == -1)
        {
                MostLow = Lowest(Low, OpenCount);
                If(GetGlobalVar(0) - MostLow >= WinPoint)
                {SellStopWin = MostLow + (GetGlobalVar(0) - MostLow) * StopWin;}
                If(High >= SellStopWin)
                {BuyToCover(0, Max(Open, SellStopWin));}
        }
        //止盈代码结束

        If(buycond)
        {
                Buy(0, Close);
                SetGlobalVar(0, Close); //记录开仓价
                SetGlobalVar(1, CurrentBar); //记录开仓K线位置
                Return;
        }
        If(sellcond)
        {
                SellShort(0, Close);
                SetGlobalVar(0, Close); //记录开仓价
                SetGlobalVar(1, CurrentBar); //记录开仓K线位置
                Return;
        }
End

使用道具 举报

Rank: 1

精华
0
UID
112754
积分
30
帖子
9
主题
1
阅读权限
10
注册时间
2012-10-3
最后登录
2013-7-8
3#
发表于 2012-10-20 23:35:01 |只看该作者
应该是开仓条件的问题。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
15203
积分
1411
帖子
397
主题
35
阅读权限
60
注册时间
2010-8-14
最后登录
2017-12-29
4#
发表于 2012-10-21 08:34:49 来自手机 |只看该作者
是因为If中有序列函数

使用道具 举报

Rank: 2

精华
0
UID
169310
积分
69
帖子
38
主题
19
阅读权限
30
注册时间
2013-8-8
最后登录
2017-10-25
5#
发表于 2013-8-13 22:03:35 |只看该作者
If(Low <= BuyStopWin) //达到止盈条件时止盈

改位If(high>= BuyStopWin) //达到止盈条件时止盈

使用道具 举报

Rank: 1

精华
0
UID
189265
积分
36
帖子
30
主题
3
阅读权限
10
注册时间
2014-6-24
最后登录
2015-4-7
6#
发表于 2014-9-25 16:57:55 |只看该作者
楼主后来问题解决了吗?

使用道具 举报

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

bottom

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

GMT+8, 2024-5-11 21:27

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部