Indicators Used
0
Views
0
Downloads
0
Favorites
extrend_v1
//+------------------------------------------------------------------+
//| ExTrend.mq5 |
//| Copyright © 2006, Alex Sidd (Executer) |
//| mailto:work_st@mail.ru |
//+------------------------------------------------------------------+
//--- àâòîðñòâî èíäèêàòîðà
#property copyright "Copyright © 2006, Alex Sidd (Executer)k"
//--- àâòîðñòâî èíäèêàòîðà
#property link "mailto:work_st@mail.ru"
//--- íîìåð âåðñèè èíäèêàòîðà
#property version "1.01"
//--- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå
#property indicator_separate_window
//--- äëÿ ðàñ÷åòà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî äâà áóôåðà
#property indicator_buffers 2
//--- èñïîëüçîâàíî äâà ãðàôè÷åñêèõ ïîñòðîåíèÿ
#property indicator_plots 2
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 1 |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 1 â âèäå ëèíèè
#property indicator_type1 DRAW_LINE
//--- â êà÷åñòâå öâåòà îñíîâíîé ëèíèè èíäèêàòîðà èñïîëüçîâàí öâåò Lime
#property indicator_color1 clrLime
//--- ëèíèÿ èíäèêàòîðà 1 - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1 STYLE_SOLID
//--- òîëùèíà ëèíèè èíäèêàòîðà 1 ðàâíà 1
#property indicator_width1 1
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label1 "Up Line"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 2 |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 2 â âèäå ëèíèè
#property indicator_type2 DRAW_LINE
//--- â êà÷åñòâå öâåòà ñèãíàëüíîé ëèíèè èíäèêàòîðà èñïîëüçîâàí öâåò Magenta
#property indicator_color2 clrMagenta
//--- ëèíèÿ èíäèêàòîðà 2 - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style2 STYLE_SOLID
//--- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 1
#property indicator_width2 1
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label2 "Down Line"
//+----------------------------------------------+
//| Ïàðàìåòðû îòîáðàæåíèÿ ãîðèçîíòàëüíûõ óðîâíåé |
//+----------------------------------------------+
#property indicator_level1 0.0
#property indicator_levelcolor clrGray
#property indicator_levelstyle STYLE_DASHDOTDOT
//+----------------------------------------------+
//| Îáúÿâëåíèå êîíñòàíò |
//+----------------------------------------------+
#define RESET 0 // Êîíñòàíòà äëÿ âîçâðàòà òåðìèíàëó êîìàíäû íà ïåðåñ÷åò èíäèêàòîðà
//+----------------------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà |
//+----------------------------------------------+
input color UpLineColor=clrTeal; // Öâåò òðåíäà âåðõíèõ ôðàêòàëîâ
input color DnLineColor=clrMagenta; // Öâåò òðåíäà íèæíèõ ôðàêòàëîâ
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+----------------------------------------------+
//--- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå â äàëüíåéøåì
//--- áóäóò èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double UpBuffer[];
double DnBuffer[];
//--- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ äëÿ õåíäëîâ èíäèêàòîðîâ
int FRA_Handle;
//--- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//---
string Up_level_name,Dn_level_name;
double FractUp1,FractUp2,FractDn1,FractDn2;
datetime FTimeUp1,FTimeUp2,FTimeDn1,FTimeDn2,curTime;
//+------------------------------------------------------------------+
//| Ñîçäàíèå òðåíäîâîé ëèíèè |
//+------------------------------------------------------------------+
void CreateTline(long chart_id, // èäåíòèôèêàòîð ãðàôèêà
string name, // èìÿ îáúåêòà
int nwin, // èíäåêñ îêíà
datetime time1, // âðåìÿ 1 öåíîâîãî óðîâíÿ
double price1, // 1 öåíîâîé óðîâåíü
datetime time2, // âðåìÿ 2 öåíîâîãî óðîâíÿ
double price2, // 2 öåíîâîé óðîâåíü
color Color, // öâåò ëèíèè
int style, // ñòèëü ëèíèè
int width, // òîëùèíà ëèíèè
string text) // òåêñò
{
//---
ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2);
ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_id,name,OBJPROP_BACK,false);
ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
ObjectSetInteger(chart_id,name,OBJPROP_RAY,true);
ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
//---
}
//+------------------------------------------------------------------+
//| Ïåðåóñòàíîâêà òðåíäîâîé ëèíèè |
//+------------------------------------------------------------------+
void SetTline(long chart_id, // èäåíòèôèêàòîð ãðàôèêà
string name, // èìÿ îáúåêòà
int nwin, // èíäåêñ îêíà
datetime time1, // âðåìÿ 1 öåíîâîãî óðîâíÿ
double price1, // 1 öåíîâîé óðîâåíü
datetime time2, // âðåìÿ 2 öåíîâîãî óðîâíÿ
double price2, // 2 öåíîâîé óðîâåíü
color Color, // öâåò ëèíèè
int style, // ñòèëü ëèíèè
int width, // òîëùèíà ëèíèè
string text) // òåêñò
{
//---
if(ObjectFind(chart_id,name)==-1) CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text);
else
{
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectMove(chart_id,name,0,time1,price1);
ObjectMove(chart_id,name,1,time2,price2);
ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
}
//---
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
min_rates_total=10;
FractUp1=0.0;
FractUp2=0.0;
FractDn1=0.0;
FractDn2=0.0;
//--- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR
FRA_Handle=iFractals(NULL,0);
if(FRA_Handle==INVALID_HANDLE)
{
Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà iFractals");
return(INIT_FAILED);
}
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà UpBuffer[] â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 1 ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà 1 íà min_rates_total
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(UpBuffer,true);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà DnBuffer[] â èíäèêàòîðíûé áóôåð
SetIndexBuffer(1,DnBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà 2 íà min_rates_total
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(DnBuffer,true);
//--- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
string shortname;
StringConcatenate(shortname,"ExTrend(",Shift,")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,2);
//---
Up_level_name=shortname+" Up_level";
Dn_level_name=shortname+" Dn_level";
if(ObjectFind(0,Up_level_name)==-1) SetTline(0,Up_level_name,0,0,0,0,0,UpLineColor,0,1,Up_level_name);
if(ObjectFind(0,Dn_level_name)==-1) SetTline(0,Dn_level_name,0,0,0,0,0,DnLineColor,0,1,Dn_level_name);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- óäàëÿåì òðåíäîâûå ëèíèè ñ ãðàôèêà
ObjectDelete(0,Up_level_name);
ObjectDelete(0,Dn_level_name);
//---
ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| 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(BarsCalculated(FRA_Handle)<rates_total || rates_total<min_rates_total) return(RESET);
//--- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ
int to_copy,limit;
double UpFr[],DnFr[];
//--- ðàñ÷åòû íåîáõîäèìîãî êîëè÷åñòâà êîïèðóåìûõ äàííûõ
//--- è ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷åòà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
{
to_copy=rates_total; // ðàñ÷åòíîå êîëè÷åñòâî âñåõ êîïèðóåìûõ äàííûõ
limit=rates_total-min_rates_total-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
}
else
{
to_copy=rates_total-prev_calculated+6; // ðàñ÷åòíîå êîëè÷åñòâî òîëüêî íîâûõ êîïèðóåìûõ äàííûõ
limit=rates_total-prev_calculated+2; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà íîâûõ áàðîâ
}
//--- êîïèðóåì âíîâü ïîÿâèâøèåñÿ äàííûå â ìàññèâû UpFr[] è DnFr[]
if(CopyBuffer(FRA_Handle,0,0,to_copy,UpFr)<=0) return(RESET);
if(CopyBuffer(FRA_Handle,1,0,to_copy,DnFr)<=0) return(RESET);
//--- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ
ArraySetAsSeries(UpFr,true);
ArraySetAsSeries(DnFr,true);
ArraySetAsSeries(time,true);
//--- îáíóëåíèå íåèñïîëüçóåìûõ ÿ÷ååê áóôåðîâ
for(int bar=2; bar>=0 && !IsStopped(); bar--)
{
UpBuffer[bar]=EMPTY_VALUE;
DnBuffer[bar]=EMPTY_VALUE;
}
//--- îñíîâíîé öèêë ðàñ÷åòà èíäèêàòîðà
for(int bar=limit; bar>=0 && !IsStopped(); bar--)
{
double negative=0;
double positive=0;
double Fup=UpFr[bar+3];
double Fdn=DnFr[bar+3];
//---
if(Fup && Fup!=EMPTY_VALUE)
{
if(!FractUp1 && !FractUp2)
{
FractUp1 = Fup;
FTimeUp1 = time[bar+3];
}
//---
if(FractUp1 && !FractUp2 && FTimeUp1!=time[bar+3])
{
FractUp2 = Fup;
FTimeUp2 = time[bar+3];
}
//---
if(FractUp1 && FractUp2 && FTimeUp2!=time[bar+3])
{
FractUp1 = FractUp2;
FTimeUp1 = FTimeUp2;
FractUp2 = Fup;
FTimeUp2 = time[bar+3];
}
}
//---
if(Fdn && Fdn!=EMPTY_VALUE)
{
if(!FractDn1 && !FractDn2)
{
FractDn1 = Fdn;
FTimeDn1 = time[bar+3];
}
//---
if(FractDn1 && !FractDn2 && FTimeDn1!=time[bar+3])
{
FractDn2 = Fdn;
FTimeDn2 = time[bar+3];
}
//---
if(FractDn1 && FractDn2 && FTimeDn2!=time[bar+3])
{
FractDn1 = FractDn2;
FTimeDn1 = FTimeDn2;
FractDn2 = Fdn;
FTimeDn2 = time[bar+3];
}
}
//---
if(FractUp1 && FractUp2)
{
SetTline(0,Up_level_name,0,FTimeUp1,FractUp1,FTimeUp2,FractUp2,UpLineColor,0,1,Up_level_name);
double y = double((FTimeUp2 - FTimeUp1) / (240*60.0));
double x = (FractUp2 - FractUp1)*(240.0);
if(!y) y=double(1/(240*60.0));
positive=MathArctan(x/y);
}
//---
if(FractDn1 && FractDn2)
{
SetTline(0,Dn_level_name,0,FTimeDn1,FractDn1,FTimeDn2,FractDn2,DnLineColor,0,1,Dn_level_name);
double a = double((FTimeDn2 - FTimeDn1) / (240*60.0));
double b = (FractDn2 - FractDn1)*(240.0);
if(!a) a=double(1/(240*60.0));
negative=MathArctan(b/a);
}
UpBuffer[bar+3]=positive;
DnBuffer[bar+3]=negative;
}
//---
return(rates_total);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---