Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1306

 

Aidez-moi, j'ai ajouté un tampon supplémentaire à l'indicateur (double ma_buffer_stop[] ;), mais il ne dessine pas ou donne des erreurs (

//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+
 

Vérifier, est-ce qu'on entre là-dedans ?

if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf(ma_buffer_slow[i]);
c'est juste la première chose qui me vient à l'esprit.
 

Parfois, j'attrape la division à zéro. (Tout peut arriver dans la dynamique).

Je le recherche en commentant les opérations de division et en jetant l'EA sur le graphique.

Y a-t-il un moyen d'obtenir la ligne contenant l'erreur en utilisant des méthodes plus normales ?

Le problème est que l'erreur ne se produit que dans un certain état. C'est-à-dire que l'erreur peut disparaître à un certain délai et avec une nouvelle bougie. C'est bon quand on le remarque à 4 heures. Il y a du temps pour le trouver.

 
Valeriy Yastremskiy:

Y a-t-il un moyen d'obtenir la ligne contenant l'erreur en utilisant des méthodes plus conventionnelles ?

Vous devez avoir une entrée dans le journal de l'expert avec le fichier et le numéro de ligne où la division par zéro a eu lieu.

 
Igor Makanu:

Vous devez avoir une entrée dans le journal de votre conseiller expert avec le fichier et le numéro de ligne où la division par zéro a eu lieu.

2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4 : zéro divide dans 'qstr7_52_1.mq4' (962,43)

Seulement ça.

962.43 cependant.

Et voilà))) Merci !!!!!


 
Aleksei Stepanenko:

Est-ce qu'on arrive au moins à entrer ici ?

juste en haut de ma tête.

Aller à

Si je fais ça, ça dessine

   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;}
   }
  
 

Ce tableau n'a les bonnes valeurs qu'aux points d'intersection, ailleurs sa valeur est EMPTY_VALUE. Par conséquent, rien n'est visible. Vous devez saisir une variable globale et lui attribuer des valeurs au moment de l'intersection. Et il donnera déjà la valeur actuelle au moment de l'intersection, ou la valeur passée lorsqu'il n'y a pas d'intersection.

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:

Ce tableau n'a les bonnes valeurs qu'aux points d'intersection, ailleurs sa valeur est EMPTY_VALUE. Par conséquent, rien n'est visible. Vous devez saisir une variable globale et lui attribuer des valeurs au moment de l'intersection. Et il donnera déjà la valeur actuelle au moment de l'intersection, ou la valeur passée lorsqu'il n'y a pas d'intersection.

Merci, ça a marché)

 
Est-il possible d'annuler de force le changement d'horizon temporel si la fonction d'indicateur est toujours en cours ?
 
Aleksei Stepanenko:

Ce tableau n'a les bonnes valeurs qu'aux points d'intersection, ailleurs sa valeur est EMPTY_VALUE. Par conséquent, rien n'est visible. Vous devez saisir une variable globale et lui attribuer des valeurs au moment de l'intersection. Et il donnera déjà la valeur actuelle au moment de l'intersection, ou la valeur passée lorsqu'il n'y a pas d'intersection.

J'ai multiplié PeriodMaSlow par 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--)

et le code initial fonctionne sans erreurs

Raison: