//+------------------------------------------------------------------+
//| SR_Cloud.mq5 |
//| Copyright © 2013, HgCl2 |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, HgCl2"
#property link ""
//---- íîìåð âåðñèè èíäèêàòîðà
#property version "1.00"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 2
#property indicator_buffers 2
//---- èñïîëüçîâàíî îäíî ãðàôè÷åñêîå ïîñòðîåíèå
#property indicator_plots 1
//+-----------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà |
//+-----------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå öâåòíîãî îáëàêà
#property indicator_type1 DRAW_FILLING
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí Khaki
#property indicator_color1 clrKhaki
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "SR_Cloud"
//+-----------------------------------+
//| Îáúÿâëåíèå ïåðå÷èñëåíèÿ |
//+-----------------------------------+
enum Applied_price_ //Òèï êîíñòàíòû
{
PRICE_CLOSE_ = 1, //Close
PRICE_OPEN_, //Open
};
//+-----------------------------------+
//| ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ |
//+-----------------------------------+
input double k_std=1.0;
input Applied_price_ Price=PRICE_OPEN_;
//+-----------------------------------+
double m[10000];
double o[10000];
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
int min_rates_total;
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double ExtABuffer[];
double ExtBBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
min_rates_total=2;
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,ExtABuffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(ExtABuffer,true);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(1,ExtBBuffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(ExtBBuffer,true);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
IndicatorSetString(INDICATOR_SHORTNAME,"SR_Cloud("+DoubleToString(k_std,4)+")");
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
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);
//---- Îáúÿâëåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé
static double LastHigh,LastLow;
double g1=0.0,g2=0.0;
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ
int limit,x=0;
//---- ðàñ÷¸ò ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
{
limit=rates_total-min_rates_total-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà âñåõ áàðîâ
for(int bar=rates_total-1; bar>=0 && !IsStopped(); bar--)
{
ExtABuffer[bar]=0.0;
ExtBBuffer[bar]=0.0;
}
LastHigh=0;
LastLow=999999999;
}
else limit=rates_total-prev_calculated; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà òîëüêî íîâûõ áàðîâ
//---- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
if(Price==PRICE_OPEN_) ArraySetAsSeries(Open,true);
else ArraySetAsSeries(Close,true);
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
for(int bar=limit; bar>=0 && !IsStopped(); bar--)
{
LastHigh=MathMax(LastHigh,High[bar+1]);
LastLow=MathMin(LastLow,Low[bar+1]);
MqlDateTime tm0,tm1;
TimeToStruct(Time[bar],tm0);
TimeToStruct(Time[bar+1],tm1);
if(tm0.day!=tm1.day)
{
x++;
if(Price==PRICE_OPEN_) o[x]=Open[bar];
else o[x]=Close[bar];
m[x]=LastHigh-o[x-1];
if(LastHigh-o[x-1]>o[x-1]-LastLow) m[x]=o[x-1]-LastLow;
LastLow=999999999;
LastHigh=0;
if(x>15)
{
double a1 = m[x];
double a2 = m[x-1];
double a3 = m[x-2];
double a4 = m[x-3];
double a5 = m[x-4];
double a6 = m[x-5];
double a7 = m[x-6];
double a8 = m[x-7];
double a9 = m[x-8];
double a10 = m[x-9];
double a11 = m[x-10];
double a12 = m[x-11];
double a13 = m[x-12];
double a14 = m[x-13];
//----
double ax = 0.1111111 * (a1+a2+a3+a4+a5+a6+a7+a8+a9);
double ay = 0.0714285 * (a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14);
//----
double stx=0.1111111 *(( a1-ax) *(a1-ax)+(a2-ax) *(a2-ax)+(a3-ax) *(a3-ax)+
(a4-ax) *(a4-ax)+(a5-ax) *(a5-ax)+(a6-ax) *(a6-ax)+(a7-ax) *(a7-ax)
+(a8-ax) *(a8-ax)+(a9-ax) *(a9-ax));
//----
double sty=0.0714285 *(( a1-ay) *(a1-ay)+(a2-ay) *(a2-ay)+(a3-ay) *(a3-ay)+
(a4-ay) *(a4-ay)+(a5-ay) *(a5-ay)+(a6-ay) *(a6-ay)+(a7-ay) *(a7-ay)
+(a8-ay) *(a8-ay)+(a9-ay) *(a9-ay)+(a10-ay) *(a10-ay)+(a11-ay) *(a11-ay)
+(a12-ay) *(a12-ay)+(a13-ay) *(a13-ay)+(a14-ay) *(a14-ay));
//----
double st1 = ax + k_std * MathPow(stx,0.5);
double st2 = ay + k_std * MathPow(sty,0.5);
double std=st2;
if(st1>st2) std=st1;
g1 = o[x]+std;
g2 = o[x]-std;
}
}
if(x>15)
{
ExtABuffer[bar]=g1;
ExtBBuffer[bar]=g2;
}
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
Comments