Bibliotecas: MT4Orders - página 7

 
Maxim Dmitrievsky:
En general, me di cuenta - los servidores no siempre devuelven los valores correctos, por lo que hay un batiburrillo y no hay manera de arreglarlo, sólo cambiar manualmente el tipo de llenado, sí. Aquí ya en el foro había problemas similares con la gente.

¡Gracias por encontrar el error!

Para arreglarlo, donde estén estas dos líneas en el código.

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

añade dos más para que quede así

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;
 
fxsaber:

Gracias por encontrar el error.

Para arreglarlo, donde estén esas dos líneas en el código

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

añade dos líneas más para que quede así

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;

Allí el problema es diferente, en la ejecución de la marquesina de llenado IOC :) y el servidor devuelve REQUEST en la solicitud, es decir, en el nivel del problema del servidor y no se realiza un seguimiento de ninguna manera, para poner sólo en la configuración de la capacidad de expertos para cambiar de forma independiente, si no funciona

Aunque ... funciona ... gracias, pero la ejecución se escribe MERCADO en los registros, no INTERCAMBIO, parece que todo se mezcla allí ... o en mi cabeza ).

 
fxsaber:
¿Para qué sirve el almacenamiento en caché en el trading real? ¿Ha almacenado en caché el historial en MT4? La aceleración es necesaria cuando el rendimiento es importante - probador.

El rendimiento también puede ser necesario en la vida real. El hecho de que no tengamos tales expertos no niega la necesidad potencial.

Lo que ya no entiendo es por qué se dijo básicamente que sería posible hacer caché para el probador, pero no posible para los reales. ¿Cómo es tan imposible? El algoritmo debería ser el mismo, y debería funcionar tanto en el tester como en el real.

 
Stanislav Korotky:

El rendimiento puede ser necesario en el mundo real. El hecho de que no tengamos tales expertos no anula la necesidad potencial.

Ya no entiendo por qué se dijo básicamente que sería posible hacer caché para el probador, pero no posible para los reales. ¿Cómo es tan imposible? El algoritmo debería ser el mismo, y funcionar tanto en tester como en real.

Porque los datos almacenados en caché en el real pueden en algún momento dejar de corresponder al historial - el broker lo corrigió a mano. Pero en el probador, nadie moverá las manos. Además, incluso sin las correcciones del broker, surgen problemas en el mercado real. Porque se pueden enviar dos peticiones asíncronas y obtener una respuesta de la primera - la historia se ha almacenado en caché, y luego obtener una respuesta de la segunda, que entrará en la tabla de historia antes que la anterior - cambio de historia. Es por eso que el caché no es bueno para la realidad.

Para el probador, la caché se hace muy simple, sólo las manos aún no han alcanzado. Sin embargo, se ha hecho lo siguiente (no publicado)

// 10.11.2016:
// Añadir: Sincronización completa de OrderSend con el entorno de negociación (tiempo real e histórico) - como en MT4.
// Corrección: Las banderas de relleno se establecen correctamente.

Esto significa que OrderSend garantiza la sincronización con el entorno de negociación en el menor tiempo posible.

Algunas personas en el foro se quejaban de que después de MT5-OrderSend BUY no podían leer los parámetros de una posición abierta - el entorno de trading se retrasaba ~1 ms. Ahora no habrá problemas con esto y cuestiones similares si utiliza esta biblioteca. Es probablemente la única biblioteca pública que hace esto hasta ahora.

Por ejemplo, ahora no es relevante

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading

Cómo trabajar correctamente en MT5 con OrderSend

fxsaber, 2016.11.10 10:00 AM

Cómo saber el tamaño de la comisión sin abrir una posición en el instrumento?

fxsaber, 2016.11.08 20:30

#include <MT4Orders.mqh>

void OnStart()
{
  const int Ticket = OrderSend(_SymbolOP_BUY1SymbolInfoDouble(_SymbolSYMBOL_ASK), 000);
  
  OrderClose(Ticket, 0.3SymbolInfoDouble(_SymbolSYMBOL_BID), 0clrNONE);

  Sleep(1000); // a la espera de que se actualice el historial
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    Alert(OrderCommission());
}

Probablemente, tal ejemplo es ilustrativo.

Si no haces Sleep, se suele dar la situación de que el histórico no ha tenido tiempo de actualizarse después de OrderClose y OrderCommission devuelve el valor como si no se hubiera hecho OrderClose.

Ten en cuenta que esto es un script y no puede haber eventos Event. La única salida es un estúpido Sleep.

Si reescribes este script con SB, nada cambia.

Ahora no hay deslizamientos tontos con retardos indefinidos. El mismo SB no sabe hacer eso.

Lo presentaré para su publicación cuando acelere la historia para el probador.

 

Una vez verificada por un moderador, una actualización estará disponible

// 13.11.2016:
// Añadir: Sincronización completa de OrderSend, OrderModify, OrderClose, OrderDelete con el entorno de negociación (tiempo real e histórico) - como en MT4.
// El tiempo máximo de sincronización se puede establecer a través de MT4ORDERS::OrderSend_MaxPause en µs. El tiempo medio de sincronización en MT5 es ~1 ms.

// Por defecto, el tiempo máximo de sincronización es igual a un segundo. MT4ORDERS::OrderSend_MaxPause = 0 - sin sincronización.
// Añadir: Dado que el parámetro SlipPage (OrderSend, OrderClose) afecta a la ejecución de órdenes de mercado sólo en modo Instant,
// entonces ya es posible establecer el tipo de ejecución en la balanza - ENUM_ORDER_TYPE_FILLING:
// ORDER_FILLING_FOK, ORDER_FILLING_IOC o ORDER_FILLING_RETURN.
// En caso de asignación errónea o si el símbolo no admite el tipo de ejecución especificado, se seleccionará automáticamente el modo de funcionamiento.
// Ejemplos:
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_FOK, SL, TP) - envía la orden correspondiente con tipo de ejecución ORDER_FILLING_FOK
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_IOC, SL, TP) - envía la orden correspondiente con tipo de ejecución ORDER_FILLING_IOC
// OrderClose(Ticket, Lots, Price, ORDER_FILLING_RETURN) - envía la orden de mercado correspondiente con tipo de ejecución ORDER_FILLING_RETURN
// Añadir: OrdersHistoryTotal() y OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY) se almacenan en caché - funcionan lo más rápido posible.
// No quedan implementaciones lentas en la biblioteca .

Solo faltan dos pasos para completarlo y tener una superioridad inequívoca sobre SB.

// Lo que no se realiza:
// CloseBy momentos - No he tenido tiempo de hacerlo todavía. Tal vez en el futuro, cuando sea necesario.
// Determinar TP y SL de posiciones cerradas - actualmente (build 1470) MQL5 no sabe como hacer esto.
// Contabilización de las transacciones DEAL_ENTRY_INOUT y DEAL_ENTRY_OUT_BY.

De momento MT4Orders permite hacer todo en cuentas Netting (bolsa) excepto leer el histórico con operaciones DEAL_ENTRY_INOUT. Y todo en cuentas Hedge, excepto momentos closeBy.

Ventajas sobre SB

  • Sintaxis MQL4. Lectura y escritura más rápida de la lógica de trading. Transferencia rápida del código de trading y estadística de MT4.
  • Posibilidad de cierre parcial de posiciones.
  • Sincronización de todas las funciones de órdenes con el entorno de negociación.
  • Cómoda asignación de ORDER_FILLING_* y garantía de corrección de la asignación del campo Request.filling en una orden de negociación.
  • El historial de operaciones se almacena en caché: funcionamiento más rápido.
No se excluye la posibilidad de añadir variantes asíncronas de las funciones Order (OrderSendAsync, OrderCloseAsync, OrderDeleteAsync y OrderModifyAsync) en la misma sintaxis MQL4.
 
fxsaber:

Una vez verificado por un moderador, una actualización estará disponible

¡Muy bien! Espero con impaciencia la actualización.

Y, ¡realmente espero implementar CloseBy en un futuro cercano!

 
fxsaber:

Una vez verificada por un moderador, la actualización estará disponible

Disponible.

Ventajas sobre SB

  • Sincronización de todas las funciones de la Orden con el entorno de negociación.
Para entender la importancia de este punto, a continuación se muestra un ejemplo de código cuya ejecución en MT5 será ahora totalmente coherente con MT4.

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Cómo trabajar correctamente en MT5 con OrderSend.

fxsaber, 2016.11.15 14:14

Intenta escribir la siguiente función en tu EA

  1. i = 0.
  2. Abre una posición en el símbolo[i].
  3. Si i++ >= 5 - salir.
  4. Si la nueva posición no tiene deslizamiento, volvemos al paso 2. Si hay deslizamiento, salir.
// Código MQL4&5

#property strict

#include <MT4Orders.mqh>    // https://www.mql5.com/es/code/16006

void Func( const string &Symbols[] )
{
  const int Total = ArraySize(Symbols);
  
  for (int i = 0; i < Total; i++)
  {
    const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
    const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
    
    if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
        (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // si la apertura falló o hay deslizamiento - salida.
      break;
  }
}

void OnStart() // OnTick
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
  
  Func(Symbols);
}

Es extremadamente problemático escribir incluso una lógica de trading tan simple en MT5 usando SB o MQL5 puro como ejemplo. Lo que siempre se hace sin problemas en MT4 no es fácil de implementar sin errores en MT5. Esta librería te permite hacerlo de la misma manera que en MT4. No hay necesidad de estudiar la sintaxis de la librería y sus características - es MT4 en comportamiento y MQL4 en sintaxis.

Puede ser útil para familiarizarse con los resultados de portar MT4-asesores en virtud de los cinco (a través de SB) aquí, para que pueda evaluar en qué estilo la aplicación de la misma lógica de negociación está más cerca de usted.

 
definitivamente, ¡más al karma! ))
 
En el nuevo archivo por alguna razón la línea se rompe con un carácter CR (al parecer de Mac), que es diferente de otras fuentes.
 
Stanislav Korotky:
En el nuevo archivo por alguna razón saltos de línea con un carácter CR (al parecer de Mac), que es diferente de otras fuentes.

Soy un usuario débil (y sólo vinda), así que no puedo decir cómo sucedió. Miré que la mayoría de las cadenas terminan con dos bytes 0x0D. También hay 0x0D 0x0A. Hay uno - 0x0D.

Todos los editores muestran la fuente normalmente, por lo que no debe interferir, creo.