程序库: MT4Orders - 页 26

 
ilvic:

您能给我一个 mt4 变体的例子吗?

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

与您使用 Spreader 所做的类似

不幸的是,MQL4_To_MQL5.mqh 没有创建转换和指标。但它们存在于代码中

   //Caculate 指标
   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);

我不会添加它。也许有人会同意。有关于此主题的文章。

 

fxsaber

与 MT4 相比,它在 MT5 上的工作方式不正确。它打开交易后又立即关闭。

问题出在哪里?

#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"
附加的文件:
 
ilvic:

fxsaber

与 MT4 相比,它在 MT5 上的工作方式不正确。它打开交易后立即关闭。

问题出在哪里?

我快速查看了代码。奇怪的是,在 MT4 中写入了这样的条件

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

永远无法打印。这段代码无疑是硬盘杀手。


我对其进行了跨平台调整。

附加的文件:
 

fxsaber

感谢您的帮助。但问题还是一样。

它打开一个订单,然后立即关闭。每秒钟都是如此,循环往复,从不间断。

在 mt4 上没有这个问题。

 
ilvic:

感谢您的帮助。但问题还是一样。

它打开一个订单,然后立即关闭。如此循环往复,每秒不停。

在 mt4 上没有这样的问题。

很遗憾,我没有机会了解您的问题。

 
// 更改列表:
// 26.11.2018
// 修复:MT4 仓位的魔法和平仓注释:开仓交易的相应字段比平仓交易的相应字段具有更高的优先级。
// 修复:在计算 MT4 订单总数和 MT4 订单选择时,考虑 MT5 订单总数和 MT5 仓位总数的罕见变化。
//修复:MT5 不再考虑已开仓但尚未来得及删除的订单。

突出显示。这种脚本

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

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

对冲账户曾经出现过

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


现在只有这个。

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


对于所有情况下的净值账户,我们尚未成功克服 MT5 原因(已执行订单未删除)。也就是说,程序库不知道如何(实际上也不应该)在所有情况下绕过 MT5 平台的缺陷。

 
 
fxsaber:
该库无法(事实上也不应该)在所有情况下绕过 MT5 平台本身的缺陷。

例如,本

建立头寸的 市场订单下达后,OrdersTotal 增加了一个。

  • 订单执行后,OrdersTotal 减少了一个,但PositionsTotal 没有增加一个。也就是说,有一个仓位,但终端不知道。
  • 例如,既没有头寸也没有订单 - PositionsTotal = 0, OrdersTotal = 0。

    您下达了市价订单。在这种情况下,PositionsTotal = 0, OrdersTotal = 1。

    市价订单被执行 - 订单总数 = 0。但PositionsTotal = 0

    遇到这种情况需要花费很大精力。要注意到这种情况更是难上加难。但 MT5 却创造了这种把戏。

    MT4Orders 尝试尽可能避免这种情况,但并非总是可行。我们只能猜测,TS 的作者是否会考虑到纯 MQL5 或 SB 平台的此类缺陷。这不太可能。

     
    // 演示如何手动向展示台发送交易指令。
    
    #include <MT4Orders.mqh> //https://www.mql5.com/zh/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

    // 演示如何手动向展示台发送交易指令。
    
    #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();
    }