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

 
Vladimir Karputov:

Il y a :

Merci. Je serai devant l'ordinateur, peut-être que je jetterai un coup d'oeil.
 
Artyom Trishkin:
Merci. Je serai devant l'ordinateur, je jetterai peut-être un coup d'oeil.

l'indicateur est écrit dans un très-très vieux format en MQL4, je n'y ai pas touché depuis longtemps, je ne suis pas sûr de me rappeler comment il était écrit

@zig2003 comme option, essayez de supprimer IndicatorBuffers(6) de start()

et en haut, fixez #property indicator_buffers 6

 
Igor Makanu, et après avoir corrigé l'indicateur, que devrai-je comparer avec quoi dans l'EA pour programmer un renversement ?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
Igor Makanu, et après avoir corrigé l'indicateur, à quoi dois-je comparer dans mon Expert Advisor pour programmer le pivot ?

chaque indicateur est composé de plusieurs tampons d'indicateurs

lorsque vous appelez l'indicateur depuis le Conseiller Expert par iCustom(), vous obtenez la valeur d'un tampon sur une certaine barre, et vous pouvez voir cette valeur dans la fenêtre de données Ctrl+D

ce qu'il faut comparer dépend de votre TS, soit les valeurs des tampons indicateurs, soit le tampon et le prix - il y a de nombreuses variantes

Vous devez d'abord créer un indicateur MA, et ensuite, lorsque vous le comprendrez, vous appellerez votre propre indicateur au lieu du MA

Ce n'est pas si simple - il suffit d'écrire quelques commandes et votre conseiller expert sera prêt.


ZS : un pivot d'indicateur est une comparaison de plusieurs valeurs de tampons d'indicateur, à en juger par votre capture d'écran sur la barre numéro 2 doit être fixé près du prix du tampon numéro 1 et le reste des tampons auront...valeurs EMPTY_VALUE, et sur la barre №1, au contraire, le tampon №1 a la valeur EMPTY_VALUE , et l'un des 2 ou 3 tampons aura une valeur différente de EMPTY_VALUE - vous devez regarder tout cela dans la fenêtre d'aperçu des données (déplacez la flèche de la souris sur les barres et vous voyez les valeurs des tampons)

 

Igor, merci, j'ai corrigé l'indicateur, mais la valeur du tampon n'apparaissait toujours pas. J'ai dépassé ce stade depuis longtemps, tout est simple là-bas, il y a deux lignes - deux tampons. Habituellement, pour des indicateurs similaires, qui consistent en une seule ligne, mais avec des tampons différents pour la couleur, j'écris le code de la manière suivante :

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

Mais cela n'est possible que si un véritable tampon est attribué à chaque couleur. Lorsque vous changez de couleur sur la première barre fermée, la valeur du tampon devient supérieure à zéro, alors que sur la barre précédente, elle était soit égale à zéro, soit le tampon d'une autre couleur était supérieur à zéro. Je n'arrive pas à obtenir la valeur de la deuxième couleur de vente de cet indicateur et je ne sais pas à quoi la comparer pour détecter le renversement. J'ai essayé tous les numéros de tampon. C'est malheureux, car cette platine de Mladenov, bien que vieille, mais très décente trending in manual strategics.... Quelqu'un peut-il deviner comment tirer la valeur du deuxième tampon et écrire la formule pour l'inversion ?

 
zig2003:

Igor, merci, j'ai corrigé l'indicateur, mais la valeur du tampon n'apparaissait toujours pas. J'ai depuis longtemps dépassé ce stade, tout est simple là-bas, il y a deux lignes - deux tampons. Habituellement, pour des indicateurs similaires, qui consistent en une seule ligne, mais avec des tampons différents pour la couleur, j'écris le code de la manière suivante :

Mais cela n'est possible que si un véritable tampon est attribué à chaque couleur. Lorsque vous changez de couleur sur la première barre fermée, la valeur du tampon devient supérieure à zéro, alors que sur la barre précédente, elle était soit égale à zéro, soit le tampon d'une autre couleur était supérieur à zéro. Je n'arrive pas à obtenir la valeur de la deuxième couleur de cet indicateur et je ne comprends pas à quoi la comparer pour détecter le renversement. Et c'est dommage, car cet indicateur de Mladenov, bien que vieux, mais très bien orienté dans les stratégies manuelles.... Quelqu'un peut-il trouver comment écrire la formule d'inversion ?

Sans aucune modification de l'indicateur.

Que signifient les données dans les deux tampons - en 0 et 1 :

  • S'il y a une valeur dans le tampon 0 et aucune valeur dans le tampon 1, c'est la direction à prendre pour être long ( ligne indicatrice bleue (si par défaut)).
  • S'il y a une valeur dans le tampon 0 et qu'il y a une valeur dans le tampon 1, alors il s'agit d'une direction courte (couleur rouge de la ligne indicatrice (si par défaut)).

Changement de direction (couleur) de la ligne :

  • Il y a toujours une valeur dans le tampon 0 et, d'ailleurs, on peut toujours la définir (comparer les valeurs sur trois barres : 2<=1 && 1>0 --> bas, 2>=1 && 1<0 --> haut)
    ...
    Mais vous pouvez aussi n'utiliser que le tampon 1 :
  • S'il n'y a pas de valeur dans le tampon 1 à la barre 0 et qu'il y a une valeur à la barre 1, il s'agit d'un changement de direction de la ligne à long ;
  • S'il y a une valeur sur la barre 0 dans le tampon 1 et aucune valeur sur la barre 1, il s'agit d'un changement de direction de la ligne à court ;

"Aucune valeur" signifie ici EMPTY_VALUE. Ou DBL_MAX - peu importe, c'est la même chose. C'est-à-dire que ce n'est pas zéro, c'est EMPTY_VALUE.

 
zig2003:

Quelqu'un peut-il deviner comment extraire la valeur du second tampon et écrire la formule de pivot ?

Vous n'avez pas à deviner, vous devriez d'abord réécrire l'indicateur dans une forme normale correspondant à l'état actuel de MQL4

J'ai mis un peu d'ordre dans le code, mais je ne suis pas sûr qu'il n'y aura pas d'erreurs. Je n'aime pas le code source, mais j'ai travaillé avec ce que j'avais.

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

Ici je vois les valeurs des tampons de cet indicateur :


 
Les gars, merci pour les conseils. SurtoutIgor Makanu. Oui, en effet, j'ai créé 6 tampons au lieu des trois par défaut et les valeurs 1 et -1 sont apparues dans un des tampons, mais pas du tout dans les tampons originaux. C'est pour ça que je n'ai pas pu faire sortir les valeurs. Et je ne l'aurais jamais deviné moi-même. Tout est revenu à la normale maintenant. Tout fonctionne. Igor, merci aussi pour la distillation de l'indicateur dans le nouveau format. Merci encore pour votre savoir ! !!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

Vous n'avez pas à deviner, vous devez d'abord réécrire l'indicateur dans une forme normale correspondant à l'état actuel du langage MQL4.

J'ai mis un peu d'ordre dans le code, mais je ne suis pas sûr qu'il n'y aura pas d'erreurs, je n'aime pas le code source, mais j'ai travaillé avec ce que j'avais

Ici je vois les valeurs des tampons de cet indicateur :

Il fonctionne sans écrasement, et permet de récupérer très facilement vos données. Je l'ai décrit ci-dessus - il suffit de regarder ses lectures de tampon dans la fenêtre de données (Ctrl+D).

 
Artyom Trishkin:

Il fonctionne sans réécriture et permet de recevoir ses données très simplement. Je l'ai décrit ci-dessus - il suffit de regarder ses lectures de tampon dans la fenêtre de données (Ctrl+D).

J'ai écrit plus haut que je ne me souviens pas comment la fonction IndicatorCounted() fonctionne dans les anciens indicateurs, la nouvelle forme des indicateurs avec OnCalculate() est plus compréhensible

Eh bien, le problème semble être résolu, d'accord ;)

Raison: