Hola.Me inspiréen la lección "Uso de estructuras para el desarrollo eficaz de programas"y creé una estructura sencilla como ésta en 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(); // своп
}
}
}
//+------------------------------------------------------------------+
En la estructura
ESTRUCTURA_POSICIÓN
La estructura contiene el método
GetCurrentPositionProperty(void)
que calcula y asigna valores a los elementos de la estructura. Definir el cuerpo del método fuera de la estructura. Para ello, utilice la operación de resolución de contexto (::).
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
Este es el punto que debe dar acceso a la función, que a su vez utiliza el contexto de la estructura.Esto es lo que he entendido de los libros de texto. Pero no puedo entender por qué no funciona.
Código: (sólo llamar a una función - función EA, no un método de estructura - que tiene más sentido)
//+------------------------------------------------------------------+//| 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(); // своп
}
}
}
//+------------------------------------------------------------------+
Código: (sólo llamar a una función - función EA, no un método de estructura - que tiene más sentido)
¿Así que usar :: fue una idea inútil?
Entonces, ¿por qué escribió la función
GetCurrentPositionProperty()
dentro de la estructura? Llenaría la estructura sin ningún relleno en su interior, ¿no es así? Por favor, aclárense, estoy confundido, ¿tal vez sea una función obsoleta, debería olvidarme de ella?
dentro de la estructura??? Es decir, llenará la estructura perfectamente incluso sin ella. Por favor, aclárense, estoy confundido, tal vez sea una idea obsoleta que debería olvidarse.
Copiar y pegar. Queda una línea después del copypaste.
Debería ser así (no hay métodos dentro de la estructura)
Copiar y pegar. Queda una línea después del copypaste.
Debería ser así (no hay métodos dentro de la estructura)
Bueno, he pasado mucho tiempo en la lección. Aunque era para MT4, allí se presentaba como un truco, así que aquí hay un extracto del texto:
1
2
3
4
5
6
7
8
9
10
11
12
struct state
{
int buy_count; // número de órdenes de compra
int sell_count; // número de órdenes de venta
double buy_bottom_price; //precio de apertura de la orden de compra más baja
double sell_top_price; //precio de apertura de la orden de venta más alta
double profit; // beneficio de todos los pedidos
// método para recoger información sobre el estado de la cuenta
// y refrescar los elementos de la estructura
void Refresh() ;
} Estado;
La estructura tiene un métodoRefresh() que calcula y asigna valores a los elementos de la estructura. Vamos a definir el cuerpo del método fuera de la estructura. Para ello, utilice la operación de resolución de contexto (::). El contexto es un descriptor (nombre) de la estructura:
si (Precio_abierto<precio_inferior_de_compra || precio_inferior_de_compra==0)
buy_bottom_price=Precio Abierto;
romper ;
caso OP_SELL:
vender_cuentas++;
si (Precio_abierto>precio_de_venta ||precio_de_venta==0)
sell_top_price=Precio Abierto;
romper ;
}
}
}
Nótese que en el cuerpo del método nos referimos a los elementos de la estructura sin utilizar un punto, ya que utilizamos la operación de resolución de contexto. Los campos numéricos se ponen a cero medianteZeroMemory() con la palabra clave this antes de actualizarlos al principio del cuerpo del método, por lo que la estructura pasa una referencia a sí misma.
El código principal de EA dentro del manejador OnTick() ahora se verá así
En la estructura
ESTRUCTURA_POSICIÓN
La estructura contiene el método
GetCurrentPositionProperty(void)
que calcula y asigna valores a los elementos de la estructura. Definir el cuerpo del método fuera de la estructura. Para ello, utilice la operación de resolución de contexto (::).
En OnTick() llamamos a la función:
void OnTick() { //--- STRUCT_POSITION.GetCurrentPositionProperty(); }
Y aquí obtenemos un error:
'.' - nombre esperado eSower_and_Gather_5.mq5 69 19
No sé dónde ha ido mal, por favor, ayuda.
'.' - nombre esperado eSower_and_Gather_5.mq5 69 19
¿Qué es la línea 69 19? Por favor, publique la línea de código 69 y especifique dónde está la posición 19. Inmediatamente se verá dónde está el error.
¿Qué es la línea 69 19? Contabilice la línea 69 y especifique dónde está la posición 19. Inmediatamente se verá dónde está el error.
STRUCT_POSITION.GetCurrentPositionProperty();Está resaltado en rojo en el post anterior. Gracias por su pronta respuesta.
¿Qué es la línea 69 19? Contabilice la línea 69 y especifique dónde está la posición 19. Inmediatamente se verá dónde está el error.
Este es un punto que debe dar acceso a una función que a su vez utiliza el contexto de la estructura. Pero no puedo entender por qué no funciona.
está resaltado en rojo en el post anterior. Gracias por su pronta respuesta.
STRUCT_POSITION' es un TIPO DE DATOS. Es necesario crear una variable con este tipo y luego llamar a VARIABLE.GetCurrentPositionProperty();
Este es el punto que debe dar acceso a la función, que a su vez utiliza el contexto de la estructura.Esto es lo que he entendido de los libros de texto. Pero no puedo entender por qué no funciona.
Código: (sólo llamar a una función - función EA, no un método de estructura - que tiene más sentido)
STRUCT_POSITION' es un TIPO DE DATOS. Es necesario crear un objeto con este tipo y luego llamar a OBJECT.GetCurrentPositionProperty();
Lo he probado. Dicho objeto se crea, se declara justo después de la declaración del
StrPositionArray[].
Si lo pones en OnTick
obtenemos un error:
']' - expresión esperada eSower_and_Gather_5.mq5 69 21
Código: (sólo llamar a una función - función EA, no un método de estructura - que tiene más sentido)
¿Así que usar :: fue una idea inútil?
Entonces, ¿por qué escribió la función
dentro de la estructura? Llenaría la estructura sin ningún relleno en su interior, ¿no es así? Por favor, aclárense, estoy confundido, ¿tal vez sea una función obsoleta, debería olvidarme de ella?
¿Así que usar :: fue una pérdida de tiempo?
Entonces, ¿por qué escribir una función
dentro de la estructura??? Es decir, llenará la estructura perfectamente incluso sin ella. Por favor, aclárense, estoy confundido, tal vez sea una idea obsoleta que debería olvidarse.
Copiar y pegar. Queda una línea después del copypaste.
Debería ser así (no hay métodos dentro de la estructura)
Copiar y pegar. Queda una línea después del copypaste.
Debería ser así (no hay métodos dentro de la estructura)
Bueno, he pasado mucho tiempo en la lección. Aunque era para MT4, allí se presentaba como un truco, así que aquí hay un extracto del texto:
La estructura tiene un método Refresh() que calcula y asigna valores a los elementos de la estructura. Vamos a definir el cuerpo del método fuera de la estructura. Para ello, utilice la operación de resolución de contexto (::). El contexto es un descriptor (nombre) de la estructura:
Nótese que en el cuerpo del método nos referimos a los elementos de la estructura sin utilizar un punto, ya que utilizamos la operación de resolución de contexto. Los campos numéricos se ponen a cero mediante ZeroMemory() con la palabra clave this antes de actualizarlos al principio del cuerpo del método, por lo que la estructura pasa una referencia a sí misma.
El código principal de EA dentro del manejador OnTick() ahora se verá así