Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1306

 

Por favor, ayuda, he añadido un buffer más al indicador (double ma_buffer_stop[];), pero no dibuja o da errores(

//+------------------------------------------------------------------+
//|                                                   MTF_Moving.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                             https://www.mql5.com/ru/users/melnik |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/melnik"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Black
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE

double ma_buffer_slow[];
double ma_buffer_fast[];
double ma_buffer_stop[];

//--- input parameters
input int                     PeriodMaSlow=21;  //Period slow Ma
input int                     PeriodMaFast=13;  //Pertiod fast Ma
input ENUM_APPLIED_PRICE      PriceMa=0;        //Applied price
input ENUM_MA_METHOD          MethodMa=0;       //Method Ma
input ENUM_TIMEFRAMES         Timeframe=60;     //Timeframe for calculate

ENUM_TIMEFRAMES prd;

int index=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, ma_buffer_slow, INDICATOR_DATA);
   SetIndexBuffer(1, ma_buffer_fast, INDICATOR_DATA);
   SetIndexBuffer(2, ma_buffer_stop, INDICATOR_DATA);
//---
   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[])
  {
//---
   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)
   {
      if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false);
      
      ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index);
      ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index);
      if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;}
      if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;}
   }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Mira, ¿nos vamos a meter aquí?

if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf(ma_buffer_slow[i]);
eso es lo primero que se me ocurre.
 

A veces cojo la división a cero. (Todo puede ocurrir en la dinámica).

Lo busco comentando las operaciones de división y lanzando el EA en el gráfico.

¿Hay alguna forma de obtener la cadena con el error utilizando métodos más normales?

El problema es que el error sólo se produce en un determinado estado. Es decir, el error puede desaparecer en un determinado marco temporal y con una nueva vela. Es bueno cuando se nota a las 4 en punto. Hay tiempo para encontrarlo.

 
Valeriy Yastremskiy:

¿Hay alguna forma de obtener la línea con el error utilizando métodos más convencionales?

Debería tener una entrada en el registro de expertos con el número de archivo y de línea donde se produjo la división por cero

 
Igor Makanu:

Deberías tener un registro en el registro de tu Asesor Experto con el número de archivo y línea donde se produjo la división por cero

2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: división a cero en 'qstr7_52_1.mq4' (962,43)

Sólo esto.

Sin embargo, 962,43.

Ahí tienes))) ¡¡¡¡¡Gracias!!!!!


 
Aleksei Stepanenko:

¿Nos vamos a meter aquí?

sólo de la parte superior de mi cabeza.

Ir a

Si hago esto, atrae

   double prev01,prev02;

   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)
   {
      if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false);
      
      ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index);
      ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index);
      prev01=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index+1);
      prev02=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index+1);
      if(prev01>=prev02&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;}
      if(prev01<=prev02&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;}
   }
  
 

Este array sólo tiene los valores correctos en los puntos de intersección, en el resto su valor es EMPTY_VALUE. Por lo tanto, nada es visible. Es necesario introducir una variable global y asignarle valores en el momento de la intersección. Y ya dará el valor actual en el momento de la intersección, o el valor pasado cuando no haya intersección.

double Stop=0;
int OnCalculate(....

if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) Stop=ma_buffer_slow[i]+50*Point;
if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i]) Stop=ma_buffer_slow[i]-50*Point;

ma_buffer_stop[i]=Stop;
 
Aleksei Stepanenko:

Este array sólo tiene los valores correctos en los puntos de intersección, en el resto su valor es EMPTY_VALUE. Por lo tanto, nada es visible. Es necesario introducir una variable global y asignarle valores en el momento de la intersección. Y ya dará el valor actual en el momento de la intersección, o el valor pasado cuando no haya intersección.

Gracias, ha funcionado)

 
¿Es posible cancelar a la fuerza el cambio de marco temporal si la función del indicador sigue en marcha?
 
Aleksei Stepanenko:

Este array sólo tiene los valores correctos en los puntos de intersección, en el resto su valor es EMPTY_VALUE. Por lo tanto, nada es visible. Es necesario introducir una variable global y asignarle valores en el momento de la intersección. Y ya dará el valor actual en el momento de la intersección, o el valor pasado cuando no haya intersección.

He multiplicado PeriodMaSlow por 2

   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)

y el código inicial funciona sin errores

Razón de la queja: