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

 
Artyom Trishkin:
J'ai récemment publié un modèle d'indicateur multiplateforme ici. Regardez ça.
IndicatorBuffers()

vous devez tenir un blog et y publier les réponses aux mêmes questions.... J'aimerais avoir ce genre de patience !

Voicihttps://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

vous devriez tenir un blog et y publier les réponses aux mêmes questions.... J'aimerais avoir ce genre de patience !

Peut-être que tu devrais. Je n'ai pas le temps. Les questions seront toujours les mêmes +/-

 
Le problème est résolu en affectant les variables auxiliaires aux derniers numéros d'ordre des tampons, mais sans prescrire les paramètres d'affichage. Avant cela, les tampons inutiles se trouvaient au milieu de la liste.
 

Aide.

Je veux placer des ordres en attente sur des positions qui ont été fermées pour la journée.

La fonction place l'ordre au prix de la dernière position fermée.

Que dois-je faire pour placer des ordres en suspens sur le prix de toutes les positions fermées dans la journée ?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

Aide.

Je veux placer des ordres en attente sur des positions qui ont été fermées pour la journée.

La fonction place l'ordre au prix de la dernière position fermée.

Que dois-je faire pour placer des ordres en suspens sur les prix de toutes les positions fermées en un jour ?

  1. Parcourez la liste des positions fermées dans la boucle, en sélectionnant celles dont l'heure de fermeture est supérieure à l'heure de début du jour requis (et inférieure à l'heure de début du jour suivant, si c'était avant-hier par exemple).
  2. Ajoutez tous les prix de clôture (prix d'ouverture - je ne sais pas à quoi vous voulez les fixer exactement) de toutes les positions trouvées à un tableau simple ou à un tableau de structures.
  3. Passez en revue le tableau créé dans la boucle et placez les ordres en attente aux prix du tableau (en vérifiant si un ordre existe à ce prix - vous n'avez pas besoin de placer plusieurs ordres au même prix).
  4. Vous pouvez également supprimer du tableau les prix des commandes déjà passées en attendant, mais c'est un peu délicat...
 

J'ai commencé à étudier MQL4 par le livre de S. Kovalev. Kovalev, il y a quelques incohérences dans le code, car le livre a été écrit pour d'anciennes versions de MT4.


Veuillez indiquer comment traiter ce code pour éviter les erreurs.

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

erreur

return' - la fonction doit retourner une valeur.

1. Est-il correct de le faire ?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2. Question : à quel point est-il problématique d'écrire du code pour de nouvelles constructions en utilisant les connaissances données dans le tutoriel (je veux dire le facteur d'âge de l'information) ?



Dossiers :
 
Sergey Branin:

J'ai commencé à étudier MQL4 par le livre de S. Kovalev. Kovalev, il y a quelques incohérences dans le code, car le livre a été écrit pour d'anciennes versions de MT4.


Veuillez indiquer comment traiter ce code pour éviter les erreurs.

erreur

return' - la fonction doit retourner une valeur.

1. Est-il correct de le faire ?


2. Question : quel est le problème d'écrire du code pour de nouvelles constructions en utilisant les connaissances données dans le tutoriel (je veux dire le facteur de vieillissement de l'information) ?



Utilisez OnInit(), OnDeinit(), OnTick(), et d'autres de la liste :

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

J'ai commencé à étudier MQL4 par le livre de S. Kovalev. Kovalev, il y a quelques incohérences dans le code, car le livre a été écrit pour d'anciennes versions de MT4.


Veuillez indiquer comment traiter ce code pour éviter les erreurs.

erreur

return' - la fonction doit retourner une valeur.

1. Est-il correct de le faire ?


2. Question, quel est le problème d'écrire du code pour les nouvelles constructions en utilisant les connaissances du tutoriel (je veux dire le facteur d'âge de l'information) ?



  1. Vous avez raison de renvoyer des valeurs à partir de fonctions non nulles, mais il est préférable de passer aux nouvelles constructions - il n'y a rien de compliqué.
  2. Ecrivez, n'oubliez pas d'insérer la directive #property strict au début du code - où toutes les directives sont écrites, lisez les codes d'erreur - leurs descriptions sont dans la documentation, et tout sera bien et pas compliqué.
 
Artyom Trishkin:
  1. Parcourez la liste des positions fermées, en sélectionnant celles dont l'heure de clôture est supérieure à l'heure de début du jour souhaité.

Merci, je trouve les prix ouverts des positions fermées au moment requis dans le premier cycle. Ils apparaissent tous sur l'imprimante et je dois passer des commandes pour eux.

Le tableau est un peu un casse-tête pour moi, veuillez me conseiller comment insérer les cycles à vérifier et les mettre au prix d'ouverture dans le premier cycle de recherche de ces prix.

Donc, met sur le prix du plus ancien dont j'ai besoin, comment passer au prix suivant trouvé ?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

Merci, je trouve les prix d'ouverture des positions fermées au bon moment dans le premier cycle. Ils apparaissent tous sur l'imprimante et je dois passer des commandes pour eux.

Le tableau est un labyrinthe pour moi, dites-moi comment mettre les cycles à vérifier et à mettre au prix d'ouverture dans la première boucle pour trouver ces prix.

Il est plus rapide de comprendre ce que sont les tableaux que de corriger ce que vous avez fait.

D'autant plus que les tableaux ne sont pas simples, mais très simples.

Le chargeur AK peut contenir 30 cartouches - c'est un ensemble de taille 30. Et les cartouches sont les données stockées dans la matrice.

Il est vrai que ce n'est pas un bon exemple - vous ne pouvez pas obtenir le troisième à moins d'obtenir 0, 1 et 2.

Imaginez une feuille de calcul :

Indice 0
Index 1
Index 2
Index 3
Index 4
Index5.Index6.Index 7
Index 8
Index 9
Valeur 1
Valeur de l'indice 2
Valeur 3
Valeur 4
Valeur 5
Valeur 6
Valeur 7
Valeur 8
Valeur 9
Valeur 10

Voici un tableau unidimensionnel simple de taille 10.

La valeur 1 est stockée dans la cellule d'indice 0, la valeur 2 est stockée dans la cellule d'indice 1, la valeur 3 est stockée dans la cellule d'indice 2, ...
...
La valeur 8 est enregistrée dans la cellule d'index 7, la valeur 9 est enregistrée dans la cellule d'index 8, la valeur 10 est enregistrée dans la cellule d'index 9.

C'est aussi simple que cela. Pour obtenir la valeur 3, vous devez vous référer au tableau - sa cellule 2 : Valeur3=Tableau[2] ;