ライブラリ: MT4Orders - ページ 26

 
ilvic:

mt4バリアントの例を教えてください。

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

あなたがSpreaderで行ったことと似ています。

残念ながら、MQL4_To_MQL5.mqhは変換とインジケータのために作成されたものではありません。しかし、それらはコードに存在します

   //インジケーター
   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

mt5ではmt4に比べて動作がおかしい。取引を開いてすぐに閉じてしまいます。

何が問題なのでしょうか?

#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:

エフエックスセイバー

mt5ではmt4に比べて動作がおかしい。取引を開いてすぐに閉じる。

何が問題なのでしょうか?

早速コードを見てみました。MT4でこのような条件が書かれているのはおかしい。

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

絶対にPrintにならない。そして、このコードは確かにHDDキラーだ。


クロスプラットフォーム用にいじってみた。

ファイル:
 

fxsaber

助けてくれてありがとう。しかし、問題は同じです。

注文を出すとすぐに閉じてしまいます。そして、1秒ごとにグルグル回り、止まりません。

mt4ではこのような問題はありません。

 
ilvic:

助けてくれてありがとう。しかし、問題は同じだ。

注文を出すとすぐに閉じてしまいます。そして、1秒ごとにぐるぐると、止まることなく。

mt4にはそのような問題はありません。

残念ながら、私はあなたの問題を理解する機会がありません。

 
// 変更リスト:
// 26.11.2018
// 修正: MT4のマジックポジションとクローズポジションコメント:オープニングトレードの対応するフィールドは、クローズトレードのフィールドよりも優先順位が高い。
// 修正: MT4-OrdersTotal および MT4-OrderSelect の計算中に MT5-OrdersTotal および MT5-PositionsTotal が稀に変更された場合、その変更が考慮されるようになりました。
//修正: ポジションをオープンしたが、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);

// if (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が1つ増えました。

  • 約定してOrdersTotalは1つ減りましたが、PositionsTotalは1つも増えませんでした。つまり、ポジションはあるが、ターミナルはそれを知らない。
  • たとえば、ポジションも注文もありません - PositionsTotal = 0、OrdersTotal = 0。

    成行注文を発注します。この場合、PositionsTotal = 0、OrdersTotal = 1 です。

    成行注文が約定 - OrdersTotal = 0。しかし、PositionsTotal = 0で ある!

    このような状況に遭遇するのは大変な労力を要する。それに気づくのはさらに難しい。しかし、MT5 はこのようなトリックを作成します。

    MT4Ordersはこのようなことをできるだけ避けようとしていますが、常に可能というわけではありません。TSの作者が純粋なMQL5またはSBでプラットフォームのそのような欠陥を考慮しようとしているかどうか、我々は推測することしかできません。可能性は低い。

     
    // ビジュアライザーに取引注文を手動で送信する方法のデモンストレーション。
    
    #include <MT4Orders.mqh> //https://www.mql5.com/ja/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();
    }