//[i]RSI汉译
property indicator_separate_window
property indicator_minimum 0
property indicator_maximum 100
property indicator_buffers 1
property indicator_color1 DodgerBlue
property indicator_level1 30.0
property indicator_level2 70.0
property indicator_levelcolor clrSilver
property indicator_levelstyle STYLE_DOT
//--- input parameters
input int 周期=14; // RSI Period
//--- buffers
double RSI值组[];
double 正和均组[];
double 负和均组[];
//+------------------------------------------------------------------+
//| 初始化 |
//+------------------------------------------------------------------+
int OnInit(void)
{
string 名称;
//--- 用在计算中的两个附加缓存
IndicatorBuffers(3);
SetIndexBuffer(1,正和均组);
SetIndexBuffer(2,负和均组);
//---指标线
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,RSI值组);
//---数据窗口名与指标标签
名称="RSI("+string(周期)+")";
IndicatorShortName(名称);
SetIndexLabel(0,名称);
//---检查
if(周期<2)
{
Print("无效的周期参数= ",周期);
return(INIT_FAILED);
}
//---
SetIndexDrawBegin(0,周期);
//---完成初始化
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 主函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i,pos;
double 差幅;
//---
if(Bars<=周期 || 周期<2)
return(0);
//--- 从0到rates总数计数
ArraySetAsSeries(RSI值组,false);
ArraySetAsSeries(正和均组,false);
ArraySetAsSeries(负和均组,false);
ArraySetAsSeries(close,false);
//---准备计算
pos= prev_calculated-1;
if(pos<=周期)
{
//---首个RSI周期值不计算
RSI值组[0]= 0.0;
正和均组[0]= 0.0;
负和均组[0]= 0.0;
double 正和= 0.0;
double 负和= 0.0;
for(i=1; i<=周期; i++)
{
RSI值组[i]= 0.0;
正和均组[i]= 0.0;
负和均组[i]= 0.0;
差幅= close[i]-close[i-1];
if(差幅>0)
正和 += 差幅;
else
负和 -= 差幅;
}
//---计算首个可见值
正和均组[周期]= 正和/周期;
负和均组[周期]= 负和/周期;
if(负和均组[周期]!= 0.0)
RSI值组[周期]= 100.0-(100.0/(1.0+正和均组[周期]/负和均组[周期]));
else
{
if(正和均组[周期]!=0.0)
RSI值组[周期]= 100.0;
else
RSI值组[周期]= 50.0;
}
//---准备位置数给主循环计算
pos= 周期+1;
}
//---主循环内容
for(i=pos; i<rates_total && !IsStopped(); i++)
{
差幅= close[i]-close[i-1];
正和均组[i]= (正和均组[i-1](周期-1)+(差幅>0.0?差幅:0.0))/周期;
负和均组[i]= (负和均组[i-1](周期-1)+(差幅<0.0?-差幅:0.0))/周期;
if(负和均组[i]!=0.0)
RSI值组[i]= 100.0-100.0/(1+正和均组[i]/负和均组[i]);
else
{
if(正和均组[i]!=0.0)
RSI值组[i]= 100.0;
else
RSI值组[i]= 50.0;
}
}
//---
return(rates_total);
}
//+----------------------------------谢谢点赞--------------------------------+