MultiSymbolSignals/Include/MultiSymbol/SettingChart.mqh

186 lines
15 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:10:44 +02:00
<EFBFBD><EFBFBD>//--- !2O7L A >A=>2=K< D09;>< 8=48:0B>@0
//#include "..\MultiSymbolPriceDivergence.mq5"
//--- >4:;NG05< A2>8 181;8>B5:8
#include "Checks.mqh"
#include "SetDeleteObjects.mqh"
//+------------------------------------------------------------------+
//| #AB0=>28< A2>9AB20 >:=0 |
//+------------------------------------------------------------------+
void SetSubwindowProperties()
{
//--- >;CG8< =><5@ >:=0 8=48:0B>@0
number_window=ChartWindowFind(0,shortname_indicator);
//--- >;CG8< H8@8=C 8 2KA>BC ?>4>:=0
chart_width=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
chart_height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,number_window);
//--- >;CG8< F5=B@ >:=0 3@0D8:0
chart_wcenter=chart_width/2;
chart_vcenter=chart_height/2;
}
//+------------------------------------------------------------------+
//| #AB0=>28< F25B0 10@>2 B5:CI53> A8<2>;0 |
//+------------------------------------------------------------------+
void SetBarColors()
{
//--- &25B 10@0 225@E, B5=8 8 >:0=B>2:8 B5;0 1KGL59 A25G8
ChartSetInteger(0,CHART_COLOR_CHART_UP,color_bar_up);
//--- &25B B5;0 1KGL59 A25G8
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,color_bar_up);
//--- &25B ;8=88 3@0D8:0 8 O?>=A:8E A25G59 ">468"
ChartSetInteger(0,CHART_COLOR_CHART_LINE,color_bar_up);
//--- A;8 2:;NG5= 42CEF25B=K9 @568<
if(TwoColor)
{
//--- &25B 10@0 2=87, B5=8 8 >:0=B>2:8 B5;0 <54256L59 A25G8
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,color_bar_down);
//--- &25B B5;0 <54256L59 A25G8
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,color_bar_down);
}
//--- A;8 42CEF25B=K9 @568< >B:;NG5=
else
{
//--- &25B 10@0 2=87, B5=8 8 >:0=B>2:8 B5;0 <54256L59 A25G8
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,color_bar_up);
//--- &25B B5;0 <54256L59 A25G8
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,color_bar_up);
}
}
//+------------------------------------------------------------------+
//| >@@5:B8@C5B <0:A8<C</<8=8<C< 3@0D8:0 >B=>A8B5;L=> 2A5E 1CD5@>2 |
//+------------------------------------------------------------------+
void CorrectMaximumMinimumChart()
{
double low[]; // 0AA82 <8=8<C<>2
double high[]; // 0AA82 <0:A8<C<>2
int try =10; // >;-2> ?>?KB>:
int size_array =0; // 07<5@ <0AA820 4;O @8A>20=8O
int visible_bars =0; // >;8G5AB2> 2848<KE 10@>2
int first_visible_bar =0; // ><5@ ?5@2>3> 2848<>3> 10@0
int last_visible_bar =0; // ><5@ ?>A;54=53> 2848<>3> 10@0
double max_price =0.0; // 0:A8<0;L=0O F5=0
double min_price =0.0; // 8=8<0;L=0O F5=0
double offset_max_min =0.0; // BABC? >B <0:A8<C<0/<8=8<C<0 3@0D8:0
//--- 1=C;8< ?>A;54=NN >H81:C
ResetLastError();
//--- >;8G5AB2> 2848<KE 10@>2
visible_bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- ><5@ ?5@2>3> 2848<>3> 10@0
first_visible_bar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
//--- ><5@ ?>A;54=53> 2848<>3> 10@0
last_visible_bar=first_visible_bar-visible_bars;
//--- A;8 5ABL >H81:0, 2K945<
if(GetLastError()!=0)
return;
//--- A;8 7=0G5=85 =5:>@@5:B=>, 8A?@028<
if(last_visible_bar<0)
last_visible_bar=0;
//--- >;CG8< <0:A8<C< 8 <8=8<C< B5:CI53> A8<2>;0 =0 2848<>9 G0AB8 3@0D8:0
for(int i=0; i<try; i++)
if(CopyHigh(Symbol(),Period(),last_visible_bar,visible_bars,high)==visible_bars)
break;
for(int i=0; i<try; i++)
if(CopyLow(Symbol(),Period(),last_visible_bar,visible_bars,low)==visible_bars)
break;
//--- K945<, 5A;8 40==K5 =5 1K;8 ?>;CG5=K
if(ArraySize(high)<=0 || ArraySize(low)<=0)
return;
//--- A;8 40==K5 ?>;CG5=K, B>
// >?@545;8< 2 <0AA820E B5:CI53> A8<2>;0 <0:A8<C< 8 <8=8<C<
else
{
min_price=low[ArrayMinimum(low)];
max_price=high[ArrayMaximum(high)];
}
//--- >;CG8< <0:A8<0;L=CN 8 <8=8<0;L=CN F5=K =0 2A5E F5=>2KE <0AA820E
for(int s=0; s<SYMBOLS; s++)
{
//--- A;8 B0:>3> A8<2>;0 =5B, B> ?5@59B8 : A;54CNI5<C
if(symbols_names[s]==empty_symbol)
continue;
//---
datetime time[]; // 0AA82 2@5<5=8
int number_bars =0; // >;8G5AB2> 10@>2 4;O @0AGQB0
//--- #AB0=>28< =C;52>9 @07<5@ <0AA820<
ArrayResize(high,0);
ArrayResize(low,0);
//--- >;CG8< 2@5<O ?5@2>3> 2848<>3> =0 3@0D8:5 10@0
for(int i=0; i<try; i++)
if(CopyTime(Symbol(),Period(),last_visible_bar,visible_bars,time)==visible_bars)
break;
//--- A;8 40==KE <5=LH5, G5< 2848<KE 10@>2 =0 3@0D8:5, 2K945<
if(ArraySize(time)<visible_bars)
return;
//--- A;8 2@5<O ?5@2>3> "8AB8==>3>" 10@0 1>;LH5, G5<
// 2@5<O ?5@2>3> 2848<>3> 10@0 =0 3@0D8:5, B>
// ?>;CG8< 4>ABC?=>5 :>;8G5AB2> 10@>2 B5:CI53> 2 F8:;5 A8<2>;0
if(limit_time[s]>time[0])
{
//--- >;CG8< @07<5@ <0AA820
size_array=ArraySize(time);
//--- >;CG8< :>;8G5AB2> 10@>2 >B ?5@2>3> 8AB8==>3>
if((number_bars=Bars(Symbol(),Period(),limit_time[s],time[size_array-1]))<=0)
return;
}
//--- =0G5 ?>;CG8< 2848<>5 :>;8G5AB2> 10@>2 =0 3@0D8:5
else
number_bars=visible_bars;
//--- #AB0=>28< 8=45:A0F8N, :0: 2 B09<A5@8OE
ArraySetAsSeries(low,true);
ArraySetAsSeries(high,true);
//--- !:>?8@C5< 40==K5 87 8=48:0B>@=KE 1CD5@>2
// A5 @568<K :@><5 8=8O
if(DrawType!=LINES)
{
ArrayCopy(low,buffer_data[s].low);
ArrayCopy(high,buffer_data[s].high);
}
//--- A;8 2 @568<5 8=8O
else
{
ArrayCopy(low,buffer_data[s].close);
ArrayCopy(high,buffer_data[s].close);
}
//--- >;CG8< @07<5@ <0AA820
size_array=ArraySize(high);
//--- 0?>;=8< ?CABK5 7=0G5=8O,
// GB>1K >=8 =5 CG8BK20;8AL 2 >?@545;5=88 <0:A8<C<0/<8=8<C<0
for(int i=0; i<size_array; i++)
{
if(high[i]==EMPTY_VALUE)
high[i]=max_price;
if(low[i]==EMPTY_VALUE)
low[i]=min_price;
}
//--- ?@545;8< <0:A8<C</<8=8<C< CG8BK20O 8=25@A8N
if(inverse[s])
{
//--- A;8 >H81>: =5B, 70?><=8< 7=0G5=8O
if(ArrayMaximum(high,last_visible_bar,number_bars)>=0 &&
ArrayMinimum(low,last_visible_bar,number_bars)>=0)
{
max_price=fmax(max_price,low[ArrayMaximum(low,last_visible_bar,number_bars)]);
min_price=fmin(min_price,high[ArrayMinimum(high,last_visible_bar,number_bars)]);
}
}
else
{
//--- A;8 >H81>: =5B, 70?><=8< 7=0G5=8O
if(ArrayMinimum(low,last_visible_bar,number_bars)>=0 &&
ArrayMaximum(high,last_visible_bar,number_bars)>=0)
{
min_price=fmin(min_price,low[ArrayMinimum(low,last_visible_bar,number_bars)]);
max_price=fmax(max_price,high[ArrayMaximum(high,last_visible_bar,number_bars)]);
}
}
}
//--- 0AAG8B05< >BABC? (3%) >B 25@E0 8 =870 3@0D8:0
offset_max_min=((max_price-min_price)*3)/100;
//--- :;NG8< @568< D8:A8@>20==>3> <0AHB010 3@0D8:0
ChartSetInteger(0,CHART_SCALEFIX,true);
//--- #AB0=>28< <0:A8<C</<8=8<C<
ChartSetDouble(0,CHART_FIXED_MAX,max_price+offset_max_min);
ChartSetDouble(0,CHART_FIXED_MIN,min_price-offset_max_min);
//--- 1=>28< 3@0D8:
ChartRedraw();
}
//+------------------------------------------------------------------+