#define WIDTH 50 // 막대 단위의 직사각형 너비
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 현재 차트 ID를 가져오고 그래픽 객체 이름을 설정합니다.
long chart_id = ChartID();
string obj_name = MQLInfoString(MQL_PROGRAM_NAME)+"_RectLabel";
//--- 두 개의 직사각형 시간 좌표를 얻습니다.
datetime time1 = iTime(_Symbol, _Period, WIDTH);
datetime time2 = iTime(_Symbol, _Period, 0);
if(time1==0 || time2==0)
{
Print("Error getting time ", GetLastError());
return;
}
//--- 직사각형 너비 범위에서 최대 및 최소 가격을 가져옵니다.
double price1 = HighestHigh(_Symbol, _Period, 0, WIDTH);
double price2 = LowestLow(_Symbol, _Period, 0, WIDTH);
if(price1==EMPTY_VALUE || price2==EMPTY_VALUE)
return;
//--- 직사각형 객체 생성
Print("Create a wheat-colored rectangle");
if(!ObjectCreate(chart_id, obj_name, OBJ_RECTANGLE, 0, time1, price1, time2, price2))
{
Print("ObjectCreate() failed. Error ", GetLastError());
return;
}
//--- 직사각형을 원래의 색으로 채웁니다
ObjectSetInteger(chart_id, obj_name, OBJPROP_FILL, true);
ObjectSetInteger(chart_id, obj_name, OBJPROP_BACK, true);
ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clrWheat);
ChartRedraw();
//--- 잠시 기다려서 직사각형을 DodgerBlue 색상으로 채우고 차트를 업데이트합니다
Sleep(1000);
Print("Change color to DodgerBlue");
ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clrDodgerBlue);
ChartRedraw();
//--- 잠시 기다려서 직사각형을 LimeGreen 색상으로 채우고 차트를 업데이트합니다
Sleep(1000);
Print("Change color to LimeGreen");
ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clrLimeGreen);
ChartRedraw();
//--- 잠시 기다려서 직사각형을 OrangeRed 색상으로 채우고 차트를 업데이트합니다
Sleep(1000);
Print("Change color to OrangeRed");
ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clrOrangeRed);
ChartRedraw();
//--- 잠시 기다려서 직사각형을 밀 색상으로 채우고 차트를 업데이트합니다
Sleep(1000);
Print("Reset color to original");
ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clrWheat);
ChartRedraw();
//--- 3초 후 차트에서 객체를 제거합니다.
Sleep(3000);
Print("Delete the rectangle");
ObjectDelete(chart_id, obj_name);
}
//+------------------------------------------------------------------+
//| 지정된 바의 범위에서 최대 High를 반환합니다. |
//+------------------------------------------------------------------+
double HighestHigh(const string symbol, const ENUM_TIMEFRAMES timeframe, const uint start, const uint count)
{
ResetLastError();
int index=iHighest(symbol, timeframe, MODE_HIGH, count, start);
if(index==-1)
{
PrintFormat("%s: iHighest() failed. Error %d",__FUNCTION__, GetLastError());
return(EMPTY_VALUE);
}
GetLastError();
double price=iHigh(symbol, timeframe, index);
if(price==0)
{
PrintFormat("%s: iHigh() failed. Error %d",__FUNCTION__, GetLastError());
return(EMPTY_VALUE);
}
return(price);
}
//+------------------------------------------------------------------+
//| 지정된 바의 범위에서 최소 Low를 반환합니다. |
//+------------------------------------------------------------------+
double LowestLow(const string symbol, const ENUM_TIMEFRAMES timeframe, const uint start, const uint count)
{
ResetLastError();
int index=iLowest(symbol, timeframe, MODE_LOW, count, start);
if(index==-1)
{
PrintFormat("%s: iLowest() failed. Error %d",__FUNCTION__, GetLastError());
return(EMPTY_VALUE);
}
GetLastError();
double price=iLow(symbol, timeframe, index);
if(price==0)
{
PrintFormat("%s: iLow() failed. Error %d",__FUNCTION__, GetLastError());
return(EMPTY_VALUE);
}
return(price);
}
|