214 lines
8.4 KiB
Plaintext
214 lines
8.4 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| LSMA_Angle.mq5 |
|
|
//| MrPip |
|
|
//| |
|
|
//| You can use this indicator to measure when the LSMA angle is |
|
|
//| "near zero". AngleTreshold determines when the angle for the |
|
|
//| LSMA is "about zero": This is when the value is between |
|
|
//| [-AngleTreshold, AngleTreshold] (or when the histogram is red). |
|
|
//| LSMAPeriod: LSMA period |
|
|
//| AngleTreshold: The angle value is "about zero" when it is |
|
|
//| between the values [-AngleTreshold, AngleTreshold]. |
|
|
//| StartLSMAShift: The starting point to calculate the |
|
|
//| angle. This is a shift value to the left from the |
|
|
//| observation point. Should be StartEMAShift > EndEMAShift. |
|
|
//| EndLSMAShift: The ending point to calculate the |
|
|
//| angle. This is a shift value to the left from the |
|
|
//| observation point. Should be StartEMAShift > EndEMAShift. |
|
|
//| |
|
|
//| Modified by MrPip from EMAAngle by jpkfox |
|
|
//| Red for down |
|
|
//| Yellow for near zero |
|
|
//| Green for up |
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright © 2005, Robert L. Hill aka MrPip"
|
|
#property link ""
|
|
//---- íîìåð âåðñèè èíäèêàòîðà
|
|
#property version "1.00"
|
|
//---- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå
|
|
#property indicator_separate_window
|
|
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 2
|
|
#property indicator_buffers 2
|
|
//---- èñïîëüçîâàíî âñåãî îäíî ãðàôè÷åñêîå ïîñòðîåíèå
|
|
#property indicator_plots 1
|
|
//+-----------------------------------+
|
|
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà |
|
|
//+-----------------------------------+
|
|
//---- îòðèñîâêà èíäèêàòîðà â âèäå ÷åòûð¸õöâåòíîé ãèñòîãðàììû
|
|
#property indicator_type1 DRAW_COLOR_HISTOGRAM
|
|
//---- â êà÷åñòâå öâåòîâ ÷åòûð¸õöâåòíîé ãèñòîãðàììû èñïîëüçîâàíû
|
|
#property indicator_color1 clrMagenta,clrViolet,clrGray,clrDodgerBlue,clrBlue
|
|
//---- ëèíèÿ èíäèêàòîðà - ñïëîøíàÿ
|
|
#property indicator_style1 STYLE_SOLID
|
|
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
|
|
#property indicator_width1 2
|
|
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
|
|
#property indicator_label1 "LSMA_Angle"
|
|
|
|
//+-----------------------------------+
|
|
//| ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ |
|
|
//+-----------------------------------+
|
|
input uint LSMAPeriod=25;
|
|
input int AngleTreshold=15; // Ïîðîã ñðàáàòûâàíèÿ
|
|
input uint StartLSMAShift=4;
|
|
input uint EndLSMAShift=0;
|
|
//+-----------------------------------+
|
|
double mFactor,dFactor,ShiftDif;
|
|
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
|
|
int min_rates_total;
|
|
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
|
|
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
|
|
double IndBuffer[],ColorIndBuffer[];
|
|
//+------------------------------------------------------------------+
|
|
//| LSMA - Least Squares Moving Average function calculation |
|
|
//+------------------------------------------------------------------+
|
|
double LSMA(int Rperiod,const double &Close[],int shift)
|
|
{
|
|
//----
|
|
int iii;
|
|
double sum;
|
|
int length;
|
|
double lengthvar;
|
|
double tmp;
|
|
double wt;
|
|
//----
|
|
length=Rperiod;
|
|
//----
|
|
sum=0;
|
|
for(iii=length; iii>=1; iii--)
|
|
{
|
|
lengthvar = length+1;
|
|
lengthvar/= 3;
|
|
tmp=(iii-lengthvar)*Close[length-iii+shift];
|
|
sum+=tmp;
|
|
}
|
|
wt=sum*6/(length*(length+1));
|
|
//----
|
|
return(wt);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| LSMA_Angle indicator initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
|
|
min_rates_total=int(MathMax(LSMAPeriod+StartLSMAShift,LSMAPeriod+EndLSMAShift));
|
|
dFactor = 2*3.14159/180.0;
|
|
mFactor = 100000.0;
|
|
string Sym = StringSubstr(Symbol(),3,3);
|
|
if (Sym == "JPY") mFactor = 1000.0;
|
|
ShiftDif = StartLSMAShift-EndLSMAShift;
|
|
mFactor /= ShiftDif;
|
|
|
|
if(EndLSMAShift>=StartLSMAShift)
|
|
{
|
|
Print("Error: EndLSMAShift >= StartLSMAShift");
|
|
return(INIT_FAILED);
|
|
}
|
|
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà IndBuffer â èíäèêàòîðíûé áóôåð
|
|
SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);
|
|
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
|
|
ArraySetAsSeries(IndBuffer,true);
|
|
|
|
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð
|
|
SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX);
|
|
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
|
|
ArraySetAsSeries(ColorIndBuffer,true);
|
|
|
|
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
|
|
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
|
|
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
|
|
|
|
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
|
|
IndicatorSetString(INDICATOR_SHORTNAME,"LSMA_Angle");
|
|
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
|
|
IndicatorSetInteger(INDICATOR_DIGITS,0);
|
|
|
|
//---- êîëè÷åñòâî ãîðèçîíòàëüíûõ óðîâíåé èíäèêàòîðà 9
|
|
IndicatorSetInteger(INDICATOR_LEVELS,2);
|
|
//---- çíà÷åíèÿ ãîðèçîíòàëüíûõ óðîâíåé èíäèêàòîðà
|
|
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,+AngleTreshold);
|
|
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-AngleTreshold);
|
|
//---- â êà÷åñòâå öâåòîâ ëèíèé ãîðèçîíòàëüíûõ óðîâíåé èñïîëüçîâàíû ñåðûé è ðîçîâûé öâåòà
|
|
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrTeal);
|
|
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrTeal);
|
|
//---- â ëèíèè ãîðèçîíòàëüíîãî óðîâíÿ èñïîëüçîâàí êîðîòêèé øòðèõ-ïóíêòèð
|
|
IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASHDOTDOT);
|
|
IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASHDOTDOT);
|
|
|
|
//---- çàâåðøåíèå èíèöèàëèçàöèè
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| LSMA_Angle 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);
|
|
|
|
//---- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ
|
|
int limit,bar,clr;
|
|
double fEndMA,fStartMA,fAngle;
|
|
|
|
//---- ðàñ÷¸ò ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
|
|
if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
|
|
{
|
|
limit=rates_total-1-min_rates_total; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà âñåõ áàðîâ
|
|
}
|
|
else
|
|
{
|
|
limit=rates_total-prev_calculated; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ
|
|
}
|
|
|
|
//---- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ
|
|
ArraySetAsSeries(close,true);
|
|
|
|
//---- Îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
|
|
for(bar=limit; bar>=0 && !IsStopped(); bar--)
|
|
{
|
|
fEndMA=LSMA(LSMAPeriod,close,bar+EndLSMAShift);
|
|
fStartMA=LSMA(LSMAPeriod,close,bar+StartLSMAShift);
|
|
fAngle=mFactor*(fEndMA-fStartMA)/2;
|
|
IndBuffer[bar]=fAngle;
|
|
}
|
|
|
|
if(prev_calculated>rates_total || prev_calculated<=0) limit--;
|
|
//---- Îñíîâíîé öèêë ðàñêðàñêè èíäèêàòîðà
|
|
for(bar=limit; bar>=0 && !IsStopped(); bar--)
|
|
{
|
|
clr=2;
|
|
|
|
if(IndBuffer[bar]>AngleTreshold)
|
|
{
|
|
if(IndBuffer[bar]>IndBuffer[bar+1]) clr=4;
|
|
if(IndBuffer[bar]<IndBuffer[bar+1]) clr=3;
|
|
}
|
|
|
|
if(IndBuffer[bar]<-AngleTreshold)
|
|
{
|
|
if(IndBuffer[bar]<IndBuffer[bar+1]) clr=0;
|
|
if(IndBuffer[bar]>IndBuffer[bar+1]) clr=1;
|
|
}
|
|
|
|
ColorIndBuffer[bar]=clr;
|
|
}
|
|
//----
|
|
return(rates_total);
|
|
}
|
|
//+------------------------------------------------------------------+
|