这个也是一个辅助的判断系统,做成程序化来交易,结果怎么样呢?这待会再说,我们先来说一下这个系统需要用到的函数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个点,可结果还是不怎么样,要是把这个止损点去掉,结果如下图: