Bibliotheken: MT4Orders - Seite 26

 
ilvic:

Können Sie mir ein Beispiel für eine mt4-Variante nennen?

https://www.mql5.com/de/code/7712

Ähnlich dem, was Sie mit Spreader gemacht haben

Leider wurde MQL4_To_MQL5.mqh nicht für die Konvertierung und Indikatoren erstellt. Aber sie sind im Code vorhanden.

   //Wasserstandsanzeiger
   double fast1=iMA(NULL,0,mafastperiod,mafastshift,mafastmethod,mafastprice,1);
   double fast2=iMA(NULL,0,mafastperiod,mafastshift,mafastmethod,mafastprice,2);
   double slow1=iMA(NULL,0,maslowperiod,maslowshift,maslowmethod,maslowprice,1);
   double slow2=iMA(NULL,0,maslowperiod,maslowshift,maslowmethod,maslowprice,2);

Ich werde sie nicht hinzufügen. Vielleicht wird jemand zustimmen. Es gab Artikel zu diesem Thema.

 

fxsaber

Funktioniert bei mt5 nicht korrekt im Vergleich zu mt4. Es öffnet ein Geschäft und schließt es sofort wieder.

Was kann das Problem sein?

#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"
Dateien:
 
ilvic:

fxsaber

Funktioniert bei mt5 nicht korrekt im Vergleich zu mt4. Er öffnet ein Geschäft und schließt es sofort wieder.

Was kann das Problem sein?

Ich habe den Code schnell durchgesehen. Es ist seltsam, dass unter MT4 solche Bedingungen geschrieben wurden

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

Es wird nie zum Drucken kommen. Und der Code ist sicherlich ein HDD-Killer.


Ich habe es für plattformübergreifende gezwickt.

Dateien:
 

fxsaber

Danke für die Hilfe. Aber das Problem ist das gleiche.

Er öffnet eine Order und schließt sie sofort wieder. Und so jede Sekunde im Kreis und ohne Unterbrechung.

Es gibt kein solches Problem auf mt4.

 
ilvic:

Vielen Dank für Ihre Hilfe. Aber das Problem ist das gleiche.

Er öffnet einen Auftrag und schließt ihn sofort wieder. Und so jede Sekunde im Kreis und ohne Unterbrechung.

Bei mt4 gibt es dieses Problem nicht.

Leider habe ich nicht die Möglichkeit, Ihr Problem zu verstehen.

 
// Liste ändern:
// 26.11.2018
// Fix: Magische und geschlossene MT4-Positionen kommentieren: die entsprechenden Felder von Eröffnungsgeschäften haben eine höhere Priorität als die von geschlossenen Geschäften.
// Fix: Die seltene Änderung von MT5-OrdersTotal und MT5-PositionsTotal während der MT4-OrdersTotal und MT4-OrderSelect Berechnung wird berücksichtigt.
// Fix: Orders, die eine Position eröffnet haben, aber noch keine Zeit hatten, von MT5 gelöscht zu werden, werden von der Bibliothek nicht mehr berücksichtigt.

Hervorgehoben. Dies ist die Art von Skript

#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);

// wenn (NeueSumme < Summe)
// Alert("https://www.mql5.com/ru/forum/290673#comment_9493241");
      
      Total = NewTotal;
    }
  }
}

auf Hedge-Konten, die früher auftauchten

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


Jetzt nur noch dies.

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


Bei Netting-Konten haben wir es in allen Fällen noch nicht geschafft, die MT5-Fehler (ausgeführte Order wird nicht gelöscht) zu umgehen. D.h. die Bibliothek weiß nicht, wie sie in allen Fällen die Fehler der MT5-Plattform umgehen kann (und eigentlich auch nicht sollte).

 
 
fxsaber:
Die Bibliothek ist nicht in der Lage (und sollte es eigentlich auch nicht sein), die Unzulänglichkeiten der MT5-Plattform selbst in allen Fällen zu umgehen.

Zum Beispiel, dieses

zur Eröffnung einer Position wurde platziert und OrdersTotal erhöhte sich um eins.

  • Sie wurde ausgeführt und OrdersTotal verringerte sich um eins, aber PositionsTotal erhöhte sich nicht um eins. D.h. es gibt eine Position, aber das Terminal weiß nichts davon.
  • Zum Beispiel gibt es weder Positionen noch Aufträge - PositionsTotal = 0, OrdersTotal = 0.

    Sie platzieren eine Market Order. In diesem Fall ist PositionsTotal = 0, OrdersTotal = 1.

    Der Marktauftrag wird ausgeführt - OrdersTotal = 0. Aber PositionsTotal = 0!

    Es kostet viel Mühe, in diese Situation zu geraten. Noch schwieriger ist es, sie zu bemerken. Aber MT5 schafft solche Tricks.

    MT4Orders versucht, solche Dinge so weit wie möglich zu vermeiden, aber das ist nicht immer möglich. Ob die Autoren des TS versuchen, solche Schwächen der Plattform in reinem MQL5 oder SB zu berücksichtigen, können wir nur vermuten. Es ist aber unwahrscheinlich.

     
    // Demonstration, wie man manuell Handelsaufträge an den Visualiser sendet.
    
    #include <MT4Orders.mqh> // https://www.mql5.com/de/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

    // Demonstration, wie man manuell Handelsaufträge an den Visualizer sendet.
    
    #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();
    }