#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);
}
|