186 lines
7.5 KiB
Plaintext
186 lines
7.5 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| TangoLine.mq5 |
|
|
//| Copyright © 2015, fxborg |
|
|
//| http://fxborg-labo.hateblo.jp/ |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright © 2015, fxborg"
|
|
#property link "http://fxborg-labo.hateblo.jp/"
|
|
#property description ""
|
|
//---- íîìåð âåðñèè èíäèêàòîðà
|
|
#property version "1.00"
|
|
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
|
|
#property indicator_chart_window
|
|
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 5
|
|
#property indicator_buffers 5
|
|
//---- èñïîëüçîâàíî âñåãî 3 ãðàôè÷åñêèõ ïîñòðîåíèé
|
|
#property indicator_plots 3
|
|
//+-----------------------------------+
|
|
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà |
|
|
//+-----------------------------------+
|
|
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
|
|
#property indicator_type1 DRAW_LINE
|
|
//---- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí BlueViolet öâåò
|
|
#property indicator_color1 clrBlueViolet
|
|
//---- ëèíèÿ èíäèêàòîðà - ñïëîøíàÿ êðèâàÿ
|
|
#property indicator_style1 STYLE_SOLID
|
|
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
|
|
#property indicator_width1 2
|
|
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
|
|
#property indicator_label1 "TangoLine"
|
|
//+--------------------------------------------+
|
|
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà óðîâíåé |
|
|
//+--------------------------------------------+
|
|
//---- îòðèñîâêà óðîâíåé â âèäå ëèíèé
|
|
#property indicator_type2 DRAW_LINE
|
|
#property indicator_type3 DRAW_LINE
|
|
//---- âûáîð öâåòîâ óðîâíåé
|
|
#property indicator_color2 clrLimeGreen
|
|
#property indicator_color3 clrRed
|
|
//---- óðîâíè - ñïëîøíûå êðèâûå
|
|
#property indicator_style2 STYLE_SOLID
|
|
#property indicator_style3 STYLE_SOLID
|
|
//---- òîëùèíà óðîâíåé ðàâíà 2
|
|
#property indicator_width2 2
|
|
#property indicator_width3 2
|
|
//---- îòîáðàæåíèå ìåòîê óðîâíåé
|
|
#property indicator_label2 "Upper"
|
|
#property indicator_label3 "Lower"
|
|
//+-----------------------------------+
|
|
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà |
|
|
//+-----------------------------------+
|
|
input int InpPeriod=20; // Period
|
|
input double MinSpread=5; // Min Spread
|
|
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
|
|
//+-----------------------------------+
|
|
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
|
|
//---- äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
|
|
double LineBuffer[],HighesBuffer[],LowesBuffer[],HighBuffer[],LowBuffer[];
|
|
//---- îáúÿâëåíèå ïåðåìåííîé çíà÷åíèÿ ìàêñèìàëüíîãî ñïðåäà
|
|
double dMinSpread;
|
|
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
|
|
int min_rates_total;
|
|
//+------------------------------------------------------------------+
|
|
//| Custom indicator initialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnInit()
|
|
{
|
|
//---- èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
|
|
min_rates_total=int(InpPeriod)+3;
|
|
//---- èíèöèàëèçàöèÿ ñäâèãà ïî âåðòèêàëè
|
|
dMinSpread=MinSpread*_Point;
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
|
|
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
|
|
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 1 ïî ãîðèçîíòàëè
|
|
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
|
|
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
|
|
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
|
|
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêèõ ìàññèâîâ â èíäèêàòîðíûå áóôåðû
|
|
SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
|
|
SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
|
|
//---- óñòàíîâêà ïîçèöèè, ñ êîòîðîé íà÷èíàåòñÿ îòðèñîâêà óðîâíåé
|
|
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
|
|
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
|
|
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
|
|
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
|
|
SetIndexBuffer(3,HighesBuffer,INDICATOR_CALCULATIONS);
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
|
|
SetIndexBuffer(4,LowesBuffer,INDICATOR_CALCULATIONS);
|
|
//---- èíèöèàëèçàöèÿ ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
|
|
string shortname;
|
|
StringConcatenate(shortname,"TangoLine(",InpPeriod,", ",MinSpread,", ",Shift,")");
|
|
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
|
|
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
|
|
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
|
|
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
|
//---- çàâåðøåíèå èíèöèàëèçàöèè
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Custom indicator iteration function |
|
|
//+------------------------------------------------------------------+
|
|
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[])
|
|
{
|
|
//---- ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷åòà
|
|
if(rates_total<min_rates_total) return(0);
|
|
//---- îáúÿâëåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé
|
|
double dmin,dmax;
|
|
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ è ïîëó÷åíèå óæå ïîñ÷èòàííûõ áàðîâ
|
|
int first,bar;
|
|
static int top_bar,btm_bar;
|
|
//---- ðàñ÷åò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷åòà áàðîâ
|
|
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
|
|
{
|
|
first=0; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
|
|
top_bar=0;
|
|
btm_bar=0;
|
|
}
|
|
else first=prev_calculated-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà íîâûõ áàðîâ
|
|
//----
|
|
for(bar=first; bar<rates_total && !IsStopped(); bar++)
|
|
{
|
|
LowesBuffer[bar]=0.0;
|
|
HighesBuffer[bar]=0.0;
|
|
HighBuffer[bar]=0.0;
|
|
LowBuffer[bar]=0.0;
|
|
LineBuffer[bar]=0.0;
|
|
}
|
|
//----
|
|
if(prev_calculated>rates_total || prev_calculated<=0) first=min_rates_total;
|
|
//---- îñíîâíîé öèêë ðàñ÷åòà èíäèêàòîðà
|
|
for(bar=first; bar<rates_total && !IsStopped(); bar++)
|
|
{
|
|
//--- calculate range spread
|
|
dmin=1000000.0;
|
|
dmax=-1000000.0;
|
|
for(int kkk=bar-int(InpPeriod)+1; kkk<=bar; kkk++)
|
|
{
|
|
if(dmin>low[kkk]) dmin=low[kkk];
|
|
if(dmax<high[kkk]) dmax=high[kkk];
|
|
}
|
|
//--- hook
|
|
if((LowesBuffer[bar-2]-dMinSpread)>LowesBuffer[bar-1] && LowesBuffer[bar-1]==dmin)
|
|
{
|
|
top_bar=bar-1;
|
|
btm_bar=bar-1;
|
|
}
|
|
if((HighesBuffer[bar-2]+dMinSpread)<HighesBuffer[bar-1] && HighesBuffer[bar-1]==dmax)
|
|
{
|
|
btm_bar=bar-1;
|
|
top_bar=bar-1;
|
|
}
|
|
LowesBuffer[bar]=dmin;
|
|
HighesBuffer[bar]=dmax;
|
|
if(MathMax(top_bar,btm_bar)>bar-int(InpPeriod)+1)
|
|
{
|
|
//--- calculate range spread
|
|
dmin=1000000.0;
|
|
dmax=-1000000.0;
|
|
//---
|
|
for(int kkk=bar-int(InpPeriod)+1; kkk<=bar; kkk++)
|
|
{
|
|
//---
|
|
if(kkk>=btm_bar && dmin>low[kkk]) dmin=low[kkk];
|
|
if(kkk>=top_bar && dmax<high[kkk]) dmax=high[kkk];
|
|
}
|
|
}
|
|
LowBuffer[bar]=dmin;
|
|
HighBuffer[bar]=dmax;
|
|
LineBuffer[bar]=(dmax+dmin)/2;
|
|
}
|
|
//----
|
|
return(rates_total);
|
|
}
|
|
//+------------------------------------------------------------------+
|