#property description "지표는 다음 사이의 차이에 대한 절대값을 계산합니다"
#property description "별도의 하위 창에 표시하는 시가 및 종가 또는 고가 및 저가"
#property description "히스토그램으로서."
//--- 지표 설정
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- 플롯
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- 매개변수 입력
input bool InpAsSeries=true; // 지표 버퍼의 인덱싱 방향
input bool InpPrices=true; // 계산 가격 (true - 시가,종가; false - 고가,저가)
//--- 지표 버퍼
double ExtBuffer[];
//+------------------------------------------------------------------+
//| 지표 값 계산 |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- 막대 계산을 위한 시작 변수
int start=prev_calculated;
//--- 지표 값이 이전 틱에서 이미 계산된 경우 마지막 막대에서 작업
if(prev_calculated>0)
start--;
//--- 배열의 인덱싱 방향 정의
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- 필요한 경우 인덱싱 방향을 직접 방향으로 교체
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- 지표 값 계산
for(int i=start;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+------------------------------------------------------------------+
//| 사용자 지정 지표 초기화 함수 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 지표 버퍼 바인드
SetIndexBuffer(0,ExtBuffer);
//--- 지표 버퍼에 인덱싱 요소 설정
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- 지표가 얼마로 계산되는지 확인
if(InpPrices)
{
//--- 시가 및 종가
PlotIndexSetString(0,PLOT_LABEL,"BodySize");
//--- 지표 색상 설정
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
}
else
{
//--- 고가 및 저가
PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
//--- 지표 색상 설정
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
}
//---
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[])
{
//--- 플래그 값에 따라 지표를 계산
if(InpPrices)
CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
else
CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- 다음 호출을 위한 prev_calculated의 반환 값
return(rates_total);
}
|