Upload indicators in the market

 
Hi
As a seller, I uploaded the indicator I wrote. Surprisingly, when I download it from the site, it is in the list of experts in Meta Trader.
I repeated this with the simplest indicators, that was the result.

I already (five months ago) uploaded five indicators and put them up for sale without any problems. This is the first time I have encountered this problem.

Does anyone know what the problem is?

 
Mohammadal Alizadehmadani :
Hi
As a seller, I uploaded the indicator I wrote. Surprisingly, when I download it from the site, it is in the list of experts in Meta Trader.
I repeated this with the simplest indicators, that was the result.

I already (five months ago) uploaded five indicators and put them up for sale without any problems. This is the first time I have encountered this problem.

Does anyone know what the problem is?

With a 100% probability you are writing for an old terminal and at the same time you do not use modern OnInit, OnCalculate constructs.

 
Vladimir Karputov #:

With a 100% probability you are writing for an old terminal and at the same time you do not use modern OnInit, OnCalculate constructs.

Thank you for your answer. I put the code below. The code is very simple. please explain more.it is mql4.

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "2.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1

#property indicator_buffers 1

double Bufer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Bufer); 
   SetIndexStyle( 0,DRAW_LINE ,EMPTY ,EMPTY, clrBlue );    
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 Counted = rates_total-prev_calculated-1;
     if (Counted<=1) Counted =1; 
         
     for (int i=Counted ; i>=0 ;i--)  
         {      
          if ((High[i]-Low[i])!=0)
             Bufer[i]=MathAbs(Open[i]-Close[i])/(High[i]-Low[i]); 
          else
             Bufer[i]=0;
          }  

   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Mohammadal Alizadehmadani #:Thank you for your answer. I put the code below. The code is very simple. please explain more.it is mql4.

The OnCalculate event handler supplies the OHLC data as the arrays open[], high[], low[], close[], yet you are using the internal MQL4 arrays Open[], High[], Low[], Close[] .

Don't do that. Use the arrays provided by the OnCalculate parameters. In MQL the names are case sensitive.

Also your "Counted" loop can cause an "array out of range" error, when "rates_total" is less that two. You need to fix that as well.

 
Fernando Carreiro #:

The OnCalculate event handler supplies the OHLC data as the arrays open[], high[], low[], close[], yet you are using the internal MQL4 arrays Open[], High[], Low[], Close[] .

Don't do that. Use the arrays provided by the OnCalculate parameters. In MQL the names are case sensitive.

Also your "Counted" loop can cause an "array out of range" error, when "rates_total" is less that two. You need to fix that as well.

thank you for your attention.

I changed the code as follows. I think the problem is solved.

//+------------------------------------------------------------------+
//|                                                   Testing101.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "4.00" 
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1

#property indicator_buffers 1

double Bufer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Bufer); 
   SetIndexStyle( 0,DRAW_LINE ,EMPTY ,EMPTY, clrBlue );    
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 Counted = rates_total-prev_calculated-1 ;
     if (Counted<0) Counted =0; 
         
     for (int i=Counted ; i>=0 ;i--) 
         {      
          if ((high[i]-low[i])!=0)
             Bufer[i]=MathAbs(open[i]-close[i])/(high[i]-low[i]); 
          else
             Bufer[i]=0;
          }  

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Mohammadal Alizadehmadani #: thank you for your attention. I changed the code as follows. I think the problem is solved.

No quite! It will still produce an "array out of range" error, when "rates_total" is less that one. Here is one possible correction (there are other ways) ...

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[])
{
   if( rates_total > 0 )
   {
     int Counted = rates_total-prev_calculated-1 ;
     if (Counted<0) Counted =0; 
         
     for (int i=Counted ; i>=0 ;i--) 
     {      
        if ((high[i]-low[i])!=0)
           Bufer[i]=MathAbs(open[i]-close[i])/(high[i]-low[i]); 
        else
           Bufer[i]=0;
     }  
   }

   //--- return value of prev_calculated for next call
   return(rates_total);
}
 
Fernando Carreiro #:

No quite! It will still produce an "array out of range" error, when "rates_total" is less that one. Here is one possible correction (there are other ways) ...

You are right . Thanks

Reason: