Converting old custom indicators to new MQL4 language. - I need help pls

 

I need help with the fisher indicator. i tired to convert to the new MQL4 but doesnt seem to work. Im a newbie in programming but giving a shot at it. Can anyone pls hlep with it? This is what i did so far. but yet it s giving me errors.


#property  indicator_separate_window

#property  indicator_buffers 3

#property  indicator_color1  Black

#property  indicator_color2  Lime

#property  indicator_color3  Red

 

extern int period=10;



double         ExtBuffer0[];

double         ExtBuffer1[];

double         ExtBuffer2[];





int OnInit()

  {

   

   

   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);

   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);

   SetIndexStyle(2,DRAW_HISTOGRAM);

   IndicatorDigits(Digits+1);



   SetIndexBuffer(0,ExtBuffer0);

   SetIndexBuffer(1,ExtBuffer1);

   SetIndexBuffer(2,ExtBuffer2);



   IndicatorShortName("Fisher");

   SetIndexLabel(1,NULL);

   SetIndexLabel(2,NULL);



   return(0);

  }





int OnCalculate()

  {

   //int     period=10;

   int    limit;

   int    counted_bars=IndicatorCounted();

   double prev,current,old;

   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;

   double price;

   double MinL=0;

   double MaxH=0;  

   



   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;





   for(int i=0; i<limit; i++)

    {  MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)];

       MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)];

      price = (High[i]+Low[i])/2;

      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     

      Value=MathMin(MathMax(Value,-0.999),0.999); 

      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;

      Value1=Value;

      Fish1=ExtBuffer0[i];

      

    }





   bool up=true;

   for(i=limit-2; i>=0; i--)

     {

      current=ExtBuffer0[i];

      prev=ExtBuffer0[i+1];

           

      if (((current<0)&&(prev>0))||(current<0))   up= false;    

      if (((current>0)&&(prev<0))||(current>0))   up= true;

      

      if(!up)

        {

         ExtBuffer2[i]=current;

         ExtBuffer1[i]=0.0;

        }

        

       else

         {

          ExtBuffer1[i]=current;

          ExtBuffer2[i]=0.0;

         }

     }



   return(0);

  }

Error message:

Files:
Error.JPG  44 kb
 

Forum on trading, automated trading systems and testing trading strategies

When you post code please use the CODE button (Alt-S)!

Use the CODE button

 

@PipiBrasci

i suggest that you search the documents pages for OnCalculate

 
Sergey Golubev

Oh okay. Thanks for the response, Can you be pf help to me pls. i know nothing about programming but just trying to see if I can tweek something out. As i  am also trying to create custom arrows on Eabuilder it kept saying it doesnt support the old ex.4 that there is a new MQL4 language and can only work if the custom indicator is updated to the MQL4 language. That's my dilema at the moment. how to convert the old ex.4 files into the new MQL4 language 600.
 
Revo Trades:

@PipiBrasci

i suggest that you search the documents pages for OnCalculate

Pls how do i do that??
 
PipiBrasci:
Pls how do i do that??
I See it but dont know how to make the necessary input to give the actual type/parameters to work. I created a new MQL4 so started compiling and replacing the Init with OnInit . But on getting to OnCalculate finding it difficult to match the codes/ lines to work. Its just an indicator to make it work. But i guess i know nothing about programming.
 

Click "New" to start the wizard to create a template for the indicator.


 

You don't need to modify anything from "Properties" to "OnInit".

Just pasting the original code into "OnCalculate" will work, but you may want to modify some of it.
 

Hi,

I think, this way it will work:

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red

extern int period = 10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];

int OnInit()
{
        SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
        SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
        SetIndexStyle(2,DRAW_HISTOGRAM);
        IndicatorDigits(Digits+1);

        SetIndexBuffer(0,ExtBuffer0);
        SetIndexBuffer(1,ExtBuffer1);
        SetIndexBuffer(2,ExtBuffer2);

        IndicatorShortName("Fisher");
        SetIndexLabel(1,NULL);
        SetIndexLabel(2,NULL);

        return(INIT_SUCCEEDED);
}

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[])
{
        //int     period=10;
        int    limit;
        int    counted_bars=IndicatorCounted();
        double prev,current,old;
        double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
        double price;
        double MinL=0;
        double MaxH=0;  

        if(counted_bars>0) counted_bars--;
        limit=Bars-counted_bars;

        for(int i=0; i<limit; i++)
        {
                MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)];
                MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)];
                price = (High[i]+Low[i])/2;
                Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
                Value=MathMin(MathMax(Value,-0.999),0.999); 
                
                ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
                Value1=Value;
                Fish1=ExtBuffer0[i];
        }

        bool up=true;
        for(int i=limit-2; i>=0; i--)
        {
                current=ExtBuffer0[i];
                prev=ExtBuffer0[i+1];

                if (((current<0)&&(prev>0))||(current<0))   up= false;    
                if (((current>0)&&(prev<0))||(current>0))   up= true;

                if(!up)
                {
                        ExtBuffer2[i]=current;
                        ExtBuffer1[i]=0.0;
                }
                else
                {
                        ExtBuffer1[i]=current;
                        ExtBuffer2[i]=0.0;
                }
        }

        return(rates_total);
}


Best regards

 
werner.klehr:

Hi,

I think, this way it will work:


Best regards

Thansk Werner for the kindness and time to help me out. Much appreciated. Thank you so much but it just has one more error and i dont want to make a mess of it. pls.

Files:
Error1.JPG  58 kb
 
Nagisa Unada:

You don't need to modify anything from "Properties" to "OnInit".

Just pasting the original code into "OnCalculate" will work, but you may want to modify some of it.

Ok, thank you so much for the response.

Reason: