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

标题: 请教nopain,写了5小时,实在是很为难啊。 [打印本页]

作者: thjyqr    时间: 2009-5-10 17:07:48     标题: 请教nopain,写了5小时,实在是很为难啊。

求教了,这个该怎样编写啊。
如果获利达到2R了那么后面行情无论涨跌我都采取一种立场方式。但是到3R后我又采取另外一种方式立场。比如KDJ指标。
因为收盘价达到2R后,后面有可能下一个BAR 有没有2R了,但是只要前面达到一次我就必须采用一种策略出场。
作者: nopain    时间: 2009-5-11 09:54:48

其实很简单,就是记住开仓后的最高价或最低价,然后判断相应的处理。类似于多级跟踪止损。

先建两个序列变量:
        NumericSeries HigherAfterEntry;
        NumericSeries LowerAfterEntry;

在程序开始的地方初始化:

If(BarsSinceEntry == 1)
        {
                HigherAfterEntry = AvgEntryPrice;
                LowerAfterEntry = HigherAfterEntry;
        }Else If(BarsSinceEntry > 1)
        {
                HigherAfterEntry = max(HigherAfterEntry[1],High[1]);
                LowerAfterEntry = min(LowerAfterEntry[1],Low[1]);
        }

最后进行处理:
If(MarketPosition==1)
{
        MaxProfit = HigherAfterEntry-AvgEntryPrice;
        Commentary("MaxProfit="+Text(MaxProfit));
        If(MaxProfit > 60*MinPoint)
        {
                StopLine = HigherAfterEntry-MaxProfit*0.4;
                Commentary("启动二级跟踪");
        }Else If(MaxProfit > 30*MinPoint)
        {
                StopLine = HigherAfterEntry-MaxProfit*0.5;
                Commentary("启动一级跟踪");
        }Else
        {
                StopLine = AvgEntryPrice - StopLoss*MinPoint;
                Commentary("启动原始止损");
        }
       
        If(Low <= StopLine)
        {
                MyPrice = StopLine;
                If(Open < MyPrice ) MyPrice = Open;
                Sell(1,MyPrice);
                Commentary("触发止损");
        }
}else if(MarketPosition==-1)
{
        MaxProfit = AvgEntryPrice-LowerAfterEntry;
        Commentary("MaxProfit="+Text(MaxProfit));
        If(MaxProfit > 60*MinPoint)
        {       
                StopLine = LowerAfterEntry+MaxProfit*0.4;
                Commentary("启动二级跟踪");
        }Else If(MaxProfit > 30*MinPoint)
        {
                StopLine = LowerAfterEntry+MaxProfit*0.5;
                Commentary("启动一级跟踪");
        }Else
        {
                StopLine = AvgEntryPrice + StopLoss*MinPoint;
                Commentary("启动原始止损");
        }
       
        If(High >= StopLine)
        {
                MyPrice = StopLine;
                If(Open > MyPrice ) MyPrice = Open;
                BuyToCover(1,MyPrice);
                Commentary("触发止损");
        }
}
作者: 高架桥    时间: 2009-5-11 15:28:09

楼主的R是指什么???
作者: thjyqr    时间: 2009-5-12 12:17:47

R是风险值。

可以通过设置全局变量来实现这一部分吗?

If(MarketPosition==1)
{
        MaxProfit = HigherAfterEntry-AvgEntryPrice;
        Commentary("MaxProfit="+Text(MaxProfit));
        If(MaxProfit > 60*MinPoint)
        {
                StopLine = HigherAfterEntry-MaxProfit*0.4;
                Commentary("启动二级跟踪");
        }Else If(MaxProfit > 30*MinPoint)
        {
                StopLine = HigherAfterEntry-MaxProfit*0.5;
                Commentary("启动一级跟踪");
        }Else
        {
                StopLine = AvgEntryPrice - StopLoss*MinPoint;
                Commentary("启动原始止损");
        }
        
        If(Low <= StopLine)
        {
                MyPrice = StopLine;
                If(Open < MyPrice ) MyPrice = Open;
                Sell(1,MyPrice);
                Commentary("触发止损");
        }
作者: thjyqr    时间: 2009-5-12 12:21:13

只要前面达到一次我就必须采用一种策略出场。至于是不是一定出场那要看策略来说。这里的逻辑关系有点模糊
作者: nopain    时间: 2009-5-12 12:45:09     标题: 回复 #4 thjyqr 的帖子

这里是用序列变量啊。没有全局变量
作者: thjyqr    时间: 2009-5-13 08:29:56

谢谢NOPAIN的细心解答。但是我想这有必要设置两个变量吗?用
SetGlobalVar(HIGH,BarsSinceEntry),SetGlobalVar(LOW,BarsSinceEntry就搞定了这样有什么不妥吗?我是一手一手交易的。交易频繁。
作者: nopain    时间: 2009-5-13 09:28:42     标题: 回复 #7 thjyqr 的帖子

你这写的什么,看不懂?
作者: thjyqr    时间: 2009-5-13 15:38:03

我写错了,是这样写的。
SetGlobalVar(0,highest(HIGH,BarsSinceEntry)),SetGlobalVar(1,lowest(LOW,BarsSinceEntry))
作者: nopain    时间: 2009-5-13 15:52:58     标题: 回复 #9 thjyqr 的帖子

1、这样运算慢
2、这样最后一个Bar的High/Low 也算进去了。
作者: chengjun1201    时间: 2010-3-19 15:56:28

多级跟踪止损  good!!!!!!!!!
作者: nabaobao80    时间: 2010-3-19 16:12:14

尽量不要在不是非常必要的时候用全局变量。
一般的用序列完全能解决问题了。
全局会弄的很乱。逻辑不清楚。
作者: h882010790    时间: 2010-3-19 23:21:25     标题: 如何在历史测试中在一分钟线天的最高价啊

如何在历史测试中在一分钟线上调用任何前面任何一天的最高价啊
作者: yangtse010    时间: 2010-3-20 06:50:34

highD()   只要1分钟K线数据足够多
作者: 笑啸霄    时间: 2010-4-6 15:27:48

If(BarsSinceEntry == 1)
        {
                HigherAfterEntry = AvgEntryPrice;
                LowerAfterEntry = HigherAfterEntry;
        }Else If(BarsSinceEntry > 1)
        {
                HigherAfterEntry = max(HigherAfterEntry[1],High[1]);
                LowerAfterEntry = min(LowerAfterEntry[1],Low[1]);
        }
如果是日内交易的话,这里的High[1]是指开仓BAR以后的high[1]还是从开盘以后的第一根BAR算起至当前BAR当中的最高?
作者: lh948    时间: 2010-4-6 15:30:14

High[1]是指图表上前一个bar的最高价
作者: sx810    时间: 2010-4-26 22:22:24     标题: 回复 3# 高架桥 的帖子

If(MarketPosition==1)
{
        MaxProfit = HigherAfterEntry-AvgEntryPrice;
        Commentary("MaxProfit="+Text(MaxProfit));
        If(MaxProfit > 60*MinPoint)问题1::这里是指盈利有60个点吗?
        {
                StopLine = HigherAfterEntry-MaxProfit*0.4;问题2:这里是最高价回撤40%吗?需要计算各个品种吗?
                Commentary("启动二级跟踪");
        }        }Else
        {
                StopLine = AvgEntryPrice - StopLoss*MinPoint;问题3:StopLoss这里指什么意思?
                Commentary("启动原始止损");
        }
        
     请回答,谢谢!
作者: lh948    时间: 2010-4-27 13:20:31

1.是的
2.是的,不是各个计算的
3.设置的止损的点数
作者: 深蓝魔力    时间: 2010-5-6 18:16:45

这个跟踪系统牛!
先收集,等有空好好琢磨下。
作者: choir2001    时间: 2010-6-26 01:25:01

一级跟踪,二级跟踪,人间大炮发射!
作者: notebook00    时间: 2010-7-9 14:01:11

如果今天也创新高了,那么HigherAfterEntry也应该当时就刷新了吧?
        HigherAfterEntry = max(HigherAfterEntry[1],High[1],high);
                LowerAfterEntry = min(LowerAfterEntry[1],Low[1],low);
把今天的high也放进去判断,这样行吗?
作者: 文静的狮子    时间: 2010-7-25 21:30:40

请问版主,这个函数:MaxPositionProfit,是指开仓以来的最大盈利吗?是不是等于 HigherAfterEntry-AvgEntryPrice乘以持仓手数,这样是不是就不用计算了?
40%回撤平仓用SetPercentTrailing(maxprofit,0.4,False)也可以吧?
作者: devcon    时间: 2010-8-10 17:57:34

可以分别输出这两个值,比较一下就知道了。




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