//--- 설명
#property description "스크립트는 \"레이블\" 그래픽 개체를 그립니다."
//--- 스크립트 실행 중 입력 매개변수의 표시 창
#property script_show_inputs
//--- 스크립트의 입력 매개변수
input string InpName="Label"; // 레이블 이름
input int InpX=150; // X 축 거리
input int InpY=150; // Y 축 거리
input string InpFont="Arial"; // 글꼴
input int InpFontSize=14; // 글꼴 크기
input color InpColor=clrRed; // 색상
input double InpAngle=0.0; // 경사각(도)
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // 앵커 유형
input bool InpBack=false; // 배경 개체
input bool InpSelection=true; // 이동하려면 강조 표시
input bool InpHidden=true; // 개체 목록에 숨겨짐
input long InpZOrder=0; // 마우스 클릭 우선 순위
//+------------------------------------------------------------------+
//| 텍스트 레이블 생성 |
//+------------------------------------------------------------------+
bool LabelCreate(const long chart_ID=0, // 차트의 ID
const string name="Label", // 레이블 이름
const int sub_window=0, // 하위 창 인덱스
const int x=0, // X 좌표
const int y=0, // Y 좌표
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // 고정하기 위한 차트 모서리
const string text="Label", // 텍스트
const string font="Arial", // 글꼴
const int font_size=10, // 글꼴 크기
const color clr=clrRed, // 색상
const double angle=0.0, // 텍스트 기울기
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // 앵커 유형
const bool back=false, // 배경에
const bool selection=false, // 이동하려면 강조 표시
const bool hidden=true, // 개체 목록에 숨겨짐
const long z_order=0) // 마우스 클릭 우선 순위
{
//--- 오류 값 재설정
ResetLastError();
//--- 텍스트 레이블 생성
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": 텍스트 레이블 생성 실패! Error code = ",GetLastError());
return(false);
}
//--- 레이블 좌표 설정
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- 지정된 점 좌표를 기준으로 차트 모서리 설정
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- 텍스트 설정
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- 텍스트 글꼴 설정
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- 글꼴 크기 설정
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- 텍스트 경사각 설정
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- 앵커 유형 설정
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- 색상 설정
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- 전경(false) 또는 배경(true)에 표시
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- 마우스를 사용하여 레이블 이동 모드 활성화(true) 또는 비활성화(false)
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- 개체 목록에서 그래픽 개체 이름 숨기기(true) 또는 표시(false)
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- 차트에서 마우스 클릭 이벤트 수신 우선 순위 설정
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 실행 성공
return(true);
}
//+------------------------------------------------------------------+
//| 텍스트 레이블 이동 |
//+------------------------------------------------------------------+
bool LabelMove(const long chart_ID=0, // 차트의 ID
const string name="Label", // 레이블 이름
const int x=0, // X 좌표
const int y=0) // Y 좌표
{
//--- 오류 값 재설정
ResetLastError();
//--- 텍스트 레이블 이동
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": 레이블의 X 좌표 이동 실패! Error code = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": 레이블의 Y 좌표 이동 실패! Error code = ",GetLastError());
return(false);
}
//--- 실행 성공
return(true);
}
//+------------------------------------------------------------------+
//| 레이블 바인딩에 대한 차트 모서리 변경 |
//+------------------------------------------------------------------+
bool LabelChangeCorner(const long chart_ID=0, // 차트의 ID
const string name="Label", // 레이블 이름
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // 고정을 위한 차트 모서리
{
//--- 오류 값 재설정
ResetLastError();
//--- 고정 모서리 변경
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
": 고정 모서리 변경 실패! Error code = ",GetLastError());
return(false);
}
//--- 실행 성공
return(true);
}
//+------------------------------------------------------------------+
//| 레이블 텍스트 변경 |
//+------------------------------------------------------------------+
bool LabelTextChange(const long chart_ID=0, // 차트의 ID
const string name="Label", // 개체 이름
const string text="Text") // 텍스트
{
//--- 오류 값 재설정
ResetLastError();
//--- 개체 텍스트 변경
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": 텍스트 변경 실패! Error code = ",GetLastError());
return(false);
}
//--- 실행 성공
return(true);
}
//+------------------------------------------------------------------+
//| 텍스트 레이블 설정 |
//+------------------------------------------------------------------+
bool LabelDelete(const long chart_ID=0, // 차트의 ID
const string name="Label") // 레이블 이름
{
//--- 오류 값 재설정
ResetLastError();
//--- 레이블 삭제
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": 텍스트 레이블 삭제 실패! Error code = ",GetLastError());
return(false);
}
//--- 실행 성공
return(true);
}
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 레이블 좌표를 로컬 변수에 저장
int x=InpX;
int y=InpY;
//--- 차트 창 크기
long x_distance;
long y_distance;
//--- 창 크기 설정
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("차트 너비 가져오기 실패! Error code = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("차트 높이 가져오기 실패! Error code = ",GetLastError());
return;
}
//--- 입력 매개변수의 정확성 확인
if(InpX<0 || InpX>x_distance-1 || InpY<0 || InpY>y_distance-1)
{
Print("오류! 입력 매개변수의 잘못된 값!");
return;
}
//--- 레이블 초기 텍스트를 준비
string text;
StringConcatenate(text,"좌측 상단 모서리: ",x,",",y);
//--- 차트에 텍스트 레이블 생성
if(!LabelCreate(0,InpName,0,InpX,InpY,CORNER_LEFT_UPPER,text,InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- 차트를 다시 그리고 0.5 초 대기
ChartRedraw();
Sleep(500);
//--- 레이블을 이동하는 동시에 텍스트를 변경
//--- 축별 반복 수
int h_steps=(int)(x_distance/2-InpX);
int v_steps=(int)(y_distance/2-InpY);
//--- 아랫쪽으로 레이블 이동
for(int i=0;i<v_steps;i++)
{
//--- 좌표 변경
y+=2;
//--- 레이블 이동 및 텍스트 변경
MoveAndTextChange(x,y,"상단 좌측 모서리: ");
}
//--- 0.5초 지연
Sleep(500);
//--- 우측으로 레이블 이동
for(int i=0;i<h_steps;i++)
{
//--- 좌표 변경
x+=2;
//--- 레이블 이동 및 텍스트 변경
MoveAndTextChange(x,y,"상단 좌측 모서리: ");
}
//--- 0.5초 지연
Sleep(500);
//--- 위쪽으로 레이블 이동
for(int i=0;i<v_steps;i++)
{
//--- 좌표 변경
y-=2;
//--- 레이블 이동 및 텍스트 변경
MoveAndTextChange(x,y,"상단 좌측 모서리: ");
}
//--- 0.5초 지연
Sleep(500);
//--- 좌측으로 레이블 이동
for(int i=0;i<h_steps;i++)
{
//--- 좌표 변경
x-=2;
//--- 레이블 이동 및 텍스트 변경
MoveAndTextChange(x,y,"상단 좌측 모서리: ");
}
//--- 0.5초 지연
Sleep(500);
//--- 이제 고정 모서리를 변경하여 점을 이동합니다
//--- 좌측 하단 모서리로 이동
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_LOWER))
return;
//--- 레이블 텍스트 변경
StringConcatenate(text,"좌측 하단 모서리: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- 차트를 다시 그리고 2 초 대기
ChartRedraw();
Sleep(2000);
//--- 우측 하단 모서리로 이동
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_LOWER))
return;
//--- 레이블 텍스트 변경
StringConcatenate(text,"우측 하단 모서리: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- 차트를 다시 그리고 2 초 대기
ChartRedraw();
Sleep(2000);
//--- 우측 상단 모서리로 이동
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_UPPER))
return;
//--- 레이블 텍스트 변경
StringConcatenate(text,"우측 상단 모서리: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- 차트를 다시 그리고 2 초 대기
ChartRedraw();
Sleep(2000);
//--- 좌측 상단 모서리로 이동
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_UPPER))
return;
//--- 레이블 텍스트 변경
StringConcatenate(text,"좌측 상단 모서리: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- 차트를 다시 그리고 2 초 대기
ChartRedraw();
Sleep(2000);
//--- 레이블 삭제
LabelDelete(0,InpName);
//--- 차트를 다시 그리고 0.5 초 대기
ChartRedraw();
Sleep(500);
//---
}
//+------------------------------------------------------------------+
//| 개체를 이동하고 텍스트를 변경하는 기능 |
//+------------------------------------------------------------------+
bool MoveAndTextChange(const int x,const int y,string text)
{
//--- 레이블 이동
if(!LabelMove(0,InpName,x,y))
return(false);
//--- 레이블 텍스트 변경
StringConcatenate(text,text,x,",",y);
if(!LabelTextChange(0,InpName,text))
return(false);
//--- 스크립트 작업이 강제로 비활성화 되었는지 확인
if(IsStopped())
return(false);
//--- 차트 다시 그리기
ChartRedraw();
// 0.01 초 대기
Sleep(10);
//--- 기능 나가기
return(true);
}
|