Librerías: TradeTransactions - página 4

 

Según las primeras pruebas, asumo que para double y datetime debemos hacer recursos separados y nombre de variables globales. ¿Es esto correcto?

const RESOURCEDATA<double>ResourceDouble("::Double_"+__FILE__); 
const RESOURCEDATA<datetime>ResourceTime("::Time_"+__FILE__); 

int OnInit()
  {
   _GlobalVariableSet("ResourceName",ResourceDouble.GetFullName()); 
   Print(" ResourceDouble.GetFullName(): ",ResourceDouble.GetFullName());

   _GlobalVariableSet("ResourceName1",ResourceTime.GetFullName());  
   Print(" ResourceTime.GetFullName(): ",ResourceTime.GetFullName());   
   
//---
   return(INIT_SUCCEEDED);
  }
 
Nauris Zukas:

Según las primeras pruebas, asumo que para double y datetime debemos hacer recursos separados y nombre de variables globales. ¿Es esto correcto?

Lamentablemente, es muy difícil llegar a tu nivel de dominio del lenguaje de programación. Quizás alguien más te lo explique.

 
fxsaber:

Por desgracia, es muy difícil llegar a tu nivel de dominio del lenguaje de programación. Quizás alguien más te lo explique.

Bueno, lo principal es que todo me funciona hasta ahora.

Archivos adjuntos:
 
fxsaber:

Actualiza ResourceData.mqh y prueba estos indicadores



Buenas tardes ¿No se puede pasar del .mqh al indicador? ¿O hay algún truco para que no se reinicie cada vez al compilar el indicador? Hice una variante así, pero se reinicia al compilar el indicador:

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166
#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

const RESOURCEDATA<MqlTick>m_Resource("::"+__FILE__); // Recurso para la transferencia de datos (ticks)

class CMyTicks
  {
protected:
public:
   //+------------------------------------------------------------------+
   //| Constructor.|
   //+------------------------------------------------------------------+ 
   void CMyTicks()
     {
      _GlobalVariableSet("ResourceName",m_Resource.GetFullName()); // Escribe el nombre completo del recurso (sólo lectura) en la variable global 
     }
   //+------------------------------------------------------------------+
   //| Destructor.|
   //+------------------------------------------------------------------+ 
   void ~CMyTicks()
     {
      //_GlobalVariableDel("NombreRecurso");
     }

   //+------------------------------------------------------------------+ 
   void CollectTicks()
     {
      MqlTick m_Ticks[];
      CopyTicks(_Symbol,m_Ticks,COPY_TICKS_ALL,0,5); // Datos generados
      m_Resource=m_Ticks; // Grabación de los datos
     }

  };
//+------------------------------------------------------------------+
// Recuperación de datos
#property indicator_chart_window
#property indicator_plots 0

#include <Test_Keep_Info_13.mqh>
CMyTicks  Test;

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166
#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

static const RESOURCEDATA<MqlTick>Resource(_GlobalVariableGet<string>("ResourceName")); // Creado un recurso basado en el nombre completo pasado en la variable global 
MqlTick Ticks[];

int OnCalculate(const int rates_total,const int prev_calculated,const int,const double &[])
  {
   if(prev_calculated==0)
     {
      Resource.Get(Ticks); // Leer datos del recurso.
      ArrayPrint(Ticks);   // Imprimir los datos obtenidos

      if(ArraySize(Ticks)<1)
        {
         Test.CollectTicks();
         Print(" SAVE TICKS ");
        }

      Resource.Get(Ticks); // Leer datos del recurso.
      ArrayPrint(Ticks);   // Imprimir los datos obtenidos
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Y en la cuenta de "alguien más va a explicar", así que ya sé la respuesta, será "preguntar al autor". ¡Gracias!

 
Nauris Zukas:


Buenas tardes ¿No se puede transferir de .mqh al indicador? ¿O hay algún truco para que no se reinicie cada vez que se compila el indicador? Hice una variante así, pero se reinicia al compilar el indicador:

Y por aquello de "alguien me lo explicará", así que ya sé la respuesta, será "preguntar al autor". Gracias.

Por desgracia, no puedo entender la pregunta.

 
fxsaber:

Por desgracia, no entiendo la pregunta.

El objeto es estático, pero los datos se destruyen. ¿Qué está mal en mi ejemplo?

 
Nauris Zukas:

El objeto es estático, pero los datos se destruyen. ¿Qué está mal en mi ejemplo?

Desafortunadamente, tienes grandes lagunas en tu comprensión de la programación orientada a objetos, por lo que no estás consiguiendo lo que pretendías. Pregunta en el foro por ayuda con cuestiones generales de POO.

 
fxsaber:

Desafortunadamente, tienes grandes lagunas en tu comprensión de la programación orientada a objetos, por lo que no funciona como se pretendía. Pide ayuda en el foro sobre cuestiones generales de programación orientada a objetos.

Ok, gracias.

 

Las fuentes de la biblioteca contienen Convert.mqh, que convierte rápidamente una matriz de un tipo en una matriz de otro tipo.

 

Puedes intercambiar cualquier cosa a través de Recursos.

// Ejemplo de intercambio de cualquier dato (incluyendo matrices de cadenas).

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{    
  // Datos arbitrarios para el ejemplo
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource; // Recurso para compartir datos
  CONTAINER<uint> Container;         // Crear un contenedor - todo será almacenado en un array de un tipo simple (uint es el elegido en el ejemplo)
  
  // Llenar el contenedor con datos diferentes
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // Imprimir los tipos de datos almacenados en el contenedor
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Enviar los datos para su intercambio
  
  CONTAINER<uint> Container2; // Aquí es donde obtendremos los datos
  
  Resource.Get(Container2.Data); // Tengo los datos
      
  // Obtener los datos en su forma original
  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  
}