// Lectura/Escritura de campos privados de estructuras simples#include <TypeToBytes.mqh>
template <typename T>
struct STRUCT
{
private:
T Data; // campo privadopublic:
T GetData( void ) const
{
return(this.Data);
}
};
voidOnStart()
{
STRUCT<int> Struct = {0};
_W(Struct) = 2; // Acceso de escritura al campo privadoPrint(Struct.GetData()); // asegúrese de que esPrint(_R(Struct)[0]); // Acceso de lectura a campo privado
}
La biblioteca prescribe una clase contenedora que almacena variables y matrices de cualquier otro tipo simple en una matriz de un tipo determinado.
// Ejemplo de trabajo con un contenedor#include <TypeToBytes.mqh>
#define PRINT(A) Print(#A + " = " + (string)(A));
voidOnStart()
{
// Datos arbitrarios para el ejemplostring Str[] = {"123", "Hello World!"};
double Num = 5;
MqlTick Tick = {0};
Tick.bid = 1.23456;
CONTAINER<long> Container; // Crear un contenedor - todo será almacenado en un array de un tipo simple (long es el elegido en el ejemplo)// Llenar el contenedor con datos diferentes
Container[0] = Str;
Container[1] = Num;
Container[2] = Tick;
ArrayPrint(Container.Data); // Salida del contenido del array en el que el contenedor almacena todos los datos// Imprimir los tipos de datos almacenados en el contenedorfor (int i = 0; i < Container.GetAmount(); i++)
PRINT(Container[i].GetType())
// Obtengamos los datos propiamente dichos string Str2[];
Container[0].Get(Str2); // Obtenido el array
ArrayPrint(Str2);
PRINT(Container[1].Get<double>()) // Tenemos un número
PRINT(Container[2].Get<MqlTick>().bid) // Tenemos la estructura
Container[1] = "Replace"; // Datos sustituidos por índice// Verificar que se ha producido la sustitución
PRINT(Container[1].GetType())
PRINT(Container[1].Get<string>())
}
fxsaber: La biblioteca contiene una clase contenedora que almacena variables y matrices de cualquier otro tipo simple en una matriz de un tipo determinado.
string Str;
REPORT::ToString(Str);
double Balance[];
REPORT::GetBalanceHistory(Balance);
#ifdef __TYPETOBYTES__
CONTAINER<uchar> Container;
Container[0] = Str; // poner la cadena del informe en el contenedor
Container[1] = Balance; // añadimos también al contenedor un array doble con el histórico de cambios de saldo
::FrameAdd(NULL, 0, ::AccountInfoDouble(ACCOUNT_BALANCE), Container.Data); // Envió de un marco con informe de cadena y matriz de saldo#else // __TYPETOBYTES__
Recibir una trama con datos diferentes
CONTAINER<uchar> Container;
while (::FrameNext(Pass, Name, ID, Value, Container.Data))
{
string Str;
Container[0].Get(Str); // Obtener la cadena de informe del marcodouble Balance[];
Container[1].Get(Balance); // Obtener la matriz doble correspondiente del marco// .....
Necesitas usar Frame Mode para escribir los datos de los Agentes en un solo archivo.
// Ejemplo de grabación de datos de Agentes (incluyendo Agentes Cloud) en un ficheroinputint Range = 0;
voidOnTick()
{
// ....
}
// Abrir el archivo sólo en los modos Ejecución única o Fotograma.constint handle = ((MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION)) || MQLInfoInteger(MQL_FRAME_MODE)) ?
FileOpen(__FILE__, FILE_WRITE | FILE_TXT) : INVALID_HANDLE;
// Preparación de datosvoid GetData( string &Str, MqlTick &Ticks[], double &Balance )
{
Str = "Hello World!";
CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 2); // Últimos dos ticks (ejemplo)
Balance = AccountInfoDouble(ACCOUNT_BALANCE);
}
// Escritura de datosvoid SaveData( conststring &Str, constMqlTick &Ticks[], constdouble Balance )
{
FileWrite(handle, Str);
for (int i = 0; i < ArraySize(Ticks); i++)
FileWrite(handle, Ticks[i].bid);
FileWrite(handle, Balance);
}
voidOnTesterDeinit()
{
if (handle != INVALID_HANDLE)
FileClose(handle);
ChartClose();
}
#include <TypeToBytes.mqh> // https://www.mql5.com/es/code/16280doubleOnTester()
{
string Str;
MqlTick Ticks[];
double Balance;
GetData(Str, Ticks, Balance); // Preparación de los datos para el registroif (MQLInfoInteger(MQL_OPTIMIZATION)) // Optimización
{
CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
Container[0] = Str;
Container[1] = Ticks;
Container[2] = Balance;
FrameAdd(NULL, 0, 0, Container.Data); // Envío de datos del Agente al Terminal
}
else// Ejecución única
{
if (handle != INVALID_HANDLE)
SaveData(Str, Ticks, Balance); // Los datos se escribirán en la carpeta MQL5\Files del Agente (no en el Terminal)FileClose(handle);
}
return(0);
}
voidOnTesterPass()
{
if (handle != INVALID_HANDLE)
{
ulong Pass;
string Name;
long ID;
double Value;
CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205while (FrameNext(Pass, Name, ID, Value, Container.Data))
{
string Str;
MqlTick Ticks[];
double Balance;
// Datos recibidos del Agente
Container[0].Get(Str);
Container[1].Get(Ticks);
Container[2].Get(Balance);
// FileWrite(handle, Pass); // Si desea escribir el número del pasaje
SaveData(Str, Ticks, Balance); // Los datos se escribirán en la carpeta MQL5\Files del Terminal (no en el Agente)
}
}
}
Dos líneas con el mismo resultado
La biblioteca contiene una clase contenedora que almacena variables y matrices de cualquier otro tipo simple en una matriz de un tipo determinado.
Ejemplo de aplicación práctica en Report-bible
Enviar una trama con datos diferentes
Recibir una trama con datos diferentes
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading
Preguntas de los principiantes MQL5 MT5 MetaTrader 5
fxsaber, 2017.08.23 14:10
Necesitas usar Frame Mode para escribir los datos de los Agentes en un solo archivo.
Foro sobre comercio, sistemas automatizados de comercio y prueba de estrategias comerciales
Nueva versión de MetaTrader 5 build 1640: crear y probar sus propios instrumentos financieros
fxsaber, 2017.10.10 07:51
Foro sobre comercio, sistemas automatizados de comercio y prueba de estrategias comerciales
Versión beta de MetaTrader 5 build 1995: calendario económico, programas MQL5 como servicios y API para lenguaje R
fxsaber, 2019.02.18 16:36
Hola. Está funcionando.
Así es como funciona.
Lo conseguí de aquí para MT4
https://www.mql5.com/ru/forum/5905/page11#comment_6134460Es así.