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

标题: 一个待改进的日内模型 [打印本页]

作者: CrewsHe    时间: 2011-7-31 14:00:36     标题: 一个待改进的日内模型

本帖最后由 CrewsHe 于 2011-7-31 14:09 编辑

模型的基本构架来自论坛

日内系统  
1m 收盘平仓 3点滑点,测试用(使用open,未使用Q_A_)
有止损设置,测试未使用
信号基于QQE指标
使用反手功能

待改进,欢迎拍砖

[attach]4874[/attach]
[attach]4876[/attach]
[attach]4875[/attach]


EA及测试
http://dl.dbank.com/c0mrnskzjm#
  1. //------------------------------------------------------------------------
  2. // 简称: qqe
  3. // 名称:   
  4. // 类别: 技术指标  
  5. // 类型: 其它类
  6. // 输出:
  7. //------------------------------------------------------------------------
  8. Params
  9.         Numeric SF(14);                        
  10.         Numeric RSI_Period(34);        
  11.         Numeric rat(4.236);
  12. Vars
  13.         NumericSeries TrLevelSlow(0);        
  14.         NumericSeries AtrRsi(0);        
  15.         NumericSeries MaAtrRsi(0);        
  16.         NumericSeries Rsi(0);
  17.         NumericSeries RsiMa(0);
  18.         Numeric Wilders_Period(0);        
  19.         Numeric dar(0);        
  20.         NumericSeries  smin(0);
  21.         NumericSeries  smax(0);
  22.         NumericSeries p;
  23.         
  24. Begin
  25.         Wilders_Period=RSI_Period * 2 - 1;
  26.         If(BarStatus==0)
  27.         {
  28.                  TrLevelSlow=0;
  29.          AtrRsi=0;
  30.          MaAtrRsi=0;
  31.          Rsi=0;
  32.          RsiMa=0;
  33.                  p=0;
  34.         }
  35.         if(CurrentBar>RSI_Period)
  36.         {
  37.                 Rsi=RSI(RSI_Period);
  38.                 RsiMa=XAverage(Rsi,SF);
  39.                 AtrRsi=Abs(RsiMa[1] - RsiMa);
  40.                 MaAtrRsi=XAverage(AtrRsi,Wilders_Period);
  41.                 dar=XAverage(MaAtrRsi,Wilders_Period) * rat;        
  42.                 smax=RsiMa+dar;
  43.                 smin=RsiMa-dar;

  44.                 p=p[1];

  45.                 if (RsiMa>smax[1]) {p=1; }         
  46.                 if (RsiMa<smin[1]) {p=-1;}

  47.                 if(p>0)
  48.           {
  49.                 if(smin<smin[1])
  50.                         smin=smin[1];
  51.                 TrLevelSlow=smin;
  52.                 if(TrLevelSlow<TrLevelSlow[1])
  53.                         TrLevelSlow=TrLevelSlow[1];
  54.           }
  55.           Else
  56.           {
  57.                 if(smax>smax[1])
  58.                         smax=smax[1];
  59.                 TrLevelSlow=smax;
  60.                 if(TrLevelSlow>TrLevelSlow[1])
  61.                         TrLevelSlow=TrLevelSlow[1];
  62.           }
  63.   Return(RsiMa);
  64.         }
  65.                


  66. End


  67. //------------------------------------------------------------------------
  68. // 编译版本        GS2004.06.12
  69. // 用户版本        2009/02/28 20:14
  70. // 版权所有        fish0451
  71. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  72. //                        每一版本的TrabeBlazer公式修改和重写的权利
  73. //------------------------------------------------------------------------
复制代码

作者: a415260930    时间: 2011-8-1 10:17:38

感觉不错,坐等真相
作者: 双手插口袋    时间: 2011-8-1 12:09:03

趋势震荡通吃?
作者: 读书山林    时间: 2011-8-1 12:48:42

不错的系统,出场很有创意,
作者: tsdaquan    时间: 2011-8-1 21:49:53

qqe怎么编译不能通过,RSI未定义。
作者: tsdaquan    时间: 2011-8-1 22:27:32

本帖最后由 tsdaquan 于 2011-8-1 23:15 编辑

EADAY001中,“QQEFUNBUFF”和“DoPosition”未定义,请教楼主是怎么回事?
作者: 读书山林    时间: 2011-8-2 09:49:48

此系统是在出现信号的bar即开仓,而却没有对下一个bar信号消失的情况作出处理,
如果用信号出现bar进行测试相信很多系统的资金曲线是比较平滑的,因为测试过滤了,失败信号的可能发生的亏损,和交易成本,同时尽可能扩大了正确信号时的进场时间
作者: CrewsHe    时间: 2011-8-2 10:39:11

恩,中间有关于bar信号消失的处理不过没改,交易下单是按照close的点,实际中是不对的。在琢磨怎么样保证信号的稳定,使用QQE是一个思路,但是还有更多的问题,只能是作为一个起点吧。   中间使用的RSI是一个系统函数,论坛里面有的。qqefunbuff也是一个函数。
作者: CrewsHe    时间: 2011-8-2 10:40:31

想吧信号存贮到数据库中作为参考的。希望可以改进信号消失的问题
作者: tsdaquan    时间: 2011-8-2 22:20:49

请问楼主qqefunbuff是什么函数?
作者: 读书山林    时间: 2011-8-3 15:17:38

想吧信号存贮到数据库中作为参考的。希望可以改进信号消失的问题
CrewsHe 发表于 2011-8-2 10:40

把楼主的系统测试并实盘观察了一下,出现了以下问题,行情更新时bar在走但是信号不更新,需要不断刷新数据,才会显示新的信号,不知道实盘中怎么样,可以模拟观察下,策略测试效果挺不错
楼主的策略中涉及的函数楼主都给出了没有给出的论坛中有,rsi需要自己编
作者: CrewsHe    时间: 2011-8-3 21:07:17

开仓信号要用close【1】才能消失这个假信号的问题,用下一个bar的open和close做开仓结果其实不好。残念
作者: 趋势跟踪    时间: 2012-4-15 06:23:01

QQE指标是这个么:


#property copyright "Copyright ?2008 Tim Hyder"
#property link      "mailto:hiachiever@gmail.com"
//----
#define vers    "09.Feb.2008"
#define major   1
#define minor   0
//----
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_color2 Yellow
#property indicator_style2 STYLE_DOT
#property indicator_level1 50
#property indicator_levelcolor Aqua
#property indicator_levelstyle STYLE_DOT
//----

extern int SF=25;
extern int AlertLevel=50;


string NOTESETTINGS=" --- INDICATOR SETTINGS ---";
string NOTEALERTS=" --- Alerts ---";
string SoundAlertFile="alert.wav";
bool MsgAlerts=false;
bool SoundAlerts=false;
bool eMailAlerts=false;
//----
int RSI_Period=14;
int Wilders_Period;
int StartBar, LastAlertBar;
datetime LastAlertTime;
double TrLevelSlow[];
double AtrRsi[];
double MaAtrRsi[];
double Rsi[];
double RsiMa[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   Wilders_Period=RSI_Period * 2 - 1;
   if (Wilders_Period < SF)
      StartBar=SF;
   else
      StartBar=Wilders_Period;
//----
   IndicatorBuffers(6);
   SetIndexBuffer(0, RsiMa);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0, "Value 1");
   SetIndexDrawBegin(0, StartBar);
   SetIndexStyle(1, DRAW_LINE, STYLE_DOT);
   SetIndexBuffer(1, TrLevelSlow);
   SetIndexLabel(1, "Value 2");
   SetIndexDrawBegin(1, StartBar);
   SetIndexBuffer(2, AtrRsi);
   SetIndexBuffer(3, MaAtrRsi);
   SetIndexBuffer(4, Rsi);
   IndicatorShortName(StringConcatenate("QQE(", SF, ")"));
//----
   LastAlertBar=Bars-1;
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int counted, i;
   double rsi0, rsi1, dar, tr, dv;
//----
   if(Bars<=StartBar)
      return(0);
//----     
   counted=IndicatorCounted();
   if(counted < 1)
      for(i=Bars - StartBar; i < Bars; i++)
        {
         TrLevelSlow[i]=0.0;
         AtrRsi[i]=0.0;
         MaAtrRsi[i]=0.0;
         Rsi[i]=0.0;
         RsiMa[i]=0.0;
        }
   counted=Bars - counted - 1;
//----
   for(i=counted; i>=0; i--)
      Rsi[i]=iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i);
   for(i=counted; i>=0; i--)
     {
      RsiMa[i]=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);
      AtrRsi[i]=MathAbs(RsiMa[i + 1] - RsiMa[i]);
     }
   for(i=counted; i>=0; i--)
      MaAtrRsi[i]=iMAOnArray(AtrRsi, 0, Wilders_Period, 0, MODE_EMA, i);
//----
   i=counted + 1;
   tr=TrLevelSlow[i];
   rsi1=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);
   while(i > 0)
     {
      i--;
      rsi0=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);
      dar=iMAOnArray(MaAtrRsi, 0, Wilders_Period, 0, MODE_EMA, i) * 4.236;
      dv=tr;
      if (rsi0 < tr)
        {
         tr=rsi0 + dar;
         if (rsi1 < dv)
            if (tr > dv)
               tr=dv;
        }
      else if (rsi0 > tr)
           {
            tr=rsi0 - dar;
            if (rsi1 > dv)
               if (tr < dv)
                  tr=dv;
           }
      TrLevelSlow[i]=tr;
      rsi1=rsi0;
     }
   if ((RsiMa[i+1]<AlertLevel && RsiMa[i]>AlertLevel) ||(RsiMa[i+1]>AlertLevel && RsiMa[i]<AlertLevel) )
     {
      string base=Symbol()+ ", TF: " + TF2Str(Period());
      string Subj=base + ", " + AlertLevel + " level Cross Up";
      if (RsiMa[i+1]>AlertLevel && RsiMa[i]<AlertLevel) Subj=base + " " +  AlertLevel + " level Cross Down";
      string Msg=Subj + " @ " + TimeToStr(TimeLocal(),TIME_SECONDS);
      if (Bars>LastAlertBar)
        {
         LastAlertBar=Bars;
         DoAlerts(Msg,Subj);
        }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DoAlerts(string msgText,string eMailSub)
  {
   if (MsgAlerts) Alert(msgText);
   if (SoundAlerts)  PlaySound(SoundAlertFile);
   if (eMailAlerts) SendMail(eMailSub, msgText);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string TF2Str(int period)
  {
   switch(period)
     {
      case PERIOD_M1: return("M1");
      case PERIOD_M5: return("M5");
      case PERIOD_M15: return("M15");
      case PERIOD_M30: return("M30");
      case PERIOD_H1: return("H1");
      case PERIOD_H4: return("H4");
      case PERIOD_D1: return("D1");
      case PERIOD_W1: return("W1");
      case PERIOD_MN1: return("MN");
     }
   return(Period());
  }
//+------------------------------------------------------------------+

作者: CrewsHe    时间: 2012-4-15 09:53:40

趋势跟踪 发表于 2012-4-15 06:23
QQE指标是这个么:

是一样的东西
作者: liq77    时间: 2012-4-15 10:26:30

楼主能介绍一下模型原理吗?参数太多,自由度太高的系统没法持续获利的。。。
作者: ggyyff    时间: 2012-4-15 10:58:11

mark
作者: wykycdn    时间: 2012-4-15 11:03:54

mark!
作者: 天崖    时间: 2012-4-15 11:33:34

楼主可否把模型源码贴上来,让管理员及高手帮助你修改完善优化一下~~~~~~~~~~~~~~~~~
作者: CrewsHe    时间: 2012-4-15 13:32:34

这个模型后来没改了,频率太高,TB盘中有时候堵数据,就放弃了。这个模型的源码上面都有了。
现在琢磨的是15m和5m模型,效果不错,就是对下单处理还有些问题。


作者: CrewsHe    时间: 2012-4-15 13:41:18

liq77 发表于 2012-4-15 10:26
楼主能介绍一下模型原理吗?参数太多,自由度太高的系统没法持续获利的。。。 ...

系数多是因为加入了不同的指标,虽然用默认参数效果也还可以,不过想看看优化结果的。
最近的同样也使用了多个参数,唯一的欣慰是,参数的稳定性还不错,想法是跑优化结果,最后数据结果取收益中值部分的参数。以后随着行情和品种的变化进行调整。[attach]8852[/attach][attach]8852[/attach]  这个是9000参数的收益的直方图,最后跑的值取中值部分的数值。
系统的效果还好,9000个测试正收益参数8930个左右。
作者: 天崖    时间: 2012-4-15 16:02:45

请问,用的是TB?还是金字塔?《直方图》是在哪个交易平台测试的啊?????
作者: CrewsHe    时间: 2012-4-15 16:53:12

excel
作者: tonyb2    时间: 2012-6-23 22:40:28

谢谢提供
作者: 夏虫    时间: 2012-6-25 13:14:13

tsdaquan 发表于 2011-8-1 21:49
qqe怎么编译不能通过,RSI未定义。

同问。。
作者: 夏虫    时间: 2012-6-25 13:42:24

为什么这个运行出来的RsiMa值永远都是34啊。。好奇怪
作者: zzzlondon    时间: 2012-6-25 14:42:54

我怎么测试不出楼主的结果,是RsiMa大于前一个就进场做多吗
作者: 高少游    时间: 2012-6-27 15:14:46


作者: heqilonghmily    时间: 2012-7-11 11:01:35

同楼上所问qqefunbuff 函数代码可以分享吗 不知道是什么函数 哪里可以查到
作者: heqilonghmily    时间: 2012-7-11 11:11:44

DoPosition 没有被声明 请问楼主??
作者: stewen.net    时间: 2012-7-14 11:04:56

楼主要是能把模型设计思路贴出来就更好了,这样才便于大家一块来分析优化
作者: jiangbingok1    时间: 2012-12-1 23:42:29

这个直方图是TB里有功能吗,怎么没有看到?
作者: jun_lin76    时间: 2013-4-30 11:32:49

mark!
作者: jixieshi    时间: 2013-8-30 09:14:32

细节,学习了!
作者: chairmin    时间: 2013-9-1 04:56:16

学习了!

作者: superwin    时间: 2013-9-5 07:40:20

不错的思路,学习了
作者: alley_007    时间: 2013-9-7 09:18:13

引用了实时bar数据,会产生信号消失,怎么解决?
作者: evalisseyuan    时间: 2014-1-4 15:19:22

明显偷价。
...
//开仓条件
bc=CrossOver(m1,m2) And b1;
sc=CrossUnder(m1,m2) And b1;
....
if(BarStatus==2)        tradePrice= Q_AskPrice +splitDot; Else tradePrice=Open+splitDot;        
If(Buy(maxLots,tradePrice))
...

这个写法就在回测时的逻辑就是:当根K线收盘价出现信号,再用当根K线开盘价买。可能么?



作者: nh_03600023    时间: 2014-1-11 23:50:00

http://bbs.tb18.net/thread-29920-2-1.html
作者: win5ms    时间: 2016-9-13 12:26:18

出错的




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