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 |//+------------------------------------------------------------------+structSTRUCT_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; // комментарийvoidGetCurrentPositionProperty();
};
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---STRUCT_POSITION.GetCurrentPositionProperty();
}
//+------------------------------------------------------------------+//---Заполнение массива свойств позиций +//+------------------------------------------------------------------+voidSTRUCT_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 (: :).
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.
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.
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
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 |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
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(); // своп
}
}
}
//+------------------------------------------------------------------+
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 ?
à 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)
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éthodeRefresh() 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 :
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 parZeroMemory() 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
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.
'.' - 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.
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.
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.
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() ;
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)
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
nous obtenons une erreur :
']' - expression attendue eSower_and_Gather_5.mq5 69 21
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
à 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 ?
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)
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 :
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 :
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