Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
SnakeInBorders_v1
//+------------+-----------------------------------------------------+
//| v.11.09.06 | SnakeInBorders.mq4 |
//+------------+ "ÔÈËÜÒÐÓÉ ÁÀÇÀÐ!" |
//| Êîìïëåêò | Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
//| Snake ðàññ÷èòûâàåò êîðèäîð îòôèëüòðîâàííîãî ðûíêà, îãðàíè÷åííûé |
//| äâóìÿ áîðäþðàìè BorderTop[] è BorderBot[], è ñèãíàëüíóþ Mart[]. |
//| |
//| Âíåøíèå ïåðåìåííûå: |
//| SnakeRange - ïîëóïåðèîä ðàñ÷åòà îñè Snake'à Axis[] - îïòèìàëüíî |
//| = 4; |
//| FilterPeriod - ïåðèîä ôèëüòðàöèè. ( îïòèìàëüíî áîëüøå 13); |
//| MartFiltr - êîýôôèöèåíò ôèëüòðàöèè ðûíêà. ×åì MartFiltr áîëüøå, |
//| òåì óæå êîðèäîð îòôèëüòðîâàííîãî ðûíêà. Êîýôôèöèåíò íàäî |
//| ïîäáèðàòü, ïî óìîë÷àíèþ = 2; |
//| Ó Snake'à äâà ðåæèìà: HardCalc = true - íå ïåðåñ÷èòûâàòü, è |
//| = false - ïåðåñ÷èòûâàòü çíà÷åíèÿ Axis[Pos]...[Pos+SnakeRange+1].|
//| Ïîâåäåíèå ñèãíàëüíîé Mart[] âíóòðè êîðèäîðà: |
//| Ïðè äâèæåíèè ðûíêà ââåðõ - ñèãíàëüíàÿ îòõîäèò îò íèæíåãî |
//| áîðäþðà, ïåðåñåêàåò êîðèäîð è ñëèâàåòñÿ ñ âåðõíèì áîðäþðîì. |
//| Àíàëîãè÷íî, ñ òî÷íîñòüþ äî íàîáîðîò, - ïðè äâèæåíèè ðûíêà âíèç. |
//| Äî òåõ ïîð, ïîêà ðûíîê áóäåò äâèãàòüñÿ íàïðàâëåííî, ñèãíàëüíàÿ |
//| áóäåò "äåðæàòüñÿ" ñîîòâåòñòâóþùåé ãðàíèöû êîðèäîðà. Ïðè ýòîì |
//| óâåëè÷åíèå øèðèíû êîðèäîðà îçíà÷àåò íàïðàâëåííîå äâèæåíèå. Ïðè |
//| êîëåáàíèÿõ ðûíêà êîðèäîð íà÷èíàåò ñóæàòüñÿ. Ñóæåíèåì êîðèäîðà |
//| ñîïðîâîæäàåòñÿ äâèæåíèåì ñèãíàëüíîé îò îäíîé ãðàíèöû ê äðóãîé |
//| âíóòðè êîðèäîðà, ïîñëå äîñòèæåíèÿ ïðîòèâîïîëîæíîé ãðàíèöû - |
//| êîðèäîð íà÷íåò ðàñøèðÿòüñÿ. |
//| Snake ìîæíî èñïîëüçîâàòü êàê ñàìîñòîÿòåëüíî, ñðàâíèâàÿ äâèæåíèå |
//| ñèãíàëüíîé íà ðàçíûõ ÒÔ îäíîâðåìåííî, òàê è äëÿ ïîñòðîåíèÿ |
//| äðóãèõ èíäèêàòîðîâ, èñïîëüçóÿ Mart[] âìåñòî öåíû áàðà. Äëÿ |
//| èíäèêàòîðîâ òèïà MA, OA, AC,.. èñïîëüçîâàòü HardCalc = true, à |
//| äëÿ èíäèêàòîðîâ òèïà ZigZag, Channel,.. - HardCalc = false, à |
//| çíà÷åíèå MartFiltr ïîäáèðàòü îò 3...5. Ïðè ýòîì ìîæíî îòñåèâàòü |
//| èñòèííûå è ëîæíûå âåðøèíû: åñëè âåðøèíà ïðîìåæóòî÷íàÿ, |
//| ñèãíàëüíàÿ Mart[] íå áóäåò ñîâïàäàòü ñ áîðäþðîì. |
//+------------------------------------------------------------------+
#property copyright ""
#property link "yuzefovich@gmail.com"
//----
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Blue
//----
extern int SnakeRange = 2;
extern int FilterPeriod = 24;
extern double MartFiltr = 2;
extern bool HardCalc = true;
//----
double BorderTop[];
double BorderBot[];
double Mart[];
double Axis[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void deinit()
{
Comment("");
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
int draw_begin;
draw_begin=FilterPeriod+SnakeRange+2;
IndicatorBuffers(4);
SetIndexBuffer(0,BorderTop);
SetIndexBuffer(1,BorderBot);
SetIndexBuffer(2,Mart);
SetIndexBuffer(3,Axis);
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE,0,2);
SetIndexDrawBegin(0,draw_begin);
SetIndexDrawBegin(1,draw_begin);
SetIndexDrawBegin(2,draw_begin);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int limit,i;
if(counted_bars<0)
return(-1);
if(Bars<=(FilterPeriod+SnakeRange+2))
return(0);
if(SnakeRange<4)
SnakeRange=4;
if(counted_bars>0)
counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit-=(2*SnakeRange+3);
for(i=limit; i>=0; i--)
MainCalculation(i);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void MainCalculation(int Pos)
{
int v;
MartAxis(Pos);
if(HardCalc==true)
SmoothOverMart2(Pos);
else
SmoothOverMart(Pos);
//----
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void MartAxis(int Pos)
{
int SnakeWeight,i,w,ww,Shift;
double SnakeSum;
Axis[Pos] = iMA(NULL, 0, SnakeRange + 1, 0, MODE_LWMA, PRICE_WEIGHTED, Pos);
for(Shift = Pos + SnakeRange + 2; Shift > Pos; Shift--)
{
SnakeSum=0.0;
SnakeWeight=0;
i = 0;
w = Shift + SnakeRange;
ww= Shift-SnakeRange;
if(ww<Pos)
ww=Pos;
while(w>=Shift)
{
i++;
SnakeSum=SnakeSum+i*SnakePrice(w);
SnakeWeight=SnakeWeight+i;
w--;
}
while(w>=ww)
{
i--;
SnakeSum=SnakeSum+i*SnakePrice(w);
SnakeWeight=SnakeWeight+i;
w--;
}
Axis[Shift]=SnakeSum/SnakeWeight;
}
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double SnakePrice(int Shift)
{
return((2*Close[Shift]+High[Shift]+Low[Shift])/4);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SmoothOverMart(int Pos)
{ // Ïðàâèì èñòîðèþ íà ïîñëåäíèõ Pos...(Pos+SnakeRange+2) áàðàõ
int Shift;
double a,t,b;
for(Shift=Pos+SnakeRange+2; Shift>=Pos; Shift--)
{
t = Axis[ArrayMaximum(Axis, FilterPeriod, Shift)];
b = Axis[ArrayMinimum(Axis, FilterPeriod, Shift)];
a = Axis[Shift];
BorderTop[Shift] = (2*(1 + MartFiltr)*a + (t - b)) / 2 / (1 + MartFiltr);
BorderBot[Shift] = (2*(1 + MartFiltr)*a - (t - b)) / 2 / (1 + MartFiltr);
Mart[Shift]=(2*(2+MartFiltr)*a -(t+b))/2/(1+MartFiltr);
}
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SmoothOverMart2(int Shift)
{ // Íå ïîäïðàâëÿåì èñòîðèþ íà ïîñëåäíèõ áàðàõ
double a,t,b;
t = Axis[ArrayMaximum(Axis, FilterPeriod, Shift)];
b = Axis[ArrayMinimum(Axis, FilterPeriod, Shift)];
a = Axis[Shift];
BorderTop[Shift] = (2*(1 + MartFiltr)*a + (t - b))/2/(1 + MartFiltr);
BorderBot[Shift] = (2*(1 + MartFiltr)*a - (t - b))/2/(1 + MartFiltr);
Mart[Shift]=(2*(2+MartFiltr)*a -(t+b))/2/(1+MartFiltr);
return;
}
//---------------------------------------------------------------------
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
---