#property 설명 "엑스퍼트 어드바이저는 ChartIndicatorAdd() 기능을 사용하여 작업을 시연합니다."
#property 설명 "차트에서 시작한 후 (저널에 오류를 수신하고), 열기"
#property 설명 "엑스퍼트 어드바이저의 속성을 확인하고 올바른 <symbol> 및 <period> 변수를 지정합니다."
#property 설명 "MACD 지표가 차트에 추가됩니다."
//--- 변수 입력
input string symbol="AUDUSD"; // 심볼 이름
input ENUM_TIMEFRAMES period=PERIOD_M12; // 시간 플레임
input int fast_ema_period=12; // 빠른 MACD 주기
input int slow_ema_period=26; // 느린 MACD 주기
input int signal_period=9; // 시그널 주기
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE; // MACD의 가격 유형 calculation
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| 엑스퍼트 초기화 함수 |
//+------------------------------------------------------------------+
int OnInit()
{
//---
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- 차트에 지표를 추가하려고 합니다
if(!AddIndicator())
{
//--- AddIndicator() 기능이 차트에서 지표 추가를 거부했습니다
int answer=MessageBox("차트에 MACD를 추가하시겠습니까?",
"지표를 추가하기 위한 잘못된 심볼 및 시간 프레임",
MB_YESNO // "예" 및 "아니오" 선택 버튼이 표시됩니다
);
//--- 사용자가 여전히 ChartIndicatorAdd()의 잘못된 사용을 주장하는 경우
if(answer==IDYES)
{
//--- 우선, 그것에 대한 저널에 등록할 것입니다
PrintFormat("주의! %s: MACD(%s/%s) 지표를 %s/%s 차트에 추가를 시도. 오류 4114를 수신",
__FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
//--- 지표를 추가할 때 새 하위 창의 번호를 수신
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- 오류 발생 시도를 합니다
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
PrintFormat("MACD 지표를 %d 차트 창에 추가하는 데 실패하였습니다. 오류 코드 %d",
subwindow,GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 엑스퍼트 틱 함수 |
//+------------------------------------------------------------------+
void OnTick()
{
// 엑스퍼트 어드바이저가 아무것도 수행하지 않음
}
//+------------------------------------------------------------------+
//| 차트에서 지표 확인 및 추가 함수 |
//+------------------------------------------------------------------+
bool AddIndicator()
{
//--- 메시지 표시됨
string message;
//--- 지표 심볼과 차트 심볼이 서로 일치하는지 확인
if(symbol!=_Symbol)
{
message="Demo_ChartIndicatorAdd() 기능 사용을 표시:";
message=message+"\r\n";
message=message+"차트의 다른 심볼에 계산된 지표를 추가할 수 없습니다.";
message=message+"\r\n";
message=message+"엑스퍼트 어드바이저의 속성에서 차트 심볼을 지정 - "+_Symbol+".";
Alert(message);
//--- 조기 종료, 지표가 차트에 추가되지 않음
return false;
}
//--- 지표와 차트의 시간 프레임이 서로 일치하는지 확인
if(period!=_Period)
{
message="차트의 다른 시간 프레임에 계산된 지표를 추가할 수 없습니다.";
message=message+"\r\n";
message=message+"엑스퍼트 어드바이저의 속성에서 차트 시간 프레임을 지정 - "+EnumToString(_Period)+".";
Alert(message);
//--- 조기 종료, 지표가 차트에 추가되지 않음
return false;
}
//--- 모든 점검 완료됨, 심볼 및 지표 시간 프레임이 차트에 일치
if(indicator_handle==INVALID_HANDLE)
{
Print(__FUNCTION__," MACD 지표 생성");
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
if(indicator_handle==INVALID_HANDLE)
{
Print("MACD 지표 생성하는 데 실패하였습니다. 오류 코드 ",GetLastError());
}
}
//--- 오류 코드 재설정
ResetLastError();
//--- 차트에 지표 적용
Print(__FUNCTION__," 차트에 MACD 지표 추가");
Print("MACD 에 다음에 생성됨 ",symbol,"/",EnumToString(period));
//--- MACD 지표가 추가되는 새 하위 창의 번호를 수신
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
PrintFormat("MACD 지표를 %d 차트 창에 추가",subwindow);
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
{
PrintFormat("MACD 지표를 %d 차트 창에 추가하는 데 실패하였습니다. 오류 코드 %d",
subwindow,GetLastError());
}
//--- 지표가 성공적으로 추가됨
return(true);
}
|