#property description "Script based on RSI indicator data displays"
#property description "how often the market was in"
#property description "overbought and oversold areas in the specified time interval."
//--- 启动脚本时显示导入参数的窗口
#property script_show_inputs
//--- 导入参数
input int InpMAPeriod=14; // 移动平均周期
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // 价格类型
input double InpOversoldValue=30.0; // 超卖水平
input double InpOverboughtValue=70.0; // 超买水平
input datetime InpDateStart=D'2012.01.01 00:00'; // 分析开始日期
input datetime InpDateFinish=D'2013.01.01 00:00'; // 分析结束日期
//+------------------------------------------------------------------+
//| 脚本程序开始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // 指标值的数组
int size=0; // 数组大小
//--- 接收RSI指标处理
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- 接收指标处理失败
PrintFormat("Indicator handle receiving error. Error code = %d",GetLastError());
return;
}
//--- 循环中,直到指标计算它的所有值
while(BarsCalculated(rsi_handle)==-1)
{
//--- 如果指标强制完成脚本操作则退出
if(IsStopped())
return;
//--- 暂停允许指标计算它的所有值
Sleep(10);
}
//--- 复制一段时间的指标值
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Failed to copy the indicator values. Error code = %d",GetLastError());
return;
}
//--- 接收数组大小
size=ArraySize(rsi_buff);
//--- 分类数组
ArraySort(rsi_buff);
//--- 找出市场在超卖区域的时间(百分比)
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- 找出市场在超买区域的时间(百分比)
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- 显示数据的字符串形式
string str="From "+TimeToString(InpDateStart,TIME_DATE)+" to "
+TimeToString(InpDateFinish,TIME_DATE)+" the market was:";
string str_ovb="in overbought area "+DoubleToString(ovb,2)+"% of time";
string str_ovs="in oversold area "+DoubleToString(ovs,2)+"% of time";
//--- 在图表上显示数据
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- 重绘图表
ChartRedraw(0);
//--- 暂停
Sleep(10000);
}
//+------------------------------------------------------------------+
//| 在图表左下角显示评论 |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- 创建一个标签
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- 绑定标签到左下角
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- 改变定位点位置
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- X方向定位点的距离
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- Y方向定位点的距离
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- 标签文本
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- 文本颜色
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- 文本大小
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}
|