Discusión sobre el artículo "La escritura de un Expert Advisor mediante las librerías estándar de las clase de trading de MQL5"

 

Artículo publicado La escritura de un Expert Advisor mediante las librerías estándar de las clase de trading de MQL5:

En este artículo se describe la manera de utilizar las principales funcionalidades de la librería estándar de las clases de trading de MQL5 en la escritura de Expert Advisors que implementa el cierre y la modificación de una posición, colocar una orden pendiente y comprobar el margen antes de colocar una operación. También hemos demostrado cómo utilizar las clases de trading en la obtención de los detalles de una orden y una operación.

Procesamiento de una orden

Autor: Samuel

 

Artículo muy útil para mí. ¡Todo es mucho más fácil si se utilizan bibliotecas!

Petición a los desarrolladores: escribir una clase para trabajar con High[i] , Low[i]. Abrir[i], Cerrar[i]. ¡Creo que esta clase será útil para todos! He resuelto este problema por mí mismo, pero no estoy seguro de que es correcto, porque las pruebas lleva mucho tiempo....

 
Consulte la sección Grupo de clase Timeseries
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

por qué este código da error

1.mq5' 1.mq5 1 1

Series.mqh' Series.mqh 1 1

ArrayObj.mqh' ArrayObj.mqh 1 1

Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

StdLibErr.mqh' StdLibErr.mqh 1 1

ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - declaración sin tipo 1.mq5 12 2

1 error(es), 0 advertencia(s) 2 1

en todos los ejemplos no es necesario declarar el tipo...

si no es difícil escribir como obtener

Imprimir Alto[2], por ejemplo.

 
dimeon:

por qué este código da error


no es necesario declarar el tipo en todos los ejemplos...

si no es difícil, por favor escriba cómo obtener

Imprimir High[2], por ejemplo.

hay un error tipográfico en la documentación. Esta clase se encuentra en el archivo TimeSeries.mqh.

Ejemplo de uso (el script imprime los tres últimos Highs del gráfico actual):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Fallo al recuperar ",count,"datos de series temporales".);
     }
   else Print("Error al crear series temporales".);
  }
//+------------------------------------------------------------------+
 
Quantum:

hay un error tipográfico en la documentación. Esta clase se encuentra en el archivo TimeSeries.mqh.

Ejemplo de uso (el script muestra los tres últimos máximos del gráfico actual):

Muchas gracias. Me he estado devanando los sesos.
 

Entiendo que cada uno programa para sí mismo y sus necesidades, pero fundamentalmente no me gusta el Grupo de clases de series de tiempo, porque básicamente todos consisten en un método y la parte descriptiva más que la funcionalidad, y por lo general es necesario tener todas las series de tiempo para una herramienta en particular, hice una clase en la que hay todas las series de tiempo para la herramienta necesaria, en los métodos se realiza mediante la paginación de la historia, aproximadamente así:

struct str_bars{
   datetime    time[];     // Matriz de series de tiempo que contiene la hora de apertura de cada barra del gráfico actual
   double      open[];     // Matriz de series temporales que contiene los precios de apertura de cada barra del gráfico actual.
   double      close[];    // Matriz de series temporales que contiene los precios de cierre de cada barra del gráfico actual.
   double      high[];     // Matriz de series temporales que contiene los precios máximos de cada barra del gráfico actual.
   double      low[];      // Un array de series temporales que contiene los precios mínimos de cada barra del gráfico actual.
};
struct str_info{
   double   point;         // Tamaño actual del punto del instrumento en la divisa de cotización
   int      spread;        // Diferencial actual
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // datos de tick
      str_bars  BAR;       // datos de series temporales
      str_info INFO;       // información sobre la herramienta
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Trabajo con mi clase solo en la parte de datos ya preparados, y por supuesto la propia clase recibe datos llamando al método refresh()

 
Artículo útil
 

hay una inexactitud en el artículo

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // precio del lote/número de margen necesario

debería ser

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- precio del lote/número de margen requerido
 

Gran artículo. Muchas gracias al autor. También me gustaría escribir una comprobación de Stop_Level antes de colocar una orden, y una comprobación del valor del spread. La cosa es que si el spread es flotante, entonces en valores altos no se puede entrar en el mercado, porque no es rentable. Esto ayudará al Asesor Experto a no operar durante las noticias. También me gustaría comprobar la desviación - el razonamiento es similar. Y también hay una pregunta sobre la biblioteca: ¿qué es una función (qué tipo de proceso denota y describe)?

FreezeLevel

Obtiene la distancia de las operaciones de congelación en puntos.

int CongelarNivel() const

en lenguaje sencillo - por favor, explíquelo si lo conoce.

Y una pregunta más. Podemos averiguar los límites, por ejemplo, Stop_Level en el momento actual (digamos 10 puntos). Colocamos una orden pendiente con SL=10 puntos. Después de, por ejemplo, una hora el precio alcanza el precio especificado en la orden, pero Stop_Level en este momento es igual a, por ejemplo, 15 pips. ¿Qué ocurrirá - funcionará la orden pendiente o será rechazada? Además, cuando el precio alcanza el precio especificado en la orden, pero el spread ha cambiado - ¿significa que la entrada o salida es posible a un precio peor en relación al precio esperado que había en el momento de abrir la orden, o la orden no funcionará en absoluto?

 

¿Qué estoy haciendo mal? ¿Por qué no se imprime la oferta?

Aquí está el registro de trabajo


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

Aquí está el código

#include <Trade\SymbolInfo.mqh>  //--- Clase CSymbolInfo
CSymbolInfo    my_symbol;        //--- Objeto de clase CSymbolInfo
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+