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

 
Galim_V:

Voici comment modifier

il y a beaucoup d'erreurs dans le code, dans

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

il est préférable de normaliser les prix, alors ils fonctionneront, puis le serveur donnera une erreur de "mauvais prix", il est souhaitable de normaliserStopLoss_SELL

et très probablement, vous devez vérifier si le StopLoss est égal à zéro - il n'est pas souhaitable de comparer des nombres réels pour qu'ils soient égaux, vous devez essayer de comparer des nombres réels à > ou <.

 
Jessy111:

Aidez-moi à corriger un bug dans l'indicateur, il ne dessine pas le haut et le bas du jour quand il est sur la dernière bougie de l'heure.

J'ai esquissé l'indicateur, votre code n'aime pas travailler avec des chaînes de caractères, je l'écrirais plus simplement, voici un exemple. Toutefois, si votre tâche consiste à prendre en compte le décalage horaire du serveur, c'est l'inverse qui s'impose.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   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 i,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Mon exemple n'est pas non plus un exemple, je l'ai écrit rapidement, je pense que je n'aurais pas dû compter de la fin de l'historique au début à la première exécution, mais de la barre zéro à l'historique, le code aurait été plus court et aurait pu calculer le jour actuel plus rapidement - le cycle aurait été plus court,

Mais je l'ai vérifié dans le testeur, il semble fonctionner sans problème, qu'il en soit ainsi, il est tard, j'ai sommeil.... J'ai fait un mauvais exemple (((

 
Igor Makanu:

il y a beaucoup d'erreurs dans le code, dans...

il est préférable de normaliser les prix, alors ils fonctionneront, puis le serveur donnera une erreur de "mauvais prix", il est souhaitable de normaliserStopLoss_SELL

Et très probablement, vous devez vérifier si le StopLoss est égal à zéro, et il n'est pas souhaitable de comparer des nombres réels pour qu'ils soient égaux, vous devez essayer de comparer des nombres réels à > ou <.

C'est vrai. Je viens de montrer un endroit dans le code, pourquoi il ne modifie pas les ordres du marché : demander un stop du marché donnera 0.

 
Igor Makanu:

Voici un indicateur esquissé, je n'aime pas votre code avec des chaînes, je l'écrirais plus simplement, voici un exemple. Toutefois, si votre tâche consiste à prendre en compte le décalage horaire du serveur, vous devez procéder différemment.

Mon exemple n'est pas non plus un exemple, je l'ai écrit rapidement, je pense que je n'aurais pas dû compter de la fin de l'historique au début à la première exécution, mais de la barre zéro à l'historique, le code aurait été plus court et aurait pu calculer le jour actuel plus rapidement - le cycle aurait été plus court,

Mais je l'ai vérifié dans le testeur, il semble fonctionner sans problème, qu'il en soit ainsi, il est tard, j'ai sommeil.... Mauvais exemple fait (((

Ce n'est pas mon code, je l'ai trouvé sur Internet, je ne sais pas écrire les indicateurs. :)

Pour ce que ça vaut un mauvais exemple, j'ai vraiment aimé votre indicateur, il fonctionne dans le Strategy Tester et sur des graphiques réels.

Merci beaucoup pour cette aide rapide !

Puis-je également vous demander de supprimer les lignes qui dessinent le canal ? Je les ai marquées avec des flèches rouges sur la capture d'écran.

Et si cela ne pose pas trop de problèmes, veuillez ajouter la fonction permettant de désactiver/activer la formation de lignes pour le jour en cours. Je les ai marqués sur la capture d'écran avec des flèches bleues. https://prnt.sc/kuuj3e

Merci d'avance !

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Bonjour, ma chère !

Veuillez indiquer comment exécuter la procédure OnInit() ;

après que les variables du conseiller expert aient été modifiées ?

Lorsque l'on place l'Expert Advisor sur le graphique, il y a OnInit() ; mais lorsque les variables sont modifiées, il n'y a pas de OnInit !?

Comment identifier l'événement du changement de variable de l'Expert Advisor ?

S'il vous plaît aidez avec des conseils, ou plutôt avec du code, comment le faire !?

 
Игорь:

Bonjour, ma chère !

Veuillez indiquer comment exécuter la procédure OnInit() ;

après que les variables du conseiller expert aient été modifiées ?

Lorsque l'on place l'Expert Advisor sur le graphique, il y a OnInit() ; mais lorsque les variables sont modifiées, il n'y a pas de OnInit !?

Comment identifier l'événement du changement de variable de l'Expert Advisor ?

S'il vous plaît aidez avec des conseils, ou plutôt avec du code, comment le faire !?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Expérimentez avec ce code, lisez le message dans le journal de l'EA (changez le TF, entrez la variable, redémarrez le terminal sans fermer l'EA...)

et la seconde option consiste à décrire une variable de portée globale avec le modificateur static.

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

expérimentez avec un tel code, lisez le message dans le journal de l'Expert Advisor (changez le TF, entrez la variable, rechargez le terminal sans fermer l'Expert Advisor...)

et la deuxième option consiste à décrire une variable de portée globale avec le modificateur static.

A la portée globale avec le modificateur static ????? C'est une sorte de perversion.

 
Alexey Viktorov:

Au niveau global avec le modificateur statique static ????? C'est une sorte de perversion.

Mais d'après mon expérience, lorsque les builds de MT4 étaient souvent mis à jour, il est préférable de les écrire selon le C++ classique, plutôt que d'écouter la réponse "écrivez le code correctement" lorsque vous communiquez avec les développeurs.



ZS : Je me souviens pourquoi j'ai commencé à écrire le modificateur statique globalement, si je veux être sûr de ne pas "perdre" la valeur de la variable pendant l'exécution du programme MQL. Auparavant (il y a environ 5 ans) la directive précompilateur #property strict n'existait pas et en activant des fichiers (#include ou library - je ne me souviens plus) j'ai "perdu ma variable" une fois, car les noms des variables coïncidaient avec le nom de la variable.J'ai été maudit par MQL mais plus tard j'ai trouvé cette erreur par accident. Mais si j'écrivais un modificateur statique le compilateur afficherait une erreur de compilation dans ce cas aussi.

Le compilateur actuel est MT4, assez pratique et fiable, et avec la directive #property strict, peut-être que je n'ai pas besoin de telles précautions, mais j'écris statique par habitude quand je ne veux pas "perdre la valeur" d'une variable

ZZZY : ce modificateur n'affecte pas la vitesse d'exécution des programmes MQL, et il est pratique pour moi d'ouvrir mon code plus tard, et ayant vu static je saurai exactement, que cette variable a une valeur, qui est important de ne pas "perdre" pendant l'exécution du programme

 
Igor Makanu:

Mais d'après mon expérience, lorsque les builds de MT4 étaient souvent mis à jour, il est préférable de les écrire selon le C++ classique, plutôt que d'écouter la réponse "écrivez le code correctement" lorsque vous communiquez avec les développeurs.



ZS : Je me souviens pourquoi j'ai commencé à écrire le modificateur statique globalement, si je veux être sûr de ne pas "perdre" la valeur de la variable pendant l'exécution du programme MQL. Auparavant (il y a environ 5 ans) la directive précompilateur #property strict n'existait pas et en activant des fichiers (#include ou library - je ne me souviens plus) j'ai "perdu ma variable" une fois, car les noms des variables coïncidaient avec le nom de la variable.J'ai été maudit par MQL mais plus tard j'ai trouvé cette erreur par accident. Mais si j'écrivais un modificateur statique le compilateur afficherait une erreur de compilation dans ce cas aussi.

Le compilateur actuel est MT4, assez pratique et fiable, et avec la directive #property strict, peut-être que je n'ai pas besoin de telles précautions, mais j'écris statique par habitude quand je ne veux pas "perdre la valeur" d'une variable

ZZZY : ce modificateur n'affecte pas la vitesse d'exécution du programme MQL, et il est pratique pour moi d'ouvrir mon code après un certain temps, et ayant vu statique je saurai exactement, que cette variable a une valeur, qui est importante "à ne pas perdre" pendant l'exécution du programme

Le compilateur génère un avertissement si les noms de variables coïncident avec ceux du fichier d'inclusion. Pour moi, un avertissement équivaut à une erreur et je réagis de la même manière. Et des variables de niveau global avec un modificateur statique, c'est du beurre.

Mais... Si tu aimes écrire comme ça, personne ne peut te l'interdire.

 
Alexey Viktorov:

Mais... Mais... si vous aimez l'écrire de cette façon, personne ne peut vous l'interdire.

J'ai des doutes sur mon caractère unique dans cette affaire... Je ne suis pas le seul, en cherchant dans le dossier MQL5, j'ai trouvé de telles déclarations avec le modificateur statique au niveau global dans plusieurs codes sources de la livraison de MT5.

Même dans l'article "FORÊT DE DÉCISIONS RANDOMES DANS LE RÉSUMÉ", dans le code source, j'ai trouvé une déclaration au niveau global : static datetime last_time=0 ;

donc j'ai écrit comme je l'entends pour allouer et sera, je ne suis pas 100% des variables au niveau global décrivant comme statique

Dieu protège les nécessiteux, dit la religieuse... ))))