//+------------------------------------------------------------------+
//| DRAW_COLOR_BARS.mq5 |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "DRAW_COLOR_BARS를 시연하기 위한 지표"
#property description "별도의 창에 선택한 심볼의 다른 색상 막대를 그립니다"
#property description "막대의 색상과 너비 및 기호가 임의로 변경됩니다"
#property description "모든 N 틱"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
//--- ColorBars 플롯
#property indicator_label1 "ColorBars"
#property indicator_type1 DRAW_COLOR_BARS
//--- 컬러링 막대에 대한 8가지 색상 정의(특수 배열에 저장됨)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- 매개변수 입력
input int N=5; // 유형을 변경할 틱의 수
input int bars=500; // 표시할 막대의 수
input bool messages=false; // "엑스퍼트 어드바이저" 로그에 미시지 표시
//--- 지표 버퍼
double ColorBarsBuffer1[];
double ColorBarsBuffer2[];
double ColorBarsBuffer3[];
double ColorBarsBuffer4[];
double ColorBarsColors[];
//--- 심볼 이름
string symbol;
int bars_colors;
//--- 색상을 저장하는 배열에는 14개의 요소가 포함됩니다
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
};
//+------------------------------------------------------------------+
//| 사용자 지정 지표 초기화 함수 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 지표 버퍼 맵핑
SetIndexBuffer(0,ColorBarsBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,ColorBarsBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,ColorBarsBuffer3,INDICATOR_DATA);
SetIndexBuffer(3,ColorBarsBuffer4,INDICATOR_DATA);
SetIndexBuffer(4,ColorBarsColors,INDICATOR_COLOR_INDEX);
//---- Number of colors for coloring bars
bars_colors=8; // see a comment to the #property indicator_color1 property
//---
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[])
{
static int ticks=0;
//--- 막대의 스타일, 색상 및 너비를 변경하는 틱의 수
ticks++;
//--- 충분한 수의 틱이 누적된 경우
if(ticks>=N)
{
//--- 마켓 워치 창에서 새 심볼을 선택
symbol=GetRandomSymbolName();
//--- 선 속성 변경
ChangeLineAppearance();
//--- 캔들스틱을 그리는 데 사용되는 색상 변경
ChangeColors(colors,bars_colors);
int tries=0;
//--- 5 번 시도하여 버퍼에 심볼에서 가격을 표시
while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && tries<5)
{
//--- CopyFromSymbolToBuffers() 기능의 호출 카운터
tries++;
}
//--- 틱 카운터를 0으로 재설정
ticks=0;
}
//--- 다음 호출을 위한 prev_calculated의 반환 값
return(rates_total);
}
//+------------------------------------------------------------------+
//| 지표 버퍼에 가격 채우기 |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total,int bar_colors)
{
//--- rates[] 배열에서 시가, 고가, 저가, 종가를 복사합니다
MqlRates rates[];
//--- 시도의 카운터
int attempts=0;
//--- 복사된 분량
int copied=0;
//--- 원하는 심볼에 시계열을 35회 입력
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
}
//--- 충분한 수의 막대를 복사하지 못한 경우
if(copied!=bars)
{
//--- 메시지 문자열 형성
string comm=StringFormat("심볼 %s의 경우 %d 의 요청된 막대 중 %d 만 수신했습니다",
name,
copied,
bars
);
//--- 기본 차트 창의 코멘트에 메시지 표시
Comment(comm);
//--- 메시지 표시
if(messages) Print(comm);
return(false);
}
else
{
//--- 심볼 표시 설정
PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_BARS("+name+")");
}
//--- 빈 값으로 버퍼 초기화
ArrayInitialize(ColorBarsBuffer1,0.0);
ArrayInitialize(ColorBarsBuffer2,0.0);
ArrayInitialize(ColorBarsBuffer3,0.0);
ArrayInitialize(ColorBarsBuffer4,0.0);
//--- 가격을 버퍼에 복사
for(int i=0;i<copied;i++)
{
//--- 버퍼의 적절한 인덱스 계산
int buffer_index=total-copied+i;
//--- 버퍼에 가격 쓰기
ColorBarsBuffer1[buffer_index]=rates[i].open;
ColorBarsBuffer2[buffer_index]=rates[i].high;
ColorBarsBuffer3[buffer_index]=rates[i].low;
ColorBarsBuffer4[buffer_index]=rates[i].close;
//---
ColorBarsColors[buffer_index]=i%bar_colors;
}
return(true);
}
//+------------------------------------------------------------------+
//| 마켓 워치에서 임의로 심볼을 반환 |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
{
//--- 마켓 워치 창에 표시되는 심볼의 수
int symbols=SymbolsTotal(true);
//--- 목록에서 심볼의 포지션 - 0부터 심볼까지의 임의의 숫자
int number=MathRand()%symbols;
//--- 지정된 포지션에 있는 심볼의 이름을 반환
return SymbolName(number,true);
}
//+------------------------------------------------------------------+
//| 지그재그 세그먼트의 색상을 변경 |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- 색상의 수
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
//--- 각 색상 인덱스에 대해 임의로 새 색상 정의
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- 임의 값 가져오기
int number=MathRand();
//--- col[] 배열의 인덱스를 정수 나눗셈의 나머지 항목으로 가져오기
int i=number%size;
//--- 각 인덱스의 색상을 PLOT_LINE_COLOR 속성으로 설정
PlotIndexSetInteger(0, // 그래픽 스타일의 수
PLOT_LINE_COLOR, // 속성 식별자
plot_color_ind, // 색의 인덱스, 색상을 쓰는 곳
cols[i]); // 새 색상
//--- 색상 쓰기
comm=comm+StringFormat("BarColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| 막대의 모양 변경 |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- 막대 속성에 대한 정보 구성을 위한 문자열
string comm="";
//--- 막대의 너비 변경을 위한 블록
int number=MathRand();
//--- 정수 나눗셈의 나머지 너비 가져오기
int width=number%5; // 너비는 0 ~ 4로 설정됩니다
//--- 색상을 PLOT_LINE_WIDTH 속성으로 설정
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- 선 너비 쓰기
comm=comm+"\r\nWidth="+IntegerToString(width);
//--- 심볼 이름 쓰기
comm="\r\n"+symbol+comm;
//--- 설명을 사용하여 차트에 정보 표시
Comment(comm);
}
|