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

 
fxsaber:

すべての変更点はヘッダーに書かれています。

ええ、でもそれが何なのかわからないでしょう。そうしたらお見せしますよ。


fxsaber:

ZY KBで僕の作品を見たんだけど...。ZIPのことは忘れた方がいい。

その通り。Zipは更新されない(

 
// 変更リスト:
// 08.02.2019
// 追加:OrderCloseによって部分的にクローズされると、ポジションコメントが保存される。
// 部分決済時にオープンポジションのコメントを変更する必要がある場合は、OrderClose で設定できる。
 

MQL4だけでは解決できないタスクもある。

しかし、MT4スタイルとMT5スタイルは並行して使うことができる。そのような組み合わせの例を紹介します。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

OnTradeTransactionトランザクション処理

fxsaber, 2019.02.08 12:37 pm.

タスク

未決注文はネッティングで発注される(多方向、各タイプいくつでも可能)。元の未決注文がトリガーされるたびに、そのSL/TPをストップ/リミット未決注文の形で発注する必要があります。この場合、SL/TP注文は、1つの注文がトリガーされると、2番目の注文が削除されるというように、依存関係にある必要があります。最初の注文と SL/TP 保留注文は、部分的にトリガーすることができます。Expert Advisor は、別のターミナルへの転送を含め、いつでも再ロードできます。


ソリューション

#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

KimのMT4での機能はかなり人気があるので、私は彼のサイトからすべてのソースをダウンロードし、MT5でそれらのための簡単な「コンバータ」を書きました。
#include <KimIVToMT5.mqh> //https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "e-Trailing.mq4" // http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=14

void OnTick() { start(); }

Kimのコンバーターによって、他のMT4アドバイザーもMT5で動作することが判明しました。

#include <KimIVToMT5.mqh> //https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "Reaction.mq4"   //https://www.mql5.com/ja/code/24609

void OnTick() { start(); }
 
// 変更リスト:
// 20.02.2019
// 修正: 既存のMT5取引からのMT5注文がない場合、ライブラリは履歴の同期を待機します。失敗した場合、そのことを報告します。


MT5でこの落とし穴を回避

取引、自動取引システム、取引戦略のテストに関するフォーラム

MetaTrader 5ビルド2005の新バージョン:経済カレンダー、サービスとしてのMQL5プログラム、R言語用API

fxsaber, 2019.02.20 21:06

こんにちは サービス
// スクリプトは、トランザクションのオーダーが履歴に存在しない場合を捕捉する。

#define _CS(A) ((!::IsStopped()) && (A))
#define  TOSTRING(A) #A + " = " + (string)(A) + " "
#define  OFFSET 100

void OnStart()
{
  datetime PrevTime = OFFSET;
  
  while (_CS(true))
  {
    if (HistorySelect(PrevTime - OFFSET, INT_MAX))
    {
      const int Total = HistoryDealsTotal();
      
      for (int i = 0; _CS(i < Total); i++)
      {
        const ulong DealTicket = HistoryDealGetTicket(i);
        const ulong OrderTicket = HistoryDealGetInteger(DealTicket, DEAL_ORDER);        
        
        int Count = 0;
        const ulong StartTime = GetMicrosecondCount();
        
        while ((HistoryOrderGetInteger(OrderTicket, ORDER_TICKET) != OrderTicket) && !HistoryOrderSelect(OrderTicket)) // トランザクション・オーダーがない場合
          Count++;
        
        if (Count)
          Alert(TOSTRING(DealTicket) + TOSTRING(OrderTicket) + TOSTRING(Count) + TOSTRING(GetMicrosecondCount() - StartTime)); // 状況をプリントアウトする
        
        PrevTime = (datetime)HistoryDealGetInteger(DealTicket, DEAL_TIME);
      }
    }
    
    Sleep(0); // これがないと、ターミナルは即座にハングする。
  }
}


Sleepをコメントアウトすると、Terminalを実行することで即死します。しかし、これは別のことでしょう。

ヒストリにディールオーダーが ない場合、簡単にキャッチできることがわかった。

MQ-Demoスクリプトの結果

Alert: DealTicket = 336236873 OrderTicket = 356249474 Count = 1614408 GetMicrosecondCount()-StartTime = 229880 
Alert: DealTicket = 336236882 OrderTicket = 356249486 Count = 1565921 GetMicrosecondCount()-StartTime = 229998 
Alert: DealTicket = 336236887 OrderTicket = 356249492 Count = 1559345 GetMicrosecondCount()-StartTime = 229788 
Alert: DealTicket = 336236898 OrderTicket = 356249505 Count = 157107 GetMicrosecondCount()-StartTime = 22878 
Alert: DealTicket = 336236901 OrderTicket = 356249508 Count = 1544271 GetMicrosecondCount()-StartTime = 220879 

ディールオーダーが履歴に表示されるまで200ミリ秒以上かかる!この間、例えばスリッページや約定期間を判断することは不可能です。

クローズしたポジションだけのデータをファイルに書き出すサービスが必要な状況を想像してみてください。この "機能 "のために、それを実行することは不可能です。


MT5のこのアーキテクチャ上の特徴は、どのような方法でも修正できないということでよろしいでしょうか?


このようなことがライブラリでどれだけ考慮されているか、数えるのは難しいです。

 
Andrey Khatimlianskii:

ええ、でも中身は見えませんよ。そうしたら見せてあげるよ。


その通り。zipは更新されない。

ファイルを1つずつダウンロードすると、修正日が消えてしまう。サイズ別にナビゲートしなければならないが、すべての修正でサイズが変わるわけではない。

これが提案だ:

すべてのファイルのヘッダーに更新日、バージョン番号、変更履歴を追加する。

ファイルに加えて、何人かの人がしているように、zip/rarを投稿してください。

 
bool IsTradeAllowed(void)
  {
   return(::MQLInfoInteger(::MQL_TRADE_ALLOWED));       // ブーリアンでない式
  }
 
Edgar:

ライブラリーはたった1つのファイルに収められている。残りはすべて、非常に長い間更新されていない、その辺のチンケなものです。

しかし、OrderSend_Test2.mq5もあります。これはMT5とライブラリのストレステストです。これは取引サーバーにスパムを送り、自動取引を停止させます。

 

そうだね。今回はそうだ。しかし、前回から3つのファイルが変更されている。

バージョン管理を簡単にする一般的な方法論のことだ。僕自身はいつもmqhのヘッダーに日付を追加し、mq5に日付とバージョンを追加している。

そして、私の完全なアーカイブ(修正日を保存する)を含めることで、何も考えずにすべてを更新することができます。
 
Edgar:

そうだね。この場合はそうだ。しかし、前回から3つのファイルが変更されている。

バージョン管理を簡単にする一般的な方法論のことだ。私自身はいつもmqhヘッダーに日付を追加し、mq5に日付とバージョンを追加している。

私はgithubのような、すでにQB作業用の公開されたアナログを提供された。しかし、年寄りは喜びを感じない。

おそらくあなたには、そのようなオプションが適しているでしょう。

私だけがMT4Ordersを使っているわけではないので、私は変更を発表し、MT4Ordersのためだけに帽子をかぶっています。

他の仕事に関しては、黙ってやっています。