Bibliotecas: MT4Orders - página 18

 

Es posible escribir funciones de negociación en fórmulas sintéticas.

Tomemos como ejemplo el arbitraje triangular. Creamos tal símbolo en un minuto a mano a través de GUI o en un segundo por un script


Y ejecutamos TS de arbitraje en él.

// Asesor de arbitraje en la fórmula synetics
#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (Bid > 1)
    OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0);
  else if (Ask < 1)
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
}
 
Cierre rápido de posiciones de símbolos mediante CloseBy

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Cierre de múltiples operaciones a la vez

fxsaber, 2017.12.07 09:01

// Código MQL4&5
#include <MT4Orders.mqh> // https://www.mql5.com/es/code/16006

#property strict

string CorrectSymbol( string &Symb )
{
  return(Symb = ((Symb == NULL) || (Symb == "")) ? _Symbol: Symb);
}

bool PlaceHedge( const string Symb )
{
  double Lots = 0;
    
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Lots += OrderType() ? OrderLots() : -OrderLots();
      
  Lots = NormalizeDouble(Lots, 2);    
      
  return(((Lots > 0) && (OrderSend(Symb, OP_BUY, Lots, SymbolInfoDouble(Symb, SYMBOL_ASK), 100, 0, 0, "HEDGE") > 0)) ||
         ((Lots < 0) && (OrderSend(Symb, OP_SELL, -Lots, SymbolInfoDouble(Symb, SYMBOL_BID), 100, 0, 0, "HEDGE") > 0)) || !Lots);
}

bool CloseAll( string Symb = NULL )
{
  int Type = 0;
  long Ticket = 0;
  
  bool Res = PlaceHedge(CorrectSymbol(Symb));
  
  for (int i = OrdersTotal() - 1; !IsStopped() && Res && (i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
    {
      if (!Ticket)
      {
        Ticket = OrderTicket();
        Type = OrderType();
      }
      else if ((OrderType() != Type) && (Res = OrderCloseBy(Ticket, OrderTicket()) && PlaceHedge(Symb)))
      {
        Ticket = 0;       
        
        i = OrdersTotal();
      }
    }

  return(Res);
}

void OnStart()
{
  CloseAll();
}
 
fxsaber:
Errores tipográficos


#define MODE_DIGITS    SYMBOL_TRADE_STOPS_LEVEL
#define MODE_DIGITS    SYMBOL_DIGITS



 
Kirill Belousov:

Una errata

Sí, hay una errata en ese ejemplo. No puedo corregirlo ahora - el motor del foro no lo permite.

Por supuesto, la errata del ejemplo no afecta a la biblioteca en sí.

 
fxsaber:

Sí, hay una errata en ese ejemplo. No puedo corregirlo ahora - el motor del foro no lo permite.

corregido

 
o_o:

corregido.

Gracias.

 

En el mql4_to_mql5.mqh includer .

double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));
     }

   return(-1);
  }
   return(0);
 
Kirill Belousov:

En el recinto mql4_to_mql5.mqh

#include <MQL4_to_MQL5.mqh> // sólo para este ejemplo

Esto es exactamente un ejemplo, relevante sólo para convertir algunos EAs en la descripción. En esta discusión se ha demostrado que las bibliotecas son mucho mejores que MarketInfo y la solución de otros.

Hay una observación muy importante en la descripción, destacado por el moderador (no por mí)

Advertencia.

La biblioteca está contenida sólo en un 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 biblioteca.

 

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

Bibliotecas: MT4Orders

fxsaber, 2017.09.03 18:52

// Lista de cambios:
// 03.09.2017:
// Añadir: Añadido OrderTicketOpen() - Ticket de transacción de apertura de posición MT5
// OrderOpenReason() - motivo de la operación de apertura de MT5 (motivo de la apertura de una posición)
// OrderCloseReason() - motivo de la operación de cierre de MT5 (motivo del cierre de la posición)

Ejemplo de aplicación

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

Las dos últimas órdenes

fxsaber, 2017.12.23 11:02

#include <MT4Orders.mqh>

// Devuelve los tickets de las últimas transacciones-importe cerradas por Motivo
int GetLastHistoryPositions( long &Tickets[], int Amount = INT_MAX, const ENUM_DEAL_REASON Reason = DEAL_REASON_SL )
{
  int Count = ArrayResize(Tickets, 0);
  
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Count < Amount); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == Reason))
      Tickets[ArrayResize(Tickets, ++Count) - 1] = OrderTicket();
  
  return(Count);
}

void OnStart()
{
  long Tickets[];
  
  // Los dos últimos acuerdos se cerraron en SL
  for (int i = GetLastHistoryPositions(Tickets, 2) - 1; i >= 0; i--)
    Print(Tickets[i]);
}
 

Hola, la descripción dice: "En consecuencia, OrderSelect en el modo SELECT_BY_TICKET en MT5 en casos raros (en el probador) puede seleccionar no lo que estaba previsto en MT4. "¿Puede escribir en detalle en qué casos?