Bibliotecas: MT4Orders - página 26

 

fxsaber

Funciona incorrectamente en mt5 en comparación con mt4. Abre una operación y la cierra inmediatamente.

¿Cuál puede ser el problema?

#ifdef __MQL5__
double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

#define StrToInteger StringToInteger 
#define StrToDouble StringToDouble
#define MODE_MINLOT SYMBOL_VOLUME_MIN
#define MODE_POINT     SYMBOL_POINT
#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK

void OnInit( void ) { init(); }

#include <MT4Orders.mqh>

#endif // __MQL5__

#include "simple_copier.mq4"
Archivos adjuntos:
 
ilvic:

fxsaber

Funciona incorrectamente en mt5 en comparación con mt4. Abre una operación y la cierra inmediatamente.

¿Cuál puede ser el problema?

Rápidamente corrí a través del código. Es extraño que bajo MT4 tales condiciones fueron escritas

if(!OrderSend(symbol_,type_,LotNormalize(lot_),price_,slip,0,0,"C4F"+IntegerToString(ticket_))) Print("Error: ",GetLastError()," during setting the pending order.");

Nunca llegará a Imprimir. Y el código es sin duda un asesino HDD.


Lo ajusté para multiplataforma.

Archivos adjuntos:
 

fxsaber

Gracias por la ayuda. Pero el problema es el mismo.

Abre una orden y la cierra inmediatamente. Y así cada segundo en círculo y sin parar.

No hay tal problema en mt4.

 
ilvic:

Gracias por su ayuda. Pero el problema es el mismo.

Abre una orden y la cierra inmediatamente. Y así cada segundo en círculo y sin parar.

No hay tal problema en mt4.

Por desgracia, no tengo la oportunidad de entender su problema.

 
// Lista de cambios:
// 26.11.2018
// Fix: Comentario de posición MT4 mágica y cerrada: los campos correspondientes de las operaciones de apertura tienen mayor prioridad que los de las operaciones de cierre.
// Fix: Se tiene en cuenta el cambio poco frecuente de MT5-OrdersTotal y MT5-PositionsTotal durante el cálculo de MT4-OrdersTotal y MT4-OrderSelect.
// Fix: Las órdenes que han abierto una posición pero no han tenido tiempo de ser borradas por MT5 ya no son consideradas por la librería.

Destacado. Este es el tipo de guión

#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask, 0, 0, 0);
  
  int Total = _P(OrdersTotal());
  
  while (!IsStopped())
  {
    const int NewTotal = OrdersTotal();
    
    if (Total != NewTotal)
    {
      _P(NewTotal);

// if (NuevoTotal < Total)
// Alerta("https://www.mql5.com/ru/forum/290673#comment_9493241");
      
      Total = NewTotal;
    }
  }
}

en las cuentas de Hedge solía aparecer

2018.11.26 15:27:46.513 void OnStart(), Line = 10: OrdersTotal() = 1
2018.11.26 15:27:56.128 void OnStart(), Line = 18: NewTotal = 2
2018.11.26 15:27:56.128 void OnStart(), Line = 18: NewTotal = 1


Ahora solo esto.

2018.11.26 15:30:29.224 void OnStart(), Line = 10: OrdersTotal() = 1


Para Netting-cuentas en todos los casos, no hemos logrado superar MT5-causas (orden ejecutada no se elimina) todavía. Es decir, la libreria no sabe (en realidad, y no deberia) sortear los defectos de la plataforma MT5 en todos los casos.

 
fxsaber:
La biblioteca no es capaz (de hecho, no debería ser capaz) de eludir las deficiencias de la propia plataforma MT5 en todos los casos.

Por ejemplo, este

abriendo una posición y OrdersTotal aumentó en uno.

  • Se ejecutó y OrdersTotal disminuyó en uno, pero PositionsTotal no aumentó en uno. Es decir, hay una posición, pero el Terminal no lo sabe.
  • Por ejemplo, no hay ni posiciones ni órdenes - TotalPosiciones = 0, TotalOrdenes = 0.

    Usted coloca una orden de mercado. En este caso PosicionesTotal = 0, ÓrdenesTotal = 1. La orden de mercado se ejecuta - ÓrdenesTotal = 1.

    La orden de mercado se ejecuta - TotalOrdenes = 0. ¡Pero PositionsTotal = 0!

    Cuesta mucho esfuerzo encontrarse con esta situación. Es aún más difícil darse cuenta. Pero MT5 crea tales trucos.

    MT4Orders intenta evitar estas cosas en la medida de lo posible, pero no siempre es posible. Si los autores de la TS tratan de tener en cuenta estos defectos de la plataforma en pura MQL5 o SB, sólo podemos adivinar. Es poco probable.

     
    // Demostración de cómo enviar manualmente órdenes comerciales al Visualizador.
    
    #include <MT4Orders.mqh> // https://www.mql5.com/es/code/16006
    
    #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
    #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
    
    bool IsModify()
    {
      static long PrevTime = 0;
      
      const long NewTime = FileGetInteger(__FILE__, FILE_MODIFY_DATE);
      const bool Res = (PrevTime != NewTime);
      
      if (Res)
        PrevTime = NewTime;
        
      return(Res);  
    }
    
    bool CreateFile()
    {
      uchar Bytes[];
          
      return(FileSave(__FILE__, Bytes) && IsModify());
    }
    
    string GetCommand()
    {
      uchar Bytes[];
      FileLoad(__FILE__, Bytes);
      
      return(CharArrayToString(Bytes));
    }
    
    bool OrdersScan( const int Type )
    {
      for (int i = ::OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == Type))      
          return(true);    
        
      return(false);  
    }
    
    bool SendCommand( const string Command, const double Lot = 1, const int Offset = 100 )
    {
      bool Res = false;
      
      if (Command == "open buy")  
        Res = (OrderSend(_Symbol, OP_BUY, Lot, Ask, 0, 0, 0) > 0);
      else if (Command == "open sell")  
        Res = (OrderSend(_Symbol, OP_SELL, Lot, Bid, 0, 0, 0) > 0);
      else if (Command == "open buylimit")  
        Res = (OrderSend(_Symbol, OP_BUYLIMIT, Lot, Ask - Offset * _Point, 0, 0, 0) > 0);
      else if (Command == "open selllimit")  
        Res = (OrderSend(_Symbol, OP_SELLLIMIT, Lot, Bid + Offset * _Point, 0, 0, 0) > 0);
      else if (Command == "close buy")  
        Res = OrdersScan(OP_BUY) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else if (Command == "close sell")
        Res = OrdersScan(OP_SELL) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else if (Command == "close buylimit")  
        Res = OrdersScan(OP_BUYLIMIT) && OrderDelete(OrderTicket());
      else if (Command == "close selllimit")
        Res = OrdersScan(OP_SELLLIMIT) && OrderDelete(OrderTicket());
        
      return(Res);
    }
    
    bool TesterManual()
    {
      static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE) && CreateFile();
      
      return(IsVisual && IsModify() && SendCommand(GetCommand()));
    }
    
    void OnTick()
    {
      TesterManual();
    }


     

    Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

    Библиотеки: MT4Orders

    fxsaber, 2018.12.05 19:43

    // Demostración de cómo enviar manualmente órdenes de operación al Visualizador.
    
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
    #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
    
    bool IsModify()
    {
      static long PrevTime = 0;
      
      const long NewTime = FileGetInteger(__FILE__, FILE_MODIFY_DATE);
      const bool Res = (PrevTime != NewTime);
      
      if (Res)
        PrevTime = NewTime;
        
      return(Res);  
    }
    
    bool CreateFile()
    {
      uchar Bytes[];
          
      return(FileSave(__FILE__, Bytes) && IsModify());
    }
    
    string GetCommand()
    {
      uchar Bytes[];
      FileLoad(__FILE__, Bytes);
      
      return(CharArrayToString(Bytes));
    }
    
    bool OrdersScan( const int Type )
    {
      for (int i = ::OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == Type))      
          return(true);    
        
      return(false);  
    }
    
    bool SendCommand( const string Command, const double Lot = 1, const int Offset = 100 )
    {
      bool Res = false;
      
      if (Command == "open buy")  
        Res = (OrderSend(_Symbol, OP_BUY, Lot, Ask, 0, 0, 0) > 0);
      else if (Command == "open sell")  
        Res = (OrderSend(_Symbol, OP_SELL, Lot, Bid, 0, 0, 0) > 0);
      else if (Command == "open buylimit")  
        Res = (OrderSend(_Symbol, OP_BUYLIMIT, Lot, Ask - Offset * _Point, 0, 0, 0) > 0);
      else if (Command == "open selllimit")  
        Res = (OrderSend(_Symbol, OP_SELLLIMIT, Lot, Bid + Offset * _Point, 0, 0, 0) > 0);
      else if (Command == "close buy")  
        Res = OrdersScan(OP_BUY) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else if (Command == "close sell")
        Res = OrdersScan(OP_SELL) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else if (Command == "close buylimit")  
        Res = OrdersScan(OP_BUYLIMIT) && OrderDelete(OrderTicket());
      else if (Command == "close selllimit")
        Res = OrdersScan(OP_SELLLIMIT) && OrderDelete(OrderTicket());
        
      return(Res);
    }
    
    bool TesterManual()
    {
      static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE) && CreateFile();
      
      return(IsVisual && IsModify() && SendCommand(GetCommand()));
    }
    
    void OnTick()
    {
      TesterManual();
    }


     

    Hola :)

    Tratando de utilizar su biblioteca. MT5 modo Hedge build 1959, modo de prueba.

    La llamada OrderSelect(... , SELECT_BY_TICKET) devuelve false para la orden en el historial, aunque la orden está claramente presente en los registros del tester. ¿Puede sugerir cómo es posible?