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

标题: 新手的几个疑问,恳请斑竹及各位前辈解惑 [打印本页]

作者: laofu602    时间: 2016-5-16 17:06:37     标题: 新手的几个疑问,恳请斑竹及各位前辈解惑

本帖最后由 laofu602 于 2016-5-16 17:35 编辑

下载了模拟板试了一下,有以下几个疑问:

1、在1分钟K线图中,例如有平仓语句   
      if (C<ma)        Sell(0,C);
交易时间运行时,K线还没走完,最新价下穿ma时就会发出平仓委托,K线走完时收盘价又升上去了,软件提示有信号消失。
加上时间控制条件:
         if (Second>=58 and C<ma)        Sell(0,C);
运行后发现并不在58秒时发委托,而是在下个K线已经开始2~10秒后才会发委托,时间并不固定,实在是莫名其妙。
盘中出现误差还好些,收盘前不能按时发委托,日内单变隔夜单,那就麻烦了。

2、还是上面的例子,在K线图上,大部分收盘价下穿ma的K线,平仓信号都在第二根K线上,还有少部分根本没有平仓信号,不知道是为什么?

例如今天在豆粕1609日线上,加载了日线进行测试,平仓语句如下

if (bartime>0.145945 and bartime<0.150000 and qsz==True and c<ma)        Sell(0,c);

均线ma参数为3,豆粕收盘价2809,ma数据2813.33,比收盘提前了45秒,结果没有发平仓委托。

3、行情不太稳定,经常断线。而且有些品种K线数据有丢失的现象,是模拟行情服务器的问题?如果实盘服务器是这样的话,那就不敢用了。各位老玩家在实盘交易时行情稳定吗?

4、我看到Q函数好像比较快速,结果用Q系列函数运行时,麻烦更大,信号全部消失,连K线图上也没有交易信号了,而且系统不断开仓没有平仓,让人哭笑不得。Q函数到底是干什么用的?


作者: laofu602    时间: 2016-5-16 17:12:13

5、软件除内盘期货外,看不见股票及外盘行情,而且夜盘不能交易,是模拟板的限制吗?
作者: 小米    时间: 2016-5-16 17:28:40

本帖最后由 小米 于 2016-5-16 17:30 编辑

1,是的,使用close的条件是不稳定的,可能导致信号的变化。实际交易中要避免直接使用close做判断条件。
2,没有平仓信号主要在于条件没有满足。。或是根本没有持仓信号。。可以具体分析排查一下
3,模拟行情使用者多压力大,可能偶有延迟或是断线的情况。实盘相对要好很多。
     但如果是本地网络的不稳定 导致的,那实盘也会一样。
4,应该不存在Q函数更快的说法,如果您的本地有此表现,要考虑是不是本地有堵塞导致的K线延迟。
     Q_XXX与A_XXX类数据的属性都是只在最后K线有效,如果用于指令条件的话,只在最后 K线有信号,在历史K线中信号会消失。。
     不建议将Q_XXX与A_xxxx这类函数用于buy,sell指令条件中。。
5,支持外盘交易与股票交易,只有开通了外盘实盘的方可提供外盘行情。股票的行情暂停开放新用户。极速版本支持模拟夜盘交易。
作者: laofu602    时间: 2016-5-16 17:46:18

小米 发表于 2016-5-16 17:28
1,是的,使用close的条件是不稳定的,可能导致信号的变化。实际交易中要避免直接使用close做判断条件。
2 ...

我用的是电信天翼云主机,网络速度肯定没有问题,时间延迟这么多,要么是模拟服务器反应太慢,要么是软件本身有BUG。

交易信号肯定条件是满足的,这我在历史回测中还没有发现有问题,但在实时行情中却多次出现。
作者: laofu602    时间: 2016-5-16 20:10:42

本帖最后由 laofu602 于 2016-5-16 20:16 编辑

这是豆粕1609日线的截图及程序,增加和去掉时间控制代码的结果。
在回测中没有时间控制代码时,上周五就该平仓,增加时间控制条件后,到今天也没有平仓。
麻烦版主看看,问题出在哪里。

[attach]33905[/attach]

[attach]33903[/attach]

[attach]33902[/attach]

[attach]33901[/attach]

[attach]33906[/attach]




作者: laofu602    时间: 2016-5-16 23:30:06

本帖最后由 laofu602 于 2016-5-16 23:34 编辑

今天晚上又仔细观察了一下,感觉软件有BUG。
在使用CLOSE做委托平仓价时,不加时间限制,随着价格穿越均线,软件会发出数次信号消失的提示,但最后K线走完也不会发委托指令;使用时间限制而且要在收盘前很短时间,才会在下一K线开盘后延迟2~10秒发平仓指令。但以最高最低价发的开仓指令会立即发出毫无延迟,这说明行情服务器和网络通畅,是软件本身有BUG。

那么有什么办法可以可以实现收盘前可靠发出平仓指令?
作者: 小米    时间: 2016-5-17 08:48:42

本帖最后由 小米 于 2016-5-17 08:50 编辑
laofu602 发表于 2016-5-16 23:30
今天晚上又仔细观察了一下,感觉软件有BUG。
在使用CLOSE做委托平仓价时,不加时间限制,随着价格穿越均线 ...


这并非BGU,建议您先了解一下软件 与函数的基础后再来编写公式。
如截图看到您的公式是于用在日线图上的,日K线上的time,hour,minute,second等函数值都是为0,
所以不可能满足你所写的时间条件。按你所限的时间条件,只能用于5秒或以下的周期图表上。。
或是改为currenttime来判断吧。。但是currenttime用于交易时,一定要做好分支处理,以防历史K线上的信号消失。

信号有消失或是未按自己的想法来交易,这个也不是软件的bug,可以考虑为您公式代码的“bug”吧。
如此表现肯定没法交易的,建议修改公式代码 。
作者: laofu602    时间: 2016-5-17 09:48:15

你说的分支处理,是不是这个意思,就是做一个条件判断,当前BAR为历史行情时,用close,是实时行情时,用Q_last,等执行完毕后等K线收盘后,又马上切换回用close?

感觉要实现太复杂了。实在不行写两个公式,一个专门用于回测,一个根据回测公式原理,用Q函数写,专门用于实时交易,不过无法在K线图上显示。

能不能麻烦版主老大帮忙写一段代码,思路就是收盘价下穿均线,以收盘价平仓,然后下根K线跌破前K线低点,开空;之后收盘价站上均线,以收盘价平空;然后下根K线突破前K高点,开多。麻烦您了。
作者: laofu602    时间: 2016-5-17 09:54:48

我已经向开户期货公司申请开通TB账户了,在之前也试用了文华,金字塔等,感觉TB编程语言更加灵活强大,能够实现别的软件无法实现的思路,虽然学习起来更困难,今后还请米大多指点。
作者: 小米    时间: 2016-5-17 10:18:50

laofu602 发表于 2016-5-17 09:48
你说的分支处理,是不是这个意思,就是做一个条件判断,当前BAR为历史行情时,用close,是实时行情时,用Q_ ...

是的,分支处理就是实时行情与历史K线分开来处理的,确实较复杂,处理不好还会重复发单。
按你的思路写出来的公式是会有信号消失的可能,根本没法用于交易。
作者: laofu602    时间: 2016-5-17 16:34:30

我感觉TB的编程语言有很多细节部分很重要,但网站下载的手册和软件本身的帮助文档,都讲的太简洁,常常看的一头雾水,只能自己摸索着测试,效率很低下。希望贵公司能编一份详细的编程手册,特别是各个函数的使用例子,以便我们这些半吊子新手快速掌握。不要把我们这些常年搞交易的人,等同于贵公司专门开发软件的技术人员。对你们可能是很常识的东西,对我们却是一道难关。为什么文华那么烂编程语言软件,还能买的那么贵那么火,这就是文华软件从很多方面为客户考虑,知道我们这些人都是些半吊子,编的说明是从我们这些人能理解的角度出发。要知道C++等是专业软件人员的工具,TB仿C语言的风格,对我们这些门外汉来讲,真的是太高大上了,所以一定要有通俗详细的说明,我们才可能基本掌握,否则最后只能忍痛割爱,凑合着用文华之类的二流软件了。
作者: kurt7courtny    时间: 2016-5-17 16:39:09

楼主用那么多的close,很危险的,还是了解一下tb的运行机制先把!
作者: laofu602    时间: 2016-5-17 16:54:05

我搞交易已经20多年了,现在交易策略越来越简单,就是使用K线和均线,其他的各种指标统统扔了。中长线交易中,一个重要的平仓策略就是收盘价跌破均线,以收盘价平仓,而且以周线做交易居多。做日线交易要天天盯盘,人年纪大了受不了,更别说日内了。现在就是想用软件代替人盯盘,所以我很在意CLOSE的作用。
作者: gr_2000002041    时间: 2016-5-17 17:11:02

本帖最后由 gr_2000002041 于 2016-5-17 17:12 编辑

尽量少用函数,容易出错!
作者: laofu602    时间: 2016-5-18 17:03:46

本帖最后由 laofu602 于 2016-5-18 17:21 编辑

昨天编了一段简单的测试代码,思路就是米大说的用分支。

回测部分用CLOSE,交易部分用A 和Q函数,今天盘中用1分钟K线跑了一下程序,结果能准确在收盘前发委托,当K线走完后也能马上显示买卖标志。

现在的问题是,A_SendOrder指令在成交密集的时候(例如刚开盘和收盘前),会多次重复发开仓和平仓单,大概5~10秒后就会停止发单。

我猜测可能是模拟服务器成交回报比较慢,软件检测账户没有持仓,所以不停的发开仓单,平仓单也是同理。后来改成一次全平就没问题了。

有什么办法避免这种情况发生吗?因为实盘交易行情即使成交回报比较快也有可能发生这种情况。

附代码如下,望米大及各位前辈不吝赐教!


作者: laofu602    时间: 2016-5-18 17:04:16

本帖最后由 laofu602 于 2016-5-18 17:11 编辑

Params
    Numeric jxzq(5);
        Numeric jyss(1);
Vars
        Numeric ma;
        Numeric ma1;
        Numeric qc;
        Numeric qh;
        Numeric ql;
        Bool    qsz;
        Bool    qsd;
        Numeric bjsj;
        Numeric bartime;
        Numeric cczt(0);
        
Begin

        ma = Average(c,jxzq);
        PlotNumeric("ma",ma);
        ma1 = Average(c[1],jxzq);
        qc = c[1];
        qh = h[1];
        ql = l[1];
        qsz = qc>ma1;
        qsd = qc<ma1;
        bjsj = 10*FracPart(10000*CurrentTime);

        If(!CallAuctionFilter()) Return;

//------------------------------------------------------        
//历史回测

IF (BarStatus<>2)
{
//做多------------------------------------------------

        if (MarketPosition <>1 and qsd==False and h>qh)
                Buy(1,Max(o,qh));
        
        if (qsz==True and c<ma)
                Sell(0,c);
//放空-------------------------------------------------------

        if (MarketPosition <>-1 and qsz==False and l<ql)
        
                SellShort(1,Min(o,ql));
        
        if (qsd==True and c>ma)                BuyToCover(0,c);
}
//-----------------------------------------------------------
//实时交易        

IF (BarStatus==2)
{
//做多------------------------------------------------
        if (A_BuyPosition==0 and qsd==False and Q_Last>qh)
        
                A_SendOrder(Enum_Buy,Enum_Entry,jyss,Q_AskPrice+MinMove*PriceScale);
               
        if (qsz==True and A_BuyPosition>0 and Q_Last<ma and bjsj>=59 )
        
                A_SendOrder(Enum_Sell,Enum_Exit,0,Q_BidPrice-MinMove*PriceScale);

//放空-------------------------------------------------------
                if (A_SellPosition==0 and qsz==False and Q_Last<ql)
               
                        A_SendOrder(Enum_Sell,Enum_Entry,jyss,Q_BidPrice-MinMove*PriceScale);
               

        if (qsd==True and A_SellPosition>0 and Q_Last>ma and bjsj>=59)
        
                A_SendOrder(Enum_Buy,Enum_Exit,0,Q_AskPrice+MinMove*PriceScale);
}
               
End




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