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

标题: 连续开仓问题。 [打印本页]

作者: 道勤    时间: 2010-5-11 11:58:39     标题: 连续开仓问题。

实盘交易第二天,出现一个问题。今天m1101在2901出现空单信号,但是连续开了6手。我整体设置如下,请老师看看。

空头代码如下,我使用最低价出发条件,避免用收盘价可能出现的多次触发。   别且在交易设置中,设置了同一个信号不准许连续开仓,而且现在了使用资金比例不能超过30%。但是程序仍然开了6手,将测试资金全部占用了。非常难以理解。  麻烦老师帮忙看看

Condition2 = CrossUnderHor(Low,LD[1]) AND MA5<MA10 AND MA10<MA30; //ma5 为5日均线,以此类推。

If (Condition2 And MarketPosition==1)
{
  Sell(0,0);
  SellShort(1,0);
}else If (Condition2)
{
  SellShort(1,0);
}
作者: 道勤    时间: 2010-5-11 12:03:05

上面的价格打错了是 2891
作者: p_b_yu    时间: 2010-5-11 12:29:20


“且在交易设置中,设置了同一个信号不准许连续开仓”——不许连续开仓是在程序里面设的,不是在交易设置里面设的。

而且就你贴出来的程序来看,是没有避免重复开仓的代码的。

作者: 道勤    时间: 2010-5-11 12:54:11

我是新手,只是使用基本的函数做的程序,防止连续开仓有单独的代码吗?   难道最低价突破会来回好几次吗?逻辑上有点想不通。
作者: 道勤    时间: 2010-5-11 12:56:43

设置的资金最大使用限额也没有起到作用。程序开仓的时候应该考虑到准许使用的资金,是这样理解吗?如果不考虑,还要这个选项有什么用?
作者: lh948    时间: 2010-5-11 14:27:21

手数为0,就根据交易设置下单
至于重复发单,是你计算均线ma的时候,用了close
建议延迟发单
作者: 道勤    时间: 2010-5-11 14:33:58

哦  十分感谢。   看来写程序真是一件十分严密的事情。
作者: 道勤    时间: 2010-5-12 10:59:47

有没有方法做到,bar上只要第一次条件满足,之后就不在判断该条件了?   这样可能解决信号重复出现的问题。
作者: lh948    时间: 2010-5-12 11:47:52

buysell没有办法的,不能照你说的做
作者: 道勤    时间: 2010-5-12 11:57:46

老师的意思是,其它函数可以做到?   用什么函数可以呢?
作者: lh948    时间: 2010-5-12 12:14:34

用A_SendOrder发单,不用延迟发单,即时发单,用全局变量标记控制重复发单。
但是A_Sendorder不会有信号标记出现。
作者: 道勤    时间: 2010-5-12 15:23:37

老师,A_Sendorder能找到帮助,全局变量可以在哪里查到用法帮助呢?  谢谢!
作者: lh948    时间: 2010-5-12 15:28:17     标题: 回复 12# 道勤 的帖子

在论坛里搜索一下,很多的。相信以前很多人的问题都能够帮助您。
作者: 道勤    时间: 2010-5-12 16:15:49

老师帮忙看看,原有的buy sell语句,这样翻译是否正确。   感谢troyhou老师提供的代码。还有zejunl老师对A_sendorder的注释。

---------------------------------------------------------------------------------
需要被翻译的代码如下:

          If (Condition1 And MarketPosition==-1)
        {
                BuyToCover(0,0);
                Buy(0,0);
        }else if (Condition1)
        {
                Buy(0,0);
        }
        If (Condition2 And MarketPosition==1)
        {
                Sell(0,0);
                SellShort(0,0);
        }else If (Condition2)
        {
                SellShort(0,0);
        }

翻译后的语句:

           If ( barstatus==0 )
        {
                SetGlobalVar(0,SetPos);        //setpos,调整初始持仓(我自己是这样理解的,不知道对不对)
        }
        
        If ( GetGlobalVar(0)==0  )
        {
                If ( Condition1 /* 开多仓条件满足 */ )
                {
                        A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice());
                        SetGlobalVar(0,1);
                }
                If ( Condition2 )
                {
                        A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
                        SetGlobalVar(0,-1);
                }
        }
  
        If ( GetGlobalVar(0)==1 && Condition2 /* 平多仓条件满足 */ )
        {
                A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice());
                A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
                SetGlobalVar(0,-1);
                /* SetGlobalVar(0,0); */
        }
   
        If ( GetGlobalVar(0)==-1 && Condition1 /* 平空仓条件满足 */ )
        {
                A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice());
                A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice());
                SetGlobalVar(0,1);
                /* SetGlobalVar(0,0); */
        }
作者: 道勤    时间: 2010-5-12 16:28:21

或者是否需要在做反手的时候,先判断之前的平仓是否已经执行。

---------------------------------------------------------------

If ( barstatus==0 )
        {
                SetGlobalVar(0,SetPos);        
        }
        
        If ( GetGlobalVar(0)==0  )
        {
                If ( Condition1 /* 开多仓条件满足 */ )
                {
                        A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice());
                        SetGlobalVar(0,1);
                }
                If ( Condition2 )
                {
                        A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
                        SetGlobalVar(0,-1);
                }
        }
  
        If ( GetGlobalVar(0)==1 && Condition2 /* 平多仓条件满足 */ )
        {
                A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice());
                SetGlobalVar(0,0);
               
                If ( GetGlobalVar(0)==0  )  //判断平常是否已经被执行
                {
                        A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
                        SetGlobalVar(0,-1);
                        /* SetGlobalVar(0,0); */
                }
        }
   
        If ( GetGlobalVar(0)==-1 && Condition1 /* 平空仓条件满足 */ )
        {
                A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice());
                SetGlobalVar(0,0);

                If ( GetGlobalVar(0)==0  )  //判断平仓是否已经被执行。
                {
                        A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice());
                        SetGlobalVar(0,1);
                        /* SetGlobalVar(0,0); */
                }
        }

[ 本帖最后由 道勤 于 2010-5-12 16:46 编辑 ]
作者: 道勤    时间: 2010-5-12 16:45:35

今天的成绩还是不错的,排除一次连续开仓错误外,总体盈利在2%左右。
作者: lh948    时间: 2010-5-12 17:03:03

基本上没有问题,SetPos是在哪里赋值定义的?
作者: 道勤    时间: 2010-5-12 17:15:09

在参数里,可以自己修改的位置。
Params
    Numeric SetPos(0);
作者: troyhou    时间: 2010-5-13 08:36:26

  1.         If ( GetGlobalVar(0)==1 && Condition2 /* 平多仓条件满足 */ )
  2.         {
  3.                 A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice());
  4.                 SetGlobalVar(0,0);
  5.                
  6.                 If ( GetGlobalVar(0)==0  )  //判断平常是否已经被执行
  7.                 {
  8.                         A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
  9.                         SetGlobalVar(0,-1);
  10.                         /* SetGlobalVar(0,0); */
  11.                 }
  12.         }
  13.   
复制代码
  1.         If ( GetGlobalVar(0)==1 && Condition2 /* 平多仓条件满足 */ )
  2.         {
  3.                 A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice());
  4.                 A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice());
  5.                 SetGlobalVar(0,-1);
  6.                 /* SetGlobalVar(0,0); */
  7.         }
复制代码
这两段代码作用完全一摸一样,也就是说前面那段代码有点多此一举。

另外,有两点建议:
一、开仓价和平仓价如果不加偏移点,在目前的模拟盘不会有问题,但是在真实账户中很有可能不成交。
二、关于平仓马上反手的问题,我个人认为没有必要。因为,平仓有两种情况:一种是止损平仓,一般来说,在这种情况下,立即反手肯定是不妥的;第二种平仓就是反手信号出现,以你的代码来举例吧,我认为在你的代码中“平多仓条件”很可能与“开空仓条件”是一样的。这样的话,在“平多仓条件”满足并成功平掉仓位以后,我们不需要立即反手。因为,在接下来的一个Tick来临的时候,你的“开空仓条件”(其实就是“平多仓条件”)依然满足,自然可以成功建仓。
作者: 道勤    时间: 2010-5-13 08:37:15

老师我有2个疑问。
1、如果使用A_SendOrder() 发单,之前做的收盘平仓命令是否也需要修改成,A_SendOrder()函数,而不能使用buy sell?
2、使用A_sendOrder()之后,是否还可以使用程序自带的交易公式组合策略(例如百分比回撤交易指令)?
作者: 道勤    时间: 2010-5-13 08:58:09

troyhou老师分析的精辟,我的离场条件就是反过来的进场条件。十分感谢,我马上修改。
作者: troyhou    时间: 2010-5-13 09:00:34

如果你有这样的需要,最好自己写段代码在模拟盘上测试看看,自己测试出来的东西是最可信的
作者: 道勤    时间: 2010-5-13 09:04:43

我现在都是拿实盘做的测试,主要是为了与真实环境保持一致。5月10号第一天实盘测试,总体感觉不错,代码也趋于完善。非常感谢各位老师的大力帮忙。如果程序可以稳定运行,准备贴一段时间的交易记录。虽然用的时间不长,总体感觉这个软件还是不错。
作者: troyhou    时间: 2010-5-13 09:20:58

你在哪个公司开的户,我最近打算去找个开通TB的公司开户。
作者: 道勤    时间: 2010-5-13 09:41:24

在新湖期货开的,系统感觉速度挺快。
作者: 道勤    时间: 2010-5-13 10:08:06

遇到一个问题,下面的最后修改的开场语句,只是当Conditions1满足条件时并没有任何动作。
           MyPrice = MinMove*PriceScale*5;
         If ( BarStatus ==0 )
        {
                SetGlobalVar(0,SetPos);        
        }
        
        If ( GetGlobalVar(0)==0  )
        {
                If ( Condition1 /* 开多仓条件满足 */ )
                {
                        A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice()+MyPrice);
                        SetGlobalVar(0,1);
                }
                If ( Condition2 )
                {
                        A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice()-MyPrice);
                        SetGlobalVar(0,-1);
                }
        }

不知道哪里出了问题。我使用的是日内5分钟图,用这个A_sendorder开场和周期有关系吗?

[ 本帖最后由 道勤 于 2010-5-13 10:10 编辑 ]
作者: lh948    时间: 2010-5-13 10:16:18     标题: 回复 26# 道勤 的帖子

和周期没有关系,你commentry出GetGlobalVar(0)看看
作者: troyhou    时间: 2010-5-13 10:34:08

A_SendOrder函数只有成交时才有提示,你看看有没有产生挂单。
作者: 道勤    时间: 2010-5-13 10:52:10

没有挂单,没有任何动作。
If ( BarStatus ==0 )  所取的第一个bar是指当天的第一个bar吗?
作者: lh948    时间: 2010-5-13 11:07:02     标题: 回复 29# 道勤 的帖子

BarStatus ==0是图表上的第一个bar
作者: 道勤    时间: 2010-5-13 11:09:10

如果把k线设定在只显示当日走势,可能会解决这个问题。我下午试验一下。
作者: troyhou    时间: 2010-5-13 11:17:48

这个是图表中第一个Bar,此句用来初始化全局变量。你如果重新编译了代码的话,必须在参数页中将SetPos参数调整为正确的值。




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