期货软件TB系统源代码解读系列4-RSI

这个也是一个辅助的判断系统,做成程序化来交易,结果怎么样呢?这待会再说,我们先来说一下这个系统需要用到的函数Average,这是一个求平均函数,跟我们之前看到AverageFC差不多,但也是有点区别的,代码及解说如下:

Params

NumericSeries Price(1);//声明数值型序列参数Price,赋值为1.//

Numeric Length(10);//声明数值型参数Length,赋值为10.//

Vars

Numeric AvgValue;//声明数值型变量AvgValude。//

Begin

AvgValue = Summation(Price, Length) / Length;//这个Summation函数,我们之前已经说过,这边直译就是:求10个周期的平均价格。//

Return AvgValue;//把AvgValue值返回给主函数。//

End

这是一个简单的求平均值的函数,但写完这个函数后,我们可以很方便的调用了,接下来就是RSI的代码了,如下:

Params

Numeric Length(14) ;//声明数值型参数Length,初始值为14.//

Numeric OverSold(30) ;//声明数值型参数OverSold,初始值为30.//

Numeric OverBought(70) ;//声明数值型参数OverBought,初始值为70.//

Vars

NumericSeries NetChgAvg( 0 );//声明数值型序列变量NetChgAvg,赋值0.//

NumericSeries TotChgAvg( 0 );//声明数值型序列变量TotChgAvg,赋值0.//

Numeric SF( 0 );//声明数值型变量SF,赋值0.//

Numeric Change( 0 );//声明数值型变量Change,赋值0.//

Numeric ChgRatio( 0 ) ;//声明数值型变量ChgRatio,赋值0.//

Numeric RSIValue;//声明数值型变量RSIValue。//

Begin

If(CurrentBar <= Length - 1)//假如当前k线数位小于等于14-1,执行花括号语句。//

{

NetChgAvg = ( Close - Close[Length] ) / Length ;//一样的Close[Length],就是从当前K线数位倒推回去14根,则句子意思:NetChgAvg=(当前收盘价-前14根k线的收盘价)/14.//

TotChgAvg = Average( Abs( Close - Close[1] ), Length ) ;//先说这个Abs,意思为返回参数的绝对值,参数绝对值是参数去掉正负号后的数值。所以Abs里边的括号得到数值肯定是正数。Average函数,同样的,就是把参数的绝对值跟周期,返回去求值,再把值给反馈回来就行。语句意思:TotChgAvg的值等于,求当前收盘价-去前一根收盘价的14周期均值。//

}Else//就是第14根k线后的,执行下列语句。//

{

SF = 1/Length;//随周期变化的比重系数SF。//

Change = Close - Close[1] ;//当前k线收盘价-前一根收盘价。//

NetChgAvg = NetChgAvg[1] + SF * ( Change - NetChgAvg[1] ) ;//这回不用改成数学式的表达式了,直译它,NetChgAvg = 前一个NetChgAvg值 + 比重系数SF * (变量Change - 前一个NetChgAvg值。)

TotChgAvg = TotChgAvg[1] + SF * ( Abs( Change ) - TotChgAvg[1] ) ;//同理,直译了,记得英文字符后的[1],意思都是从当前往回推,中括号里的值是根据你的需求改的。//

}

If( TotChgAvg <> 0 )//从上面公式求得的TotChgAvg数值,假如不等于0.//

{

ChgRatio = NetChgAvg / TotChgAvg;//变量ChgRatio值等于变量NetChgAvg值除以变量TotChgAvg值。//

}else//变量TotChgAvg等于0的情况。//

{

ChgRatio = 0 ;//等于0了。//

}

RSIValue = 50 * ( ChgRatio + 1 );//用上面的得到的值,根据这个公式,可以求出RSIValue的值了。//

PlotNumeric("RSI",RSIValue);//线RSI的值为RSIValue。//

PlotNumeric("超买",OverBought);//画出超买线,值为OverBought=70。//

PlotNumeric("超卖",OverSold);//画出超卖线,值为OverSold=30。//

End

了解了这个RSI是如何计算的,我们做成程序化也就简单了,也就是添加进买卖的条件即可,至于效果吗,也就那样了,我只能说超买了还会超买,超卖了还超卖,价格的变动不是一个数据说了算的,这个数据也只是一种辅助判断依据罢了。至于说我根据移动均线,把MACD,KD,RSI当成条件进行判断,这效果如何?明天我再把代码写出来吧。现在先看下这个RSI的程序化代码:

Params

Numeric Length(14) ;

Numeric OverSold(30) ;

Numeric OverBought(70) ;

Numeric StopPoint(45);

    Numeric ProfitPoint(100);

    Numeric StopLossSet(30);

Vars

NumericSeries NetChgAvg( 0 );

NumericSeries TotChgAvg( 0 );

Numeric SF( 0 );

Numeric Change( 0 );

Numeric ChgRatio( 0 ) ;

NumericSeries RSIValue;

NumericSeries HighestAfterEntry;

    NumericSeries LowestAfterEntry;

    Numeric MinPoint;

    Numeric MyEntryPrice;

Numeric myprice;

    Numeric myexitprice;

Begin

If(CurrentBar <= Length - 1)

{

NetChgAvg = ( Close - Close[Length] ) / Length ;

TotChgAvg = Average( Abs( Close - Close[1] ), Length ) ;

}Else

{

SF = 1/Length;

Change = Close - Close[1] ;

NetChgAvg = NetChgAvg[1] + SF * ( Change - NetChgAvg[1] ) ;

TotChgAvg = TotChgAvg[1] + SF * ( Abs( Change ) - TotChgAvg[1] ) ;

}

If( TotChgAvg <> 0 )

{

ChgRatio = NetChgAvg / TotChgAvg;

}else

{

ChgRatio = 0 ;

}

RSIValue = 50 * ( ChgRatio + 1 );

// 集合竞价和小节休息过滤

If(!CallAuctionFilter()) Return;

If(MarketPosition <>1 &&  RSIValue[1] < 30  )

{

Buy(1,Open);

}

If(MarketPosition ==1 && RSIValue[1] > 70)

{

Sell(1,Open);

}

If(MarketPosition <>-1 && RSIValue[1] > 70 )

{

SellShort(1,Open);

}

If(MarketPosition ==-1 && RSIValue[1] < 30)

{

BuyToCover(1,open);

}

If(BarsSinceentry == 0)

{

HighestAfterEntry = Close;

LowestAfterEntry = Close;

If(MarketPosition <> 0)

{

HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice);

LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice);

}

}else

{

HighestAfterEntry = Max(HighestAfterEntry,High);

LowestAfterEntry = Min(LowestAfterEntry,Low);

}

Commentary("HighestAfterEntry="+Text(HighestAfterEntry));

Commentary("LowestAfterEntry="+Text(LowestAfterEntry));

Commentary("MyEntryPrice="+Text(MyEntryPrice));

MinPoint = MinMove*PriceScale;

MyEntryPrice = AvgEntryPrice;

If(MarketPosition==1)

{ if(Low <= MyEntryPrice - StopLossSet*MinPoint)

{

MyExitPrice =  MyEntryPrice - StopLossSet*MinPoint;

Sell(0,MyExitPrice);

}

}else if(MarketPosition==-1)

{

If(High >= MyEntryPrice + StopLossSet*MinPoint)

{

MyExitPrice = MyEntryPrice + StopLossSet*MinPoint;

BuyToCover(0,MyExitPrice);

}

}

End

这个我还是给它添加进了一个限制条件,开仓错了,止损30个点,可结果还是不怎么样,要是把这个止损点去掉,结果如下图:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 虽然我们经常说这些均线啊、MACD啊或KD线等都是庄家忽悠散户的,根本信不了,可我想说的是,你真的把它们做成固定的...
    翊之依阅读 4,826评论 0 4
  • 系列1主要解释的是移动平均线,接下来解释的也是我们常用MACD指标,及用它编写成的程序化交易。 我们...
    翊之依阅读 5,142评论 0 4
  • 这是一个期货爱好者的个人分享,不是专业程序员,各位编码大神看了请不要见笑。 好了话不多说,我直接用求平均值Aver...
    翊之依阅读 8,317评论 5 9
  • 铁瓷盆里刚长出的蒜苗、青葱 屋檐下东倒西歪的空酒瓶子 凋凌的瓦砾 褪皮的墙 那一株久栽的茶树 像极了岁月中的你我...
    粗觉得阅读 2,865评论 0 0
  • 山沟女人 嫁到小山沟 她是男人的影子 没人知道姓名 一天的生活 把太阳变成月亮 有了孩子 他还是男人的影子 洗衣做...
    渭北刀客阅读 7,462评论 1 3