#property description "RSI 지표 데이터 표시 기준 스크립트"
#property description "시장이 얼마나 자주 열렸는지"
#property description "지정된 시간 간격 동안 과잉구매 및 과잉판매된 영역."
//--- 스크립트를 시작할 때 입력 매개변수 창 표시
#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("지표 핸들 수신 오류. 오류 코드 = %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("지표 값을 복사하는데 실패. 오류 코드 = %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);
}
|