Indicators Used
0
Views
0
Downloads
0
Favorites
p_i_3D_Stochastic
//+---------------------------------------------------------------------+
//| #_i_3D_Stochastic.mq4 |
//| Copyright © 2009, TigraVK |
//| |
//|Èíäèêàòîð îòîáðàæàåò ïîâåäåíèå êëàññè÷åñêîãî ñòîõàñòèêà â |
//|òðåõìåðíîé äèàãðàììå â îñíîâíîì îêíå ãðàôèêà òîðãîâîãî |
//|èíñòðóìåíòà. Ïîñòðî÷íî îòáðàæàþòñÿ ñòîõàñòèêè ñ ïîøàãîâî |
//|óâåëè÷èâàþùèìèñÿ ïåðèîäàìè %K, %D è ïðî÷. ïî æåëàíèþ ïîëüçîâàòåëÿ |
//| ðåçóëüòàòå ïîëó÷àåòñÿ òðåõìåðíàÿ êàðòèíêà ñòîõààñòè÷åñêîãî âååðà |
//|Â äàííîé âåðñèè èíäèêàòîðà âîçìîæíû ðåæèìû îòîáðàæåíèÿ |
//|íàïðàâëåíèÿ äâèæåíèÿ ñòîõàñòè÷åñêîé êðèâîé; |
//|åå àáñîëþòíîãî çíà÷åíèÿ; |
//|åå ñêîðîñòè ðîñòà èëè ñíèæåíèÿ. |
//| |
//|Êîîðäèíàòà Õ íà äèàãðàììå - âðåìÿ â ôîðìàòå ãðàôèêà òîðãîâîãî |
//|èíñòðóìåíòà |
//|Êîîðäèíàòà Y íà äèàãðàììå - ñâåðõó âíèç ïîñëåäîâàòåëüíîå îòîáðàæåíèå |
//|ñòîõàñòèêîâ ñ ðàçëè÷íûìè ïàðàìåòðàìè |
//|Êîîðäèíàòà Z îòðàæåíà ðàçëè÷íûìè öâåòàìè â çàâèñèìîñòè îò ñèòóàöèè |
//|è ïîëîæåíèÿ ñòîõàñòèêà â äàííîé âðåìåííÎé òî÷êå |
//+---------------------------------------------------------------------+
#property copyright "Copyright © 2009, TigraVK"
#property link "tigravk@yandex.ru"
#property indicator_chart_window
#include <stdlib.mqh>
#define ELEMENTS 40 //êîëè÷åñòâî îòîáðàæàåìûõ ñòðîê â äèàãðàììå
extern int IndMode = 1; //îäèí èç òðåõ ðåæèìîâ îòðèñîâêè äèàãðàìì: 0-Íàïðàâëåíèå;1-àáñîëþòíîå çíà÷åíèå;2-áàðîâàÿ ñêîðîñòü èçìåíåíèÿ
extern int Columns=120; //Êîëè÷åñòâî îòîáðàæàåìûõ ñòîëáöîâ äèàãðàììû
extern int Width = 1; //Øèðèíà ñòîëáöà, â áàðàõ
extern int DrawShift = 0; //Ñìåùåíèå íóëåâîãî ñòîëáöà (â áàðàõ) îòíîñèòåëüíî ïðàâîé ãðàíèöû îêíà ãðàôèêà
//ïðèìåíÿåòñÿ â ñëó÷àå âûâîäà äâóõ êîïèé èíäèêàòîðà ñ ðàçíûìè ïàðàìåòðàìè â îäíî îêíî
//äëÿ èñêëþ÷åíèÿ âèçóàëüíûõ ïåðåñå÷åíèé äèàãðàìì
//Íàïðèìåð, äëÿ âûâîäà âòîðîé äèàãðàììû êîððåêòíî áóäåò óñòàíîâèòü DrawShift=Columns+4
//-- Íà÷àëüíûå ïàðàìåòðû ñòîõàñòèêà è èõ ïðèðàùåíèÿ -----------
extern int Kp=3;
extern int Kp_step=3;
extern int Dp=2;
extern int Dp_step = 1;
extern int Slowing = 2;
extern int Slowing_step=1;
extern int Method=MODE_SMA;
extern int Price_field = 0; //0 - Low/High èëè 1 - Close/Close
extern int Mode = MODE_SIGNAL; //MODE_MAIN 0 Îñíîâíàÿ ëèíèÿ; MODE_SIGNAL 1 Ñèãíàëüíàÿ ëèíèÿ
//-------------------------------
#define COLUMNS_DOP 3 //êîë-âî äîïîëíèòåëüíûõ êîëîíîê â ìàññèâå STOCH[][] (òèïà, âû÷èñëèòåëüíûé çàïàñ)
#define HEADER 2 //ìåñòî ïîä çàãîëîâîê (èçìåðÿåòñÿ âûñîòîé ýëåìåòà äèàãðàììû)
#define GAP 0 //ïðîáåë (â áàðàõ) ìåæäó ýëåìåíòàìè äèàãðàììû â ãîðèçîíòàëè
#define GAP_PERCENT 20 //ïðîáåë (â ïðîöåíòàõ îò âûñîòû ýëåìåíòà äèàãðàììû) ìåæäó ýëåìåíòàìè äèàãðàììû â âåðòèêàëè
double STOCH[][ELEMENTS];//ìàññèâ êàðòà äàííûõ ñ äàííûìè âñåõ ñòîõàñòèêîâ
double Top;
double Bottom;
int FreeBars;
string el_name;
string indname="#_i_3D_Stochastic";
datetime tm;
int shift;
bool flag_ok=false;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void prepare_values()
{
if(flag_ok==true) return;
if (Time[Width]==0) return;
tm=Time[0];
ArrayResize(STOCH,Columns+COLUMNS_DOP);
ArrayInitialize(STOCH,0.0);
//ñîçäàåì êâàäðàòèêè
for(int i=0; i<Columns; i++)
CreateShield(el_name+i+"_",Top,Bottom,Width,FreeBars-(Width+GAP)*i,Gray);
flag_ok=true;
}
//+------------------------------------------------------------------+
int init()
{
//tm=Time[0];
flag_ok=false;
shift=DrawShift*(Width+GAP);
Top =WindowPriceMax(0);
Bottom =WindowPriceMin(0);
FreeBars=WindowBarsPerChart()-WindowFirstVisibleBar()-shift;
if(IndMode==0)
{
el_name="RCTDIR";
CreateHeader("Direction",Top,Width,Columns,FreeBars,Yellow);
}
else if(IndMode==1)
{
el_name="RCTABS";
CreateHeader("Absolute",Top,Width,Columns,FreeBars,Yellow);
}
else if(IndMode==2)
{
el_name="RCTACC";
CreateHeader("Acceleration",Top,Width,Columns,FreeBars,Yellow);
}
else
{
el_name="RCT";
CreateHeader("NONE",Top,Width,Columns,FreeBars,Yellow);
}
IndicatorShortName(indname);
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
DeleteIndicatorObject(el_name);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if(!flag_ok) prepare_values();
int i;
int limit;
double top =WindowPriceMax(0);
double bottom =WindowPriceMin(0);
int free_bars =WindowBarsPerChart()-WindowFirstVisibleBar()-shift;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit--;
//int counted_bars=IndicatorCounted();
//limit=Bars-counted_bars;
if(limit>Columns+COLUMNS_DOP) limit=Columns+COLUMNS_DOP;
if(!flag_ok) return;
//Ïðîöåäóðà ïåðåðèñîâêè äèàãðàììû ïðè ñìåíå òåêóùåãî áàðà èëè ðàçìåðîâ ýêðàííîé îáëàñòè ãðàôèêà
if(Top!=top || Bottom!=bottom || FreeBars!=free_bars || tm!=Time[0])
{
Top=top; Bottom=bottom; FreeBars=free_bars; tm=Time[0];
for(i=0; i<Columns; i++)
{
if(MoveShield(el_name+i+"_",Top,Bottom,Width,FreeBars-(Width+GAP)*i)<0)
{
DeleteIndicatorObject(el_name+i+"_");
CreateShield(el_name+i+"_",Top,Bottom,Width,FreeBars-(Width+GAP)*i,Gray);
}
}
MoveHeader(Top,Width,Columns,FreeBars,Yellow);
}
if(limit>=Columns+COLUMNS_DOP) //ïîëíàÿ îòðèñîâêà ïðè çàïóñêå èíäèêàòîðà
{
StochDATA_fill(STOCH,limit,0,0);
if(IndMode==0) StochasticWeerDirection(STOCH,Columns);
else if(IndMode==1) StochasticWeerAbsolute(STOCH, Columns);
else if(IndMode==2) StochasticWeerAcceleration(STOCH, Columns);
}
else if(limit>1 && limit<Columns+COLUMNS_DOP) //ïåðåðèñîâêà ïðè ñìåíå áàðà
{
StochDATA_leftShift(STOCH,Columns+COLUMNS_DOP,limit-1);
StochDATA_fill(STOCH,limit-1,0,0);
if(IndMode==0) StochasticWeerDirection(STOCH,Columns);
else if(IndMode==1) StochasticWeerAbsolute(STOCH, Columns);
else if(IndMode==2) StochasticWeerAcceleration(STOCH, Columns);
}
else //ïåðåðèñîâêà òîëüêî òåêóùåãî áàðà
{
StochDATA_fill(STOCH,limit,0,0);
if(IndMode==0) StochasticWeerDirection(STOCH,limit);
else if(IndMode==1) StochasticWeerAbsolute(STOCH, limit);
else if(IndMode==2) StochasticWeerAcceleration(STOCH, Columns);
}
err("Start: ");
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void StochDATA_fill(double &DATA[][],int recount_columns,int start_columns,int historyBarShift)
{
int i,j;
int kp=Kp;
int dp=Dp;
int sl=Slowing;
for(j=start_columns; j<recount_columns+start_columns; j++)
{
kp=Kp; dp=Dp; sl=Slowing;
for(i=0; i<ELEMENTS; i++)
{
DATA[j][i]=iStochastic(NULL,0,kp,dp,sl,Method,Price_field,Mode,j+historyBarShift);
kp=kp+Kp_step;
dp=dp+Dp_step;
sl=sl+Slowing_step;
}
}
return;
}
//+------------------------------------------------------------------+
void StochDATA_leftShift(double &DATA[][],int columns,int shift_columns_count)
{
int i,j,k;
for(k=1; k<=shift_columns_count; k++)
{
for(j=columns-1; j>0; j--)
{
for(i=0; i<ELEMENTS; i++)
DATA[j][i]=DATA[j-1][i];
}
for(i=0; i<ELEMENTS; i++)
DATA[0][i]=0.0;
}
}
//+------------------------------------------------------------------+
void StochasticWeerDirection(double &DATA[][],int recount_columns)
{
int i,j;
for(j=recount_columns; j>0; j--)
{
for(i=0; i<ELEMENTS; i++)
{
if(DATA[j-1][i]-DATA[j][i]>0.0) ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,LightGreen);
else ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,Red);
}
}
}
//+------------------------------------------------------------------+
void StochasticWeerAbsolute(double &DATA[][],int recount_columns)
{
int i,j;
double s0;
color clr;
for(j=recount_columns; j>0; j--)
{
for(i=0; i<ELEMENTS; i++)
{
if(DATA[j][i]>=50 && DATA[j][i]<80)
{
clr=ColorGradient(DATA[j][i],50,80,1); //çåëåíûé
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,clr);
}
else if(DATA[j][i]>=80 && DATA[j][i]<90)
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,Chocolate);
else if(DATA[j][i]>=90 && DATA[j][i]<=100)
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,Maroon);
else if(DATA[j][i]<50 && DATA[j][i]>=20)
{
clr=ColorGradient(-DATA[j][i],-50,-20,2); //ñèíèé
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,clr);
}
else if(DATA[j][i]<20 && DATA[j][i]>=10)
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,Navy);
else if(DATA[j][i]<10 && DATA[j][i]>=0)
ObjectSet(el_name+DoubleToStr(j-1,0)+"_"+i,OBJPROP_COLOR,Black);
}
}
}
//+------------------------------------------------------------------+
void StochasticWeerAcceleration(double &DATA[][],int columns)
{
int i,j;
color clr;
double max_vel;
double VEL[][ELEMENTS];
ArrayResize(VEL,columns);
//Íàðèñóåì ìàòðèöó ñêîðîñòåé
for(j=columns; j>0; j--)
for(i=0; i<ELEMENTS; i++)
VEL[j-1][i]=DATA[j-1][i]-DATA[j][i];
//çà ïåðèîä Columns ñàìàÿ ñèëüíàÿ àáñîëþòíàÿ áàðîâàÿ ñêîðîñòü
for(i=0; i<ELEMENTS; i++)
{
max_vel=-10000;
for(j=0; j<columns; j++)
max_vel=MathMax(max_vel,MathAbs(VEL[j][i]));
//Ñêîðîñòü âíèç - êðàñíûé ãðàäèåíò; ñêîðîñòü ââåðõ - çåëåíûé
for(j=0; j<columns; j++)
{
if(VEL[j][i]>=0)
{
clr=ColorGradient(VEL[j][i],0,max_vel,1); //çåëåíûé
ObjectSet(el_name+j+"_"+i,OBJPROP_COLOR,clr);
}
else
{
clr=ColorGradient(-VEL[j][i],0,max_vel,0); //êðàñíûé
ObjectSet(el_name+j+"_"+i,OBJPROP_COLOR,clr);
}
}
}
}
//+------------------------------------------------------------------+
color ColorGradient(double current_vol,double min_vol,double max_vol,int maincolor)
{
int R,G,B;
int cur;
if(current_vol<min_vol) current_vol=min_vol;
if(current_vol>max_vol) current_vol=max_vol;
cur=255-255*(current_vol-min_vol)/(max_vol-min_vol);
if(maincolor==0) //RED
{ R=255; G=cur; B=cur; }
else if(maincolor==1) //GREEN
{ R=cur; G=255; B=cur; }
else if(maincolor==2) //BLUE
{ R=cur; G=cur; B=255; }
else {R=0;G=0;B=0;}
G<<=8;
B<<=16;
return(R+G+B);
}
//+------------------------------------------------------------------+
void CreateShield(string name_mask,double top,double bottom,int width,int freebars,color clr)
{
double high,gap,y1,y2;
datetime fut0,fut1;
high=(top-bottom)/(ELEMENTS*1.0);
gap=high*GAP_PERCENT/100.0;
bottom=bottom+gap;
top=top-HEADER*high;
high=(top-bottom)/(ELEMENTS*1.0);
gap=high*GAP_PERCENT/100.0;
high=high-gap;
if(freebars>0)
{
fut0=Time[0]+Period()*freebars*60;
fut1=Time[width]+Period()*freebars*60;
}
else
{
fut0=iTime(NULL,0,-freebars);
fut1=iTime(NULL,0,-freebars+width);
}
y2=top;
for(int i=0; i<ELEMENTS; i++)
{
y1=y2-gap;
y2=y1-high;
ObjectCreate(name_mask+i,OBJ_RECTANGLE,0,fut0,y1,fut1,y2);
ObjectSet(name_mask+i,OBJPROP_COLOR,clr);
}
return;
}
//+------------------------------------------------------------------+
int MoveShield(string name_mask,double top,double bottom,int width,int freebars)
{
double high,gap,y1,y2;
datetime fut0,fut1;
high=(top-bottom)/(ELEMENTS*1.0);
gap=high*GAP_PERCENT/100.0;
bottom=bottom+gap;
top=top-HEADER*high;
high=(top-bottom)/(ELEMENTS*1.0);
gap=high*GAP_PERCENT/100.0;
high=high-gap;
if(freebars>0)
{
fut0=Time[0]+Period()*freebars*60;
fut1=Time[width]+Period()*freebars*60;
}
else
{
fut0=iTime(NULL,0,-freebars);
fut1=iTime(NULL,0,-freebars+width);
}
y2=top;
for(int i=0; i<ELEMENTS; i++)
{
y1=y2-gap;
y2=y1-high;
if(ObjectMove(name_mask+i,0,fut0,y1)==false) return(-1);
ObjectMove(name_mask+i,1,fut1,y2);
}
return(0);
}
//+------------------------------------------------------------------+
void CreateHeader(string text,double top,int width,int columns,int freebars,color clr)
{
datetime time_center;
int allbars;
if(freebars<0) {Print("ERROR CreateHeader: freebars<0"); return;}
allbars=columns*(width+GAP); //ñòîëüêî íóæíî áàðîâ ïîä äèàãðàììó
if(allbars/2<freebars) //öåíòð çàãîëîâêà óìåùàåòñÿ â çîíå çà ãðàôèêîì ñïðàâà
time_center=Time[0]+60*Period()*(freebars-columns*(width+GAP)/2);
else //îòðèñîâêà ÷àñòè÷íî çàõâàòûâàåò èñòîðè÷åñêóþ çîíó
time_center=iTime(NULL,0,allbars/2-freebars);
ObjectCreate(el_name+"_HEAD",OBJ_TEXT,0,time_center,top);
ObjectSetText(el_name+"_HEAD",text,14,"Areal",clr);
return;
}
//+------------------------------------------------------------------+
void MoveHeader(double top,int width,int columns,int freebars,color clr)
{
datetime time_center;
int allbars;
if(freebars<0) {Print("ERROR CreateHeader: freebars<0"); return;}
allbars=columns*(width+GAP); //ñòîëüêî íóæíî áàðîâ ïîä äèàãðàììó
if(allbars/2<freebars) //öåíòð çàãîëîâêà óìåùàåòñÿ â çîíå çà ãðàôèêîì ñïðàâà
time_center=Time[0]+60*Period()*(freebars-columns*(width+GAP)/2);
else //îòðèñîâêà ÷àñòè÷íî çàõâàòûâàåò èñòîðè÷åñêóþ çîíó
time_center=iTime(NULL,0,allbars/2-freebars);
ObjectMove(el_name+"_HEAD",0,time_center,top);
}
//+------------------------------------------------------------------+
void DeleteIndicatorObject(string mask)
{
int obj_total,i,out;
string name;
out=1;
while(out>0)
{
obj_total=ObjectsTotal();
out=0;
for(i=0;i<obj_total;i++)
{
name=ObjectName(i);
if(StringFind(name,mask)>=0) { ObjectDelete(name); out++; }
}
}
}
//+------------------------------------------------------------------+
void err(string name)
{
int err=GetLastError();
if(err!=0) Print(name," ERROR(",err,"): ",ErrorDescription(err));
}
//+------------------------------------------------------------------+
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
---