Características del lenguaje mql5, sutilezas y técnicas - página 18

 
Dennis Kirichenko:
¿Y puedo preguntar por qué estática?

Porque se ha sacado de contexto - ver el post original.
 

característica no documentada de la función OnInit(), esta función puede ejecutarse en cualquier parte del programa. Código de prueba.

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

Resultado

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
Sergey Gritsay:

una característica no documentada de la función OnInit(), esta función puede ser ejecutada en cualquier parte del programa. Código de prueba.


Todas las funciones On son funciones normales y, por lo tanto, pueden ser llamadas cuando se desee. OnCalculate o OnTradeTransaction.
 
fxsaber:

Todas las funciones On son funciones normales y, por lo tanto, pueden ser llamadas siempre que se quiera. O bien OnCalculate o bien OnTradeTransaction.


Pero no está escrito en la documentación

OnInit

La función OnInit() es el manejador del evento OnInit. Puede ser de tipovoid oint, y no tiene parámetros:

voidOnInit();

El evento Init se genera inmediatamente después de cargar un Asesor Experto o un indicador, este evento no se genera para los scripts. La función OnInit() se utiliza para la inicialización. Si OnInit() tiene el valor de retorno int, el código de retorno distinto de cero significa que la inicialización no fue exitosa, y genera el eventoDeinit con el código de razón de desinicializaciónREASON_INITFAILED.

Para optimizar los parámetros de entrada de un experto, se recomienda utilizar los valores de la enumeraciónENUM_INIT_RETCODE como códigos de retorno. Estos valores se utilizan para controlar el curso de la optimización, incluida la selección de los agentes deprueba más adecuados. Durante la inicialización de un Asesor Experto antes del inicio de las pruebas se puede solicitar información sobre la configuración y los recursos de un agente (el número de núcleos, la cantidad de memoria libre, etc.) utilizando la funciónTerminalInfoInteger(). Basándose en la información obtenida, puede permitir el uso de este agente de pruebas, o rechazar su uso durante la optimización de este Asesor Experto.

ENUM_INIT_RETCODE

Identificador

Descripción

INIT_SUCCEED

Si la inicialización es satisfactoria, se puede seguir probando el Asesor Experto.

Este código significa lo mismo que cero - la inicialización del Asesor Experto en el probador fue exitosa.

INIT_FAILED

La inicialización ha fallado, las pruebas no tienen sentido debido a errores irrecuperables. Por ejemplo, no crear un indicador que se requiere para el trabajo del Asesor Experto.

La devolución de este valor significa lo mismo que la devolución de un valor distinto de cero: la inicialización del Asesor Experto en el probador ha fallado.

INIT_PARAMETERS_INCORRECT

Diseñado para indicar al programador un conjunto incorrecto de parámetros de entrada. La cadena de resultados que contenga este código de retorno se resaltará en rojo en la tabla de optimización general.

La prueba de este conjunto de parámetros del Asesor Experto no se ejecutará y el agente está libre para recibir una nueva tarea.

Al recibir este valor, se garantiza que el probador de estrategias no pasará este trabajo a otros agentes para que lo repitan.

INIT_AGENT_NOT_SUITABLE

No hay errores durante la inicialización, pero por alguna razón el agente dado no es adecuado para las pruebas. Por ejemplo, insuficiente memoria RAM, soporte deOpenCL, etc.

Tras la devolución de este código, el agente no recibirá tareas hasta el final de estaoptimización.

La función OnInit() de tipo void siempre significa una inicialización exitosa.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Cuando escribo código en el fin de semana, inserto OnTick en OnInit. Y todo está bien, incluso si no hay nuevas garrapatas entrando
 
Sergey Gritsay:


Pero no está escrito en la documentación

OnInit

La función OnInit() es el manejador del evento OnInit. Puede ser de tipovoid oint, y no tiene parámetros:

voidOnInit();

El evento Init se genera inmediatamente después de cargar un Asesor Experto o un indicador

Dice que es una función.

Antes de OnInit y después de OnDeinit hay llamadas de constructores/destructores de objetos globales (inexactitud en la Ayuda). Por eso, por ejemplo, en los indicadores se pueden declarar búferes de indicadores sin OnInit. Los rudimentos son los siguientes.

 
Buscar en FullOnCalculate lleva inmediatamente a un montón de características completamente indocumentadas de trabajo con los búferes de los indicadores en MT4/MT5 - en lugares difieren seriamente.
 
Esta es mi visión final de la solución del problema:
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
Digamos que un indicador tiene estos parámetros:
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
entonces la matriz de colores para ella será la siguiente:
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

Si la matriz es más pequeña, sólo se transfiere una parte de los colores. Si la matriz es mayor, se recorta.

Para las matrices de ancho y estilo, el principio es el mismo.

 
fxsaber:

En OrderSendSync se llama a la sobrecarga (ver arriba) HistoryDealSelect.

¿Cómo puedo determinar la hora de apertura de la última posición y la hora de cierre de la última posición?

Y en general, me gustaría conocer los principios generales y los algoritmos para obtener información sobre las posiciones abiertas/cerradas en mql5.

¿Qué hay que tener en cuenta, qué especificidades hay en este momento?

 
Artyom Trishkin:

¿Cómo puedo determinar la hora de apertura de la última posición y la hora de cierre de la última posición?

En general, me gustaría conocer los principios generales y los algoritmos para obtener información sobre las posiciones abiertas/cerradas en mql5.

¿Qué hay que tener en cuenta, cuáles son las peculiaridades en este momento?


Todo ello se determina seleccionando el historial de órdenes y operaciones y leyendo después las propiedades de las mismas.

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

IDENTIFICADOR_DE_POSICIÓN

El identificador de la posición es un número único, que se asigna a cada posición recién abierta y no cambia a lo largo de su vida. Corresponde al ticket de la orden con la que se abrió la posición.

El identificador de la posición se especifica en cada orden (ORDER_POSITION_ID) y en cada operación (DEAL_POSITION_ID) que la haya abierto, modificado o cerrado. Utilice esta propiedad para buscar órdenes y operaciones relacionadas con la posición.

Cuando se invierte una posición en modo de compensación (una sola operación de entrada/salida), el identificador POSITION_IDENTIFIER de la posición no se modifica. Sin embargo, POSITION_TICKET se cambia por el ticket de la orden que dio lugar a la anulación. En el modo de cobertura no hay inversión de posiciones.

largo


Y utilizando las propiedades de la enumeración ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Entrada en el mercado

DEAL_ENTRY_OUT

Salida del mercado

DEAL_ENTRY_INOUT

Vuelta en U

DEAL_ENTRY_OUT_BY

Cerrar la posición del contador

Razón de la queja: