Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 545

 
GSB:

Quel genre de prise ? Vous pouvez appeler le même indicateur avec des paramètres complètement différents



Si dans l'indicateur lui-même
extern int       periodAMA=10;
dans l'EA
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

comment le code de l'indicateur reconnaît-il les paramètres transmis et leurs noms différents ?

Mais tout est comme vous l'avez dit. Je l'ai vérifié à nouveau avec le script)

 
Forexman77:
Si dans l'indicateur lui-même dans le Conseiller Expert

comment le code de l'indicateur reconnaît-il les paramètres transmis et dont les noms sont différents ?

Mais tout est comme vous l'avez dit. Vérifié à nouveau avec le script)


La ou les variables du programme appelant peuvent être nommées comme vous le souhaitez et leur nom n'est pas lié au nom de la variable dans l'indicateur, ce sont des variables différentes, et elles sont appelées à partir de différents fils de terminal.

L'indicateur est appelé en fonction de son nom, les paramètres sont passés pour lui lors de chaque appel à partir de la 4ème position et ensuite les paramètres iCustom().

Si la variable per1=9 ; est déclarée et que iCustom() est en position 4, l'indicateur sera calculé avec une période de 9 ; si vous définissez une autre variable, sa valeur sera utilisée pendant le calcul, et ceci est valable pour tous les paramètres de l'indicateur, l'essentiel étant de les définir dans le bon ordre, comme dans l'indicateur lui-même. La variable qui sera passée (sa référence) comme premier paramètre de l'indicateur - à la quatrième place iCustom() du deuxième et ainsi de suite.



 
GSB:

La ou les variables du programme appelant peuvent être nommées comme vous le souhaitez, leur nom n'est pas lié au nom de la variable dans l'indicateur, ce sont des variables différentes, et elles sont appelées à partir de différents fils de terminal.

L'indicateur est appelé par son nom, les paramètres lui sont passés lors de chaque appel à partir de la 4ème position, puis les paramètres iCustom().

Si la variable per1=9 est déclarée et que iCustom() est positionné à 4, l'indicateur sera calculé avec une période de 9 ; si vous définissez une autre variable, sa valeur sera utilisée pendant le calcul et ceci est valable pour tous les paramètres de l'indicateur, l'essentiel est de les définir dans le bon ordre, comme dans l'indicateur lui-même. La variable qui sera passée (sa référence) comme premier paramètre de l'indicateur - le quatrième iCustom() du deuxième et ainsi de suite.



Je l'ai. Dans le manuel, il semble que cela s'appelle transférer les valeurs citées.
 

J'ai pensé que je ne devais pas salir le forum et avoir un sujet séparé, mais j'espère vraiment avoir un retour constructif sur mon problème, je ne peux pas avancer sans cela :(.
J'ai essayé d'écrire divers indicateurs, tout semble être OK, maintenant j'ai tout importé dans mon EA en utilisant la fonction iCustom(). Le code dans le conseiller expert :

double ma=iCustom(NULL,0,"TestMA",0,1);

L'indicateur lui-même (je l'ai écrit pour le tester)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   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_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

Ensuite, le truc EMPTY_VALUE lors des tests.

C'est-à-dire que lorsque nous commençons à tester, nous avons la date de début de l'EA et tout ce qui est avant cette date, iCustom donne les valeurs correctes de l'indicateur, tout ce qui est après est directement testé - EMPTY_VALUE. :(
Je suis déjà fatigué à google et forum, ils écrivent sur "ne pas regarder dans le futur", mais je ne vois pas cela dans le code. Où suis-je un imbécile ?)

 
Semionn:

J'ai pensé que je ne devais pas encombrer le forum et avoir un sujet séparé, mais j'espère vraiment avoir un retour constructif sur mon problème, je ne peux pas avancer sans cela :(.
J'ai essayé d'écrire divers indicateurs, tout semble être OK, maintenant j'ai tout importé dans mon EA en utilisant la fonction iCustom(). Le code dans le conseiller expert :

L'indicateur lui-même (je l'ai écrit pour le tester)

Ensuite, le truc EMPTY_VALUE lors des tests.

C'est-à-dire que lorsque nous commençons à tester, nous avons la date de début de l'EA et tout ce qui précède cette date, iCustom nous donne des valeurs d'indicateur correctes, tout ce qui suit est directement testé - EMPTY_VALUE. :(
Je suis déjà fatigué à google et forum, ils écrivent sur "ne pas regarder dans le futur", mais je ne vois pas cela dans le code. Où suis-je un imbécile ?)

L'erreur semble se trouver dans le code de l'Expert Advisor, pourquoi n'utilisez-vous pas un débogueur ? Définissez des points de contrôle, consultez les valeurs des variables et voyez si l'indicateur est appelé, ce qui se trouve avant et après votre date.
 
GSB:
L'erreur semble se trouver dans le code de l'Expert Advisor, pourquoi n'utilisez-vous pas un débogueur ? Définir des points de contrôle, voir les valeurs des variables, et voir si l'indicateur est appelé, ce qui se trouve avant et après votre date.

Le débogueur ne peut être utilisé qu'en mode compte démo, pas en test, d'ailleurs j'ai écrit - l'indicateur est appelé, fonctionne et renvoie des valeurs, même correctes, mais seulement avant la date spécifiée (date de début du test). Je sors les valeurs des variables dans l'EA, c'est pourquoi je dis que tout va bien au début, et ensuite EMPTY_VALUE
 
Semionn:

Le débogueur ne peut être utilisé qu'en mode compte démo, pas en test, d'ailleurs j'ai écrit - l'indicateur est appelé, fonctionne et renvoie des valeurs, même correctes, mais seulement jusqu'à la date spécifiée (date de début du test). Je sors les valeurs des variables dans l'EA, c'est pourquoi je dis que tout est bon au début, et ensuite EMPTY_VALUE


Avez-vous lu attentivement comment suivre les nouvelles barres dans les indicateurs personnalisés?

[QUOTE]Le premier paramètre rates_total contient le nombre de barres disponibles pour l'indicateur pour le calcul et correspond au nombre de barres disponibles dans le graphique.

Notez le lien entre la valeur renvoyée par OnCalculate() et le deuxième paramètre d'entrée prev_calculated. Le paramètre prev_calculated de l'appel de fonction contient une valeur renvoyée par OnCalculate() lors de l'appel précédent. Cela permet d'utiliser des algorithmes économiques pour calculer l'indicateur personnalisé afin d'éviter des calculs répétés pour les barres qui n'ont pas changé depuis l'appel précédent de cette fonction.

Pour cela, il suffit généralement de renvoyer la valeur du paramètre rates_total, qui contient le nombre de barres dans l'appel de fonction actuel. Si depuis le dernier appel de OnCalculate() les données de prix ont changé (un historique plus profond a été pompé ou les blancs de l'historique ont été remplis), alors la valeur du paramètre d'entrée prev_calculated sera mise à zéro par le terminal. [/QUOTE]

 

Vous devez trouver la moyenne des moments d'un jour sur 20 jours, puis trouver la moyenne des moments de 20 jours sur cinq jours.

Trouver la moyenne sur 20 jours n'a pas été un problème. Mais jene sais pascomment obtenirla moyenne sur cinq joursà partir de cette moyenne .

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Vous devez trouver la moyenne des moments d'un jour sur 20 jours, puis trouver la moyenne des moments de 20 jours sur cinq jours.

Trouver la moyenne sur 20 jours n'a pas été un problème. Mais jene sais pascomment obtenirla moyenne sur cinq joursà partir de cette moyenne .



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Aide

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

La minuterie ne fonctionne pas, elle renvoie des fautes et l'erreur 4051.

Ou bien cela ne devrait-il pas fonctionner dans le testeur ?

Raison: