Indicators Used
0
Views
0
Downloads
0
Favorites
SnakeInBorders
//+------------+-----------------------------------------------------+
//| 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;
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
---