Bibliotecas: MT4Orders - página 9

 
fxsaber:

Ejecutar en el probador mt4orders_exampleexpert.mq5

Al escribir la biblioteca, yo estaba lejos de darse cuenta de todo el alcance de los posibles problemas con los usuarios. Antes de que todos ellos funcionó sin instrucciones.

Ejemplos concisos de la conversión de EA no sólo en la descripción de la biblioteca, sino también en su discusión - en los comentarios (aún más claro allí).

Gracias con ilan1_4_strict.mq4 todo funcionó, pero mi EAs dio 75 errores. Los errores son de este tipo:


 
Nauris Zukas:

Gracias con ilan1_4_strict.mq4 todo funcionó, pero mi ea dio 75 errores. Los errores son de esta naturaleza:


por lo menos, tirar toda la parte de gráficos.

¿Por qué lo necesita en el probador en absoluto?

 
ivanivan_11:

Como mínimo, desecha todos los gráficos.

¿Para qué los necesitas en el probador?

Se puede hacer eso, pero todavía hay un montón de errores.
 
Nauris Zukas:

Gracias con ilan1_4_strict.mq4 todo funcionó, pero mi ea dio 75 errores. Los errores son de este tipo:

En la discusión dijo y en la descripción hay estas palabras

Este trabajo afecta solo al sistema de ordenes.

La cuestión de la posibilidad de crear una biblioteca tan completa, cuando el código MQL4 puede trabajar en MetaTrader 5 sin cambios, no se ha resuelto.

¡Atención!

La biblioteca está contenida en un solo archivo - MT4Orders.mqh. Todos los demás archivos se adjuntan para ejemplos de uso de la biblioteca. Estos archivos no son necesarios para trabajar con la librería.

Durante la transición MT4->MT5 el obstáculo más difícil es el nuevo sistema de órdenes. MT4Orders elimina esta dificultad por completo. Las otras diferencias no son tan desalentadoras. Como son fácilmente reescritas - hay datos de referencia convenientes sobre este tema. Pues bien, la corrección del trabajo de la biblioteca se demostró de la siguiente manera

Se tomaron varios MT4/5-advisors de diferentes tipos (de kodobase) como ejemplo de uso: pips, news, martin, multicurrency, etc.

Así es como se puede escribir en MQL5

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

Errores, fallos, preguntas

fxsaber, 2016.10.20 15:54

#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// Vía MT5-Standard Library - sólo MT5
// Establece SellLimit y luego establece su SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

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

// A través de MT4-OSJS - variante multiplataforma (MT4/5)
// Establece SellLimit y luego establece su SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}


void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // Vía MT5-Standard Library - sólo MT5
    MT4Order(Price); // A través de MT4-OSJS - variante multiplataforma (MT4/5)
    
    FirstRun = false;
  }
}

La función MT4Order resaltada en amarillo hace lo mismo que la función MT5Order. En cualquier foro se entenderá inmediatamente el código amarillo, el código alternativo MT5 no.

Y cómo escribir para MT5 - cada uno decide por sí mismo. Yo, por ejemplo, uso MT4Orders y en algunos casos raros también puro (SB tiene funcionalidad débil) MQL5. Ambos estilos de escritura trabajan en paralelo. Pero si escribes sólo a través de MT4Orders, el sistema de órdenes será multiplataforma. Por lo tanto, la práctica de escribir código que se ejecuta en ambas plataformas sin cambios.

 
fxsaber:

Así practico escribir código que se ejecute sin cambios en ambas plataformas.

Gracias. Probablemente tendré que pensar también en esta opción en el futuro.
 

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

Cómo determinar el último precio de cierre de una orden (MQL5)?

fxsaber, 2016.12.05 10:25 AM

#include <MT4Orders.mqh>

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    Alert(OrderClosePrice());
}
 
void Terminal()
{            
int oldticket=0;
int Ticket=0;
   ArrayResize(Mas_LOT,OrdersTotal(),3);
   ArrayInitialize(Mas_LOT,0); 

   for(int i=0; i <= OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){    
      if (OrderSymbol()==Symbol()&& OrderMagicNumber() == Magik){

      
      Mas_LOT[i][0] = OrderTicket();
      Mas_LOT[i][1] = OrderLots();
      Mas_LOT[i][2] = OrderType();
      Mas_LOT[i][3] = (OrderProfit() + OrderSwap() + OrderCommission());
      Mas_LOT[i][4] = OrderStopLoss();
      Mas_LOT[i][5] = OrderOpenPrice();

      Mas_LOT[i][6] = OrderTakeProfit();

}}}}

Por ejemplo, el array de órdenes de mt4 es algo muy útil y conveniente para calcular, por ejemplo, el promedio de toma/parada, y este mismo array puede ser alimentado en las funciones de modificación y arrastre, cómo es mejor convertirlo a mt5 usando la librería MT4Orders.mqh o sin ella
 
Aleksey Semenov:
como convertirlo para mt5 usando la libreria MT4Orders.mqh
Añadir
#include <MT4Orders.mqh>
 
Ejemplo multiplataforma

Foro sobre comercio, sistemas automatizados de comercio y prueba de estrategias comerciales

Nueva versión de MetaTrader 5 build 1525: presentación del historial en forma de posiciones y mejora del tester

fxsaber, 2017.01.27 19:20

Ejecutando un script multiplataforma.

// Código MQL4&5

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && (OrdersTotal() == 0) &&
      (OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0) > 0))
  {
    const double Lots[] = {0.6, 0.3, 0.1};
    
    for (int i = 0; i < ArraySize(Lots); i++)    
      if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick))
        OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);

    const int Total = OrdersHistoryTotal();
    
    for (int i = 0; i < Total; i++)
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        OrderPrint();  
  }
}

En primer lugar en MT5-Hedge. Obtenemos una impresión tan agradable de MT4

#114769046 2017.01.27 19:57:25 balance 0.00  1 0 0 2017.01.27 19:57:11 0 0.00 0.00 50000.00 0
#114769087 2017.01.27 19:57:25 buy 0.60 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -5.40 0
#114769088 2017.01.27 19:57:25 buy 0.30 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -2.70 0
#114769089 2017.01.27 19:57:25 buy 0.10 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:26 1.06829 0.00 0.00 -0.90 0

y un informe clásico

Órdenes
Hora de aperturaOrdenSímboloTipoVolumenPrecioS / LT / PTiempoCondiciónComentario
2017.01.27 19:57:25131208025EURUSDcomprar1.00 / 1.001.068382017.01.27 19:57:25lleno
2017.01.27 19:57:25131208027EURUSDvender0.60 / 0.601.068292017.01.27 19:57:25lleno
2017.01.27 19:57:25131208030EURUSDvender0.30 / 0.301.068292017.01.27 19:57:25lleno
2017.01.27 19:57:26131208031EURUSDvender0.10 / 0.101.068292017.01.27 19:57:26llenado
Transacciones
HoraTransacciónSímboloTipoDirecciónVolumenPrecioOrdenComisiónSwapBeneficioSaldoComentario
2017.01.27 19:57:11114769046saldo0.000.0050 000.0050 000.00
2017.01.27 19:57:25114769085EURUSDcompraren1.001.068381312080250.000.000.0050 000.00
2017.01.27 19:57:25114769087EURUSDvenderfuera0.601.068291312080270.000.00-5.4049 994.60
2017.01.27 19:57:25114769088EURUSDvenderfuera0.301.068291312080300.000.00-2.7049 991.90
2017.01.27 19:57:26114769089EURUSDvenderfuera0.101.068291312080310.000.00-0.9049 991.00

Como confirmación, ejecutamos el mismo script en MT4.

Informe clásico de MT4

Transacciones cerradas:
EntradaHora de aperturaTipoTamañoArtículoPrecioS / LT / PHora de cierrePrecioComisiónImpuestosSwapBeneficio
1700392462017.01.27 20:00:41saldoDepósito50 000.00
1700392872017.01.27 20:00:57comprar0.60eurusd1.068540.000000.000002017.01.27 20:00:571.068360.000.000.00-10.80
a #170039289
1700392892017.01.27 20:00:57comprar0.30eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-5.40
a #170039290
1700392902017.01.27 20:00:57comprar0.10eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-1.80
desde #170039289

E impresión del registro del script

#170039246 2017.01.27 20:00:41 balance 0.01  0 0 0 2017.01.27 20:00:41 0 0.00 0.00 50000.00 Deposit 0
#170039287 2017.01.27 20:00:57 buy 0.60 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:57 1.06836 0.00 0.00 -10.80 to #170039289 0
#170039289 2017.01.27 20:00:57 buy 0.30 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -5.40 to #170039290 0
#170039290 2017.01.27 20:00:57 buy 0.10 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -1.80 from #170039289 0

Usted puede ver claramente que el registro de la secuencia de comandos en MT4 y MT5 coincide - obras multiplataforma.

ZY Si la lógica del script se escribe para MT5 a través de SB, el script no funcionará correctamente. En general, es incluso difícil decir cómo escribir una lógica MQL4 tan simple para MT5.

[Eliminado]  

seleccion por simbolo y majic no funciona

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

OrderSelect no funciona no selecciona una orden (ticket por indice) para trabajar con ella, ejemplo simple en adjunto y no funciona en mt5 por alguna razon

Archivos adjuntos: