Snake indicator from mt4 to amibroker

#1
HI,
I also found this indicator called snake
//+------------------------------------------------------------------+
//| Snake.mq4 |
//| "ÈÍÄÈÊÀÒÎÐÛ ÄËß ÑÀÌÎÎÁÌÀÍÀ" |
//| Bookkeeper, 2006, [email protected] |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//----
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//----
extern int Snake_HalfCycle=5; // Snake_HalfCycle = 4...10 or other
//----
double Snake_Buffer[];
double Snake_Sum, Snake_Weight, Snake_Sum_Minus, Snake_Sum_Plus;
int Snake_FullCycle;
//----
int init()
{
int draw_begin;
Snake_FullCycle=Snake_HalfCycle*2+1;
draw_begin=Snake_FullCycle+1;
SetIndexDrawBegin(0,draw_begin);
SetIndexBuffer(0,Snake_Buffer);
SetIndexStyle(0,DRAW_LINE);
return(0);
}
//----
int start()
{
int FirstPos, ExtCountedBars=0;
if(Bars<=150) return(0);
if(Snake_HalfCycle<3) Snake_HalfCycle=3;
ExtCountedBars=IndicatorCounted();
if (ExtCountedBars<0) return(-1);
if (ExtCountedBars>0) ExtCountedBars--;
FirstPos=Bars-ExtCountedBars-1;
if(FirstPos>Bars-Snake_HalfCycle-1) FirstPos=Bars-Snake_HalfCycle-1;
Snake(FirstPos);
return(0);
}
//----
void Snake(int Pos)
{
int i;
if(Pos<=Snake_HalfCycle+1) Pos=Snake_HalfCycle+2;
Snake_Buffer[Pos]=SnakeFirstCalc(Pos);
Pos--;
while(Pos>=Snake_HalfCycle)
{
Snake_Buffer[Pos]=SnakeNextCalc(Pos);
Pos--;
}
while(Pos>0)
{
Snake_Buffer[Pos]=SnakeFirstCalc(Pos);
Pos--;
}
if(Pos==0)
Snake_Buffer[0]=iMA(NULL,0,Snake_HalfCycle,0,MODE_LWMA,PRICE_TYPI CAL,0);
return;
}
//----
double SnakePrice(int Shift)
{
return((2*Close[Shift]+High[Shift]+Low[Shift])/4);
}
//----
double SnakeFirstCalc(int Shift)
{
int i, j, w;
Snake_Sum=0.0;
Snake_Weight=0.0;
if(Shift<Snake_HalfCycle)
{
i=0;
w=Shift+Snake_HalfCycle;
while(w>=Shift)
{
i++;
Snake_Sum=Snake_Sum+i*SnakePrice(w);
Snake_Weight=Snake_Weight+i;
w--;
}
while(w>=0)
{
i--;
Snake_Sum=Snake_Sum+i*SnakePrice(w);
Snake_Weight=Snake_Weight+i;
w--;
}
}
else
{
Snake_Sum_Minus=0.0;
Snake_Sum_Plus=0.0;
for(j=Shift-Snake_HalfCycle,i=Shift+Snake_HalfCycle,w=1;
w<= Snake_HalfCycle;
j++,i--,w++)
{
Snake_Sum=Snake_Sum+w*(SnakePrice(i)+SnakePrice(j) );
Snake_Weight=Snake_Weight+2*w;
Snake_Sum_Minus=Snake_Sum_Minus+SnakePrice(i);
Snake_Sum_Plus=Snake_Sum_Plus+SnakePrice(j);
}
Snake_Sum=Snake_Sum+( Snake_HalfCycle+1)*SnakePrice(Shift);
Snake_Weight=Snake_Weight+ Snake_HalfCycle+1;
Snake_Sum_Minus=Snake_Sum_Minus+SnakePrice(Shift);
}
return(Snake_Sum/ Snake_Weight);
}
//----
double SnakeNextCalc(int Shift)
{
Snake_Sum_Plus=Snake_Sum_Plus+SnakePrice(Shift-Snake_HalfCycle);
Snake_Sum=Snake_Sum-Snake_Sum_Minus+Snake_Sum_Plus;
Snake_Sum_Minus=Snake_Sum_Minus-SnakePrice(Shift+Snake_HalfCycle+1)+SnakePrice(Shi ft);
Snake_Sum_Plus=Snake_Sum_Plus-SnakePrice(Shift);
return(Snake_Sum/Snake_Weight);
}
//----


I tried to convert it to AFL but I am nothing the same results. Can somebody check it please?

//+------------------------------------------------------------------+
//| Snake.mq4 |
//| "ÈÍÄÈÊÀÒÎÐÛ ÄËß ÑÀÌÎÎÁÌÀÍÀ" |
//| Bookkeeper, 2006, [email protected] |
//+------------------------------------------------------------------+
Snake_HalfCycle=Param("Snake Half Cycle", 5,3,100,1); // Snake_HalfCycle = 4...10 or other
//----

Snake_Sum=0;
Snake_Weight=0;
Snake_Sum_Minus=0;
Snake_Sum_Plus=0;
Snake_FullCycle=0;
snake_buffer=0;
Bars=BarCount;
//----
function SnakePrice( Shift)
{
return((2*Close[Shift]+High[Shift]+Low[Shift])/4);
}

//----
function SnakeFirstCalc(Shift)
{
Snake_Sum=0.0;
Snake_Weight=0.0;
if(Shift<Snake_HalfCycle)
{
i=0;
w=Shift+Snake_HalfCycle;
while(w>=Shift)
{
i++;
Snake_Sum=Snake_Sum+i*SnakePrice(w);
Snake_Weight=Snake_Weight+i;
w--;
}
while(w>=0)
{
i--;
Snake_Sum=Snake_Sum+i*SnakePrice(w);
Snake_Weight=Snake_Weight+i;
w--;
}
}
else
{
Snake_Sum_Minus=0.0;
Snake_Sum_Plus=0.0;
for(j=Shift-Snake_HalfCycle,i=Shift+Snake_HalfCycle,w=1;
w<= Snake_HalfCycle;
j++,i--,w++)
{
Snake_Sum=Snake_Sum+w*(SnakePrice(i)+SnakePrice(j) );
Snake_Weight=Snake_Weight+2*w;
Snake_Sum_Minus=Snake_Sum_Minus+SnakePrice(i);
Snake_Sum_Plus=Snake_Sum_Plus+SnakePrice(j);
}
Snake_Sum=Snake_Sum+( Snake_HalfCycle+1)*SnakePrice(Shift);
Snake_Weight=Snake_Weight+ Snake_HalfCycle+1;
Snake_Sum_Minus=Snake_Sum_Minus+SnakePrice(Shift);
}
return(Snake_Sum/ Snake_Weight);
}

function SnakeNextCalc(Shift)
{
Snake_Sum_Plus=Snake_Sum_Plus+SnakePrice(Shift-Snake_HalfCycle);
Snake_Sum=Snake_Sum-Snake_Sum_Minus+Snake_Sum_Plus;
Snake_Sum_Minus=Snake_Sum_Minus-SnakePrice(Shift+Snake_HalfCycle+1)+SnakePrice(Shi ft);
Snake_Sum_Plus=Snake_Sum_Plus-SnakePrice(Shift);
return(Snake_Sum/Snake_Weight);
}
//----
procedure Snake(Pos)
{
if(Pos<=Snake_HalfCycle+1) Pos=Snake_HalfCycle+2;
Snake_Buffer[Pos]=SnakeFirstCalc(Pos);
Pos--;
while(Pos>=Snake_HalfCycle)
{
Snake_Buffer[Pos]=SnakeNextCalc(Pos);
Pos--;
}
while(Pos>0)
{
Snake_Buffer[Pos]=SnakeFirstCalc(Pos);
Pos--;
}
if(Pos==0) {
per=Snake_HalfCycle+1;
s=0;
pa=0;
for( i = 0; i < per; i++ )
{
s=s+(snakeprice(i)*(per-i));//
pa=pa+(per-i);
}
Snake_Buffer[0]=(s/pa);
}
}
//----


//----
Snake_FullCycle=Snake_HalfCycle*2+1;
//----
ExtCountedBars=0;
if(Bars>150) {
if(Snake_HalfCycle<3) Snake_HalfCycle=3;
ExtCountedBars=0;
if (ExtCountedBars>0) ExtCountedBars--;
FirstPos=Bars-ExtCountedBars-1;
if(FirstPos>Bars-Snake_HalfCycle-1) FirstPos=Bars-Snake_HalfCycle-1;
Snake(FirstPos);
Plot(Snake_Buffer,"Snake EB",4,1);
}
//----


Thanks
Eki
 

Similar threads