Questions des débutants MQL5 MT5 MetaTrader 5 - page 1264

 
Bonjour.Je me suis inspiréde la leçon " Utiliser les structures pour un développement efficace du programme"et j'ai créé une structure simple comme celle-ci dans MT5.
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
   
   void               GetCurrentPositionProperty();
  };
  STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   STRUCT_POSITION.GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//---Заполнение массива свойств позиций                              +
//+------------------------------------------------------------------+
void STRUCT_POSITION::GetCurrentPositionProperty(void)
{   
   ZeroMemory(this);
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
      {
         if(m_position.SelectByIndex(i))
            {
               StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
               StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
               StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
               StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
               StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
               StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
               StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
               StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
               StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
               StrPositionArray[i].comission  = m_position.Commission();              // комиссия
               StrPositionArray[i].swap       = m_position.Swap();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

Dans la structure

STRUCT_POSITION

la structure contient une méthode

GetCurrentPositionProperty (void)

qui calcule et attribue des valeurs aux éléments de la structure. Définissez le corps de la méthode en dehors de la structure. Pour ce faire, utilisez l'opération de résolution de contexte (: :).

Dans OnTick() nous appelons la fonction :

void OnTick() { //--- STRUCT_POSITION.GetCurrentPositionProperty() ; }

Et là, nous avons une erreur :

'.' - nom attendu eSower_and_Gather_5.mq5 69 19
Je ne sais pas où cela a mal tourné, aidez-moi s'il vous plaît.

 
Sergey Voytsekhovsky:

'.' - nom attendu eSower_and_Gather_5.mq5 69 19

Qu'est-ce que la ligne 69 19 ? Veuillez publier la ligne de code 69 et préciser où se trouve la position 19. Vous verrez immédiatement où se trouve l'erreur.

 
Vladimir Karputov:

Qu'est-ce que la ligne 69 19 ? Affichez la ligne de code 69 et précisez où se trouve la 19e position. Vous verrez immédiatement où se trouve l'erreur.

STRUCT_POSITION.GetCurrentPositionProperty();

Il est souligné en rouge dans le message ci-dessus. Merci pour votre réponse rapide.

 
Vladimir Karputov:

Qu'est-ce que la ligne 69 19 ? Affichez la ligne de code 69 et précisez où se trouve la 19e position. Vous verrez immédiatement où se trouve l'erreur.

C'est un point qui doit donner accès à une fonction qui, à son tour, utilise le contexte de la structure. Mais je ne comprends pas pourquoi cela ne fonctionne pas.

 
Sergey Voytsekhovsky:

il est surligné en rouge dans le post ci-dessus. Merci pour votre réponse rapide.

STRUCT_POSITION' est un TYPE DE DONNÉES. Vous devez créer une variable de ce type, puis appeler VARIABLE.GetCurrentPositionProperty() ;

Документация по MQL5: Основы языка / Типы данных
Документация по MQL5: Основы языка / Типы данных
  • www.mql5.com
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
 
Sergey Voytsekhovsky:

C'est le point qui doit donner accès à la fonction, qui à son tour utilise le contexte de la structure.C'est ce que j'ai compris des manuels. Mais je ne comprends pas pourquoi ça ne marche pas.

Code : (il s'agit simplement d'appeler une fonction - une fonction EA, pas une méthode de structure - cela a plus de sens)

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>
//---
CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий

   void               GetCurrentPositionProperty();
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//| Заполнение массива свойств позиций                               |
//+------------------------------------------------------------------+
void GetCurrentPositionProperty(void)
  {
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
     {
      if(m_position.SelectByIndex(i))
        {
         StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
         StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
         StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
         StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
         StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
         StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
         StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
         StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
         StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
         StrPositionArray[i].comission  = m_position.Commission();              // комиссия
         StrPositionArray[i].swap       = m_position.Swap();                    // своп
        }
     }
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

STRUCT_POSITION' est un TYPE DE DONNÉES. Vous devez créer un objet de ce type, puis appeler OBJECT.GetCurrentPositionProperty() ;

Je l'ai essayé. Un tel objet est créé, déclaré juste après la déclaration de l'objet

StrPositionArray[].

Si vous le mettez dans OnTick

void OnTick()
  {
//---
   StrPositionArray[].GetCurrentPositionProperty();
  }

nous obtenons une erreur :

']' - expression attendue eSower_and_Gather_5.mq5 69 21

C'est la même ligne, seulement la deuxième parenthèse, celle juste avant le point.
 
Vladimir Karputov:

Code : (il s'agit simplement d'appeler une fonction - une fonction EA, pas une méthode de structure - cela a plus de sens)

Donc utiliser : : était une idée futile ?

Alors pourquoi avez-vous écrit la fonction

GetCurrentPositionProperty()

à l'intérieur de la structure ? Il remplirait la structure sans qu'il y ait de remplissage à l'intérieur, n'est-ce pas ? Peut-être s'agit-il d'une fonctionnalité obsolète, que je devrais oublier ?

 
Sergey Voytsekhovsky:

Donc utiliser : : était une perte de temps ?

Alors pourquoi écrire une fonction

à l'intérieur de la structure ? ?? Je veux dire, il remplira parfaitement la structure même sans lui. Veuillez clarifier, je suis confus, peut-être est-ce une idée obsolète qui devrait être oubliée.

Copier-coller. Il reste une ligne après le copier-coller.

Cela devrait être comme ceci (il n'y a pas de méthodes à l'intérieur de la structure)

//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
Vladimir Karputov:

Copier-coller. Il reste une ligne après le copier-coller.

Cela devrait être comme ceci (il n'y a pas de méthodes à l'intérieur de la structure)

Eh bien, j'ai passé tellement de temps sur la leçon. Bien qu'elle soit destinée à MT4, elle y était présentée comme une astuce, voici donc un extrait du texte :

1
2
3
4
5
6
7
8
9
10
11
12
struct state
{
int buy_count ; // nombre d'ordres d'achat
int sell_count ; // nombre d'ordres de vente
double buy_bottom_price ; //prix d'ouverture de l'ordre d'achat le plus bas
double sell_top_price ; //prix d'ouverture de l'ordre de vente le plus élevé
double profit ; // profit de tous les ordres
// méthode de collecte d'informations sur l'état du compte
// et rafraîchir les éléments de la structure
void Refresh() ;
} État ;

La structure possède une méthode Refresh() qui calcule et attribue des valeurs aux éléments de la structure. Définissons le corps de la méthode en dehors de la structure. Pour ce faire, nous utilisons l'opération de résolution de contexte (: :). Le contexte est un descripteur (nom) de la structure :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//+------------------------------------------------------------------+
//| La méthode recueille des informations sur l'état actuel du compte //|.
//| et met à jour les champs pertinents de la structure |
//+------------------------------------------------------------------+
void state::Refresh( void )
{
//zéro les champs numériques de la structure
ZeroMemory( this ) ;
for ( int i=OrdersTotal()-1 ; i>=0 ; i--)
si (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
si (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
double OpenPrice=OrderOpenPrice() ;
profit+=OrderProfit()+OrderCommission()+OrderSwap() ;
switch (OrderType())
{
cas OP_BUY :
acheter_count++ ;
si (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice ;
pause ;
cas OP_SELL :
vendre_count++ ;
si (OpenPrice>sell_top_price || sell_top_price==0)
sell_top_price=OpenPrice ;
pause ;
}
}
}

Notez que dans le corps de la méthode, nous faisons référence aux éléments de la structure sans utiliser de point, puisque nous avons utilisé l'opération de résolution de contexte. Les champs numériques sont mis à zéro par ZeroMemory() avec le mot-clé this avant d'être mis à jour au début du corps de la méthode, de sorte que la structure passe une référence à elle-même.

Le code principal de l'EA à l'intérieur du gestionnaire OnTick() ressemblera maintenant à ceci

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//+------------------------------------------------------------------+
//| Fonction tick expert|
//+------------------------------------------------------------------+
void OnTick()
{
for ( int i=0 ; i<2000 ; i++)
{
double b=MathSqrt(i) ;
}
// ouvrir de nouveaux ordres et prendre des bénéfices uniquement à l'ouverture d'une nouvelle barre.
si (IsNewBar())
{
// obtenir un nouveau signal
int Signal=GetSignal() ;
// quittez immédiatement la fonction si le signal n'a pas été généré sur la barre fermée.
si (Signal<0)
retour ;
//rafraîchir la structure
State.Refresh() ; // ( !!! )