[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 278

 
Comment puis-je programmer mon conseiller expert pour qu'il soit capable d'identifier et de trouver les extrema des graphiques ?
 
Ekburg:
Comment puis-je programmer mon conseiller expert pour qu'il soit capable d'identifier et de trouver les extrema des graphiques ?
https://docs.mql4.com/ru/series
 

Cela ne répond pas à la question, c'est une chose de connaître tous les points de haut et de bas de gamme pris dans les tableaux, mais comment isoler les extrema du graphique parmi eux ?
 
Ekburg:

Cela ne répond pas à la question, c'est une chose de connaître tous les points hauts et bas des barres prises dans les tableaux, mais comment sélectionner les extrema du graphique parmi eux ?

Avec Highest() et Lowest(), le nombre de barres s'adapte au graphique ! Alors avale-le, je te l'ai expliqué !
 
Ekburg:

Ce n'est pas la réponse à la question, c'est une chose de connaître tous les points hauts et bas du graphique pris dans les tableaux, mais comment isoler les extrêmes du graphique parmi eux ?
Je ne savais pas que tu devais le mâcher et l'avaler toi-même :-))
 

J'ai analysé l'ADX à partir de la base de données Kodobase. Je ne comprends pas comment une taille de tableau est déclarée ici. Ou plutôt, je devine et je veux demander à nouveau.

double MinusDiBuffer[];
double PlusSdiBuffer[];
//в init() объявления размера нет. В старте:
int start()
  {
   int    i
   i=Bars-2;
   PlusSdiBuffer[i+1]=0;//<--- вот?
   MinusSdiBuffer[i+1]=0;//<---
//и так далее

J'ai supprimé le code, qui n'est pas pertinent pour la question. Il s'avère que nous les initialisons avec des zéros au début et les remettons à zéro lorsque nous les appelons à nouveau, n'est-ce pas ? J'utilise habituellement ArrayResize() si je n'ai pas déclaré la taille à l'initialisation globale, peut-être que j'y suis juste habitué...

 
gyfto:

J'ai analysé l'ADX à partir de la base de données Kodobase. Je ne comprends pas comment une taille de tableau est déclarée ici. Ou plutôt, je devine et je veux demander à nouveau.

J'ai supprimé le code, qui n'est pas pertinent pour la question. Il s'avère que nous les initialisons avec des zéros au début et les remettons à zéro lorsque nous les appelons à nouveau, n'est-ce pas ? J'utilise habituellement ArrayResize() si je n'ai pas déclaré la taille à l'initialisation globale, peut-être que j'y suis juste habitué...

Il s'agit de tampons indicateurs - vous n'avez pas besoin de spécifier explicitement leur taille, car il s'agit de tableaux dynamiques. Par défaut, ils sont remplis de EMPTY_VALUE (valeur vide).
 
Au fait, voici un smiley retravaillé avec les touches de raccourci qui lui sont attribuées. Voir la liste des codes de clé. La touche assignée fonctionne comme un déclencheur.
Dossiers :
smile.mq4  5 kb
 
borilunad:

C Highest() et Lowest() des barres qui s'insèrent dans le graphique ! Alors avale-le, je te l'ai expliqué !


Merci d'être précis, car ces tableaux n'étaient pas spécifiés dans le lien, et je n'ai pas fait attention à la colonne de gauche, puisque j'étais au travail.

mais personne n'avalera ce que vous crachez sauf vous ;)

 

Il y a un problème avec ma fonction qui renvoie la valeur des éléments d'un même tableau. Je vais tout décrire dans l'ordre concernant cette question.

Les variables globales sont :

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

Fonctions utilisées dans ce calcul :

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

J'imprime en plus la valeur des éléments du tableau renvoyés par la fonctionGetStateMa(int& crossDir[]):

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

C'est ce qui est renvoyé :

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

La valeur des éléments du tableaucrossDir[] est retournée différente, bien qu'ils devraient tous avoir une valeur de 1.

On peut le constater par l'annulation des expressions comparant les périodes Mach 4 et 365. Pouvez-vous me dire pourquoi les valeurs sont renvoyées de manière incorrecte ?