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

标题: 我来学习来了,呵呵 [打印本页]

作者: 大一    时间: 2007-7-29 11:20:04     标题: 我来学习来了,呵呵

请问一下斑竹,当前的最新价怎么用函数表达 ?
作者: 大一    时间: 2007-7-29 11:53:30

或者说,当前最新价高于开盘价5个点,我就买入,怎么写 ?
作者: nopain    时间: 2007-7-29 16:57:24

原帖由 大一 于 2007-7-29 11:53 发表
或者说,当前最新价高于开盘价5个点,我就买入,怎么写 ?


你的交易系统意思是要当前Bar的最新价,即收盘价[Close]高于当日的开盘价。而不是当前Bar的开盘价。
对于这样的系统,我觉得在1分钟线上做自动交易比较合理。您先设置周期为1分钟,然后在超级图表的商品设置中选择数据范围为一天以来的数据。
这样,第一个Bar的开盘价即当日的开盘价。

这个时候,您的条件可以表述为:
  1. If(Close > Open[CurrentBar] + 5 * PriceScale() * MinMove())
  2. {
  3. //您的后续处理代码
  4. }
复制代码



如果不这样设置数据范围,那您需要在判断哪一个Bar是当天的第一个Bar,然后把这个Bar的开盘价记录下来。算法相对复杂些,但也不是很难。主要是通过Date函数来判断日期,如果和前一个Bar的Date不相同,则应该是新的一天的第一个Bar

[ 本帖最后由 nopain 于 2007-7-29 16:59 编辑 ]
作者: 大一    时间: 2007-7-29 21:06:53

谢谢了,我试着编一编。
作者: 大一    时间: 2007-7-29 23:39:59

If(Close > Open[CurrentBar] + 5 * PriceScale() * MinMove())
{
//您的后续处理代码
}

假如我做橡胶,一个点是5元,minmove后面的 () 里是不是应该填5 ?
那pricescale后面的 () 里应该填多少?
作者: nopain    时间: 2007-7-30 09:15:27

原帖由 大一 于 2007-7-29 23:39 发表
If(Close > Open[CurrentBar] + 5 * PriceScale() * MinMove())
{
//您的后续处理代码
}

假如我做橡胶,一个点是5元,minmove后面的 () 里是不是应该填5 ?
那pricescale后面的 () 里应该填多少? ...

这个是系统函数,不需要填写参数。
具体是5个点,还是10个点,系统已经设置好了。报价精度也是设置好了。
作者: 大一    时间: 2007-7-31 19:01:05

我仿造示例做了一个,毛病很多,不知道问题出在哪里

1,开仓:最新价格比当天开盘价格高3个点就买,反之就卖。
2,止损:最损失超过5个点就止损平仓。
3,收盘前全平 。


Params
        Numeric lots(1);
        Numeric LossDots(5);
Vars
        Numeric MinMovePrice;
        Numeric preMP;
        
Begin
        MinMovePrice = MinMove * PriceScale;   //每跳动一下是多少点的意思系统已经设定好了
        preMP = MarketPosition;
        If(Time > 0.145930 && Time < 0.150030 && preMP!=0) // 收盘平仓
        {
                If(preMP == 1)
                {
                        Sell;
                }else if(preMP == -1)
                {
                        BuyToCover;
                }
        }        
        
        If(preMP == 0)
        {
                If(Close > Open[CurrentBar] + 3 * minmoveprice)

                {
                        Buy(lots,high,true);
                }Else If(Close <Open[CurrentBar] + 3 * minmoveprice)
                {
                        SellShort(lots,low,true);
                }
        }
        
        SetStopLoss(1, ContractUnit *BigPointValue *LossDots*MinMovePrice, true); // 止损平仓
        
End
作者: 大一    时间: 2007-7-31 19:04:49

测试了一下,很有问题的。

盘中止损以后,只要价格比当天开盘价格高,不管高多少点(当然是大于3个点以上)都不断地开仓。。。
作者: 大一    时间: 2007-7-31 19:05:06

请斑竹看一看问题出在哪里 ?
作者: nopain    时间: 2007-7-31 20:35:47

原帖由 大一 于 2007-7-31 19:05 发表
请斑竹看一看问题出在哪里 ?


1、首先,Close > Open[CurrentBar]的写法必须配合我前面讲的商品数据范围设置方法,1天以来的数据。周期可以是1,5,15分钟,再大估计没什么意义了。其他的数据范围设置就整个不对了。
2、另外,
  1. If(Close > Open[CurrentBar] + 3 * minmoveprice)
  2. {
  3.     Buy(lots,high,true);
  4. }Else If(Close <Open[CurrentBar] + 3 * minmoveprice) // 这里应该是减号吧?
  5. {
  6.     SellShort(lots,low,true);
  7. }
复制代码

作者: 大一    时间: 2007-7-31 21:27:04

确实应该是减号,我真是粗心,我说嘛,为什么收盘比开盘高的时候仍然开空仓,测试一塌糊涂,原来问题出在这里。。。

多谢斑竹能给我指出毛病!
作者: 大一    时间: 2007-7-31 21:29:14

另外,今天早上我尝试自动交易的时候,我按你的说法,设置成一天以来的数据,可是我选了好几个品种都是没有数据,提示:正在接受数据。  过了一会还是没有,我就设置成好几天的数据,这下有数据了。。。
作者: nopain    时间: 2007-8-1 08:55:05

原帖由 大一 于 2007-7-31 21:29 发表
另外,今天早上我尝试自动交易的时候,我按你的说法,设置成一天以来的数据,可是我选了好几个品种都是没有数据,提示:正在接受数据。  过了一会还是没有,我就设置成好几天的数据,这下有数据了。。。 ...


1、有可能是确实当天以来没有数据。您可以试试点图表工具栏的最后一个按钮,进行刷新。

2、旧的版本在数据库容错方面还有些小问题,有的时候可能导致取不出数据。您可以参照下贴的操作:
每天只有8时前或晚上能登录并收到数据

3、新的版本会最近几天发行。数据容错方面的这些个问题就解决了

[ 本帖最后由 nopain 于 2007-8-14 20:49 编辑 ]
作者: 大一    时间: 2007-8-2 22:07:57

斑竹看一下,有矛盾的地方吗 ?
Params
        Numeric lots(1);
      
Vars
        Numeric MinMovePrice;
        Numeric preMP;
        
Begin
        MinMovePrice = MinMove * PriceScale;   //每跳动一下是多少点的意思系统已经设定好了
        preMP = MarketPosition;
        If(Time > 0.145930 && Time < 0.150030 && preMP!=0) // 收盘平仓
        {
                If(preMP == 1)
                {
                        Sell;
                }else if(preMP == -1)
                {
                        BuyToCover;
                }
        }        
        
        If(preMP == 0)
        {
                If(Close > Open[CurrentBar] + 3 * minmoveprice  )

                {
                        Buy(lots,high,true);
                }Else If(Close <Open[CurrentBar] - 3 * minmoveprice )
                {
                        SellShort(lots,low,true);
                }
        }
        
        Else If(preMP == 1) // long
        {
                If (Close <Open[CurrentBar] - 3 * minmoveprice ) // 止损反转
                {
                        SellShort(lots,low,true);
                }
        }else If(preMP == -1) // short
        {
                If (Close > Open[CurrentBar] + 3 * minmoveprice ) // 止损反转
                {
                        Buy(lots,high,true);
                }
        }

        
End
作者: ddbq    时间: 2007-8-14 20:45:22

思路好,,函数掌握得很好,程序写得好,值得我学习,佩服
复制一遍,学习学习,嘿嘿

Params
        Numeric lots(1);
        Numeric LossDots(5);
Vars
        Numeric MinMovePrice;
        Numeric preMP;
        
Begin
        MinMovePrice = MinMove * PriceScale;  
        preMP = MarketPosition;

        If(Time > 0.145930 && Time < 0.150030 && preMP!=0)         {
                If(preMP == 1)
                {
                        Sell;
                }else if(preMP == -1)
                {
                        BuyToCover;
                }
        }        
        
        If(preMP == 0)
        {
                If(Close > Open[CurrentBar] + 3 * minmoveprice)

                {
                        Buy(lots,high,true);
                }Else If(Close <Open[CurrentBar] - 3 * minmoveprice)
                {
                        SellShort(lots,low,true);
                }
        }
        
        SetStopLoss(1, ContractUnit *BigPointValue *LossDots*MinMovePrice, true); // 止损平仓
        
End
作者: nopain    时间: 2007-8-14 20:54:12

原帖由 大一 于 2007-8-2 22:07 发表
斑竹看一下,有矛盾的地方吗 ?
Params
        Numeric lots(1);
      
Vars
        Numeric MinMovePrice;
        Numeric preMP;
        
Begin
        MinMovePrice = MinMove * PriceScale;   //每跳动一下是 ...


Sorry,前一段时间没有看到您这个帖子。
您的这个系统,问题出在平仓指令写错了。。。
Buy对应Sell
SellShort对应BuyToCover.

也可以象ddbq这样直接用止损指令。

[ 本帖最后由 nopain 于 2007-8-14 20:55 编辑 ]
作者: 小马    时间: 2009-3-19 17:16:17

14楼 “大一”的代码有几个错误:
1、Time < 0.150030  时间为何不是0.150000 ?收盘应该是3点整
2、收盘平仓 If(Time > 0.145930 && Time < 0.150030 && preMP!=0)里面的语句应该有return语句,或者使用
If(Time > 0.145930 && Time < 0.150000 && preMP!=0)
  {...}else if(...)
               {...}
3、按照“大一”的原意,应该是亏5点止损平仓,而不应该是把开仓代码又重写了一遍,应该像15楼一样使用止损指令。不过15楼的代码也存在1和2两个错误




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