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

 
Sergey Likho:

同時に、ログにはすべてが正常であるというメッセージも表示される。

この トピックについては、この ページにいくつかのリンクがあります。簡単に言うと、ログにResult.dealがnullであることがわかります。ログ(Request.positionがNULLではない)を見ると、OrderCloseが行われ、正常に完了したはず(Result.code)ですが、同時に、それに関する記録(DEAL_ENTRY_OUT deal)がターミナルに一瞬表示されませんでした(ライブラリが待機していました)。これは、2つのシナリオを示しています:

  1. MT5 取引注文は正常に送信されたが、MT5 取引は通過しなかった。
  2. 取引は成立したが、取引履歴に表示されなかった。

どちらのシナリオも、MT5にとっては必ずしも良いことではありません(詳細な議論については、上記のリンクを参照してください)。残念ながら、ライブラリは明確に機能した。このようなニュアンスはすべて一度熟慮して分析され、それに応じてライブラリは合理的な反応を開発しました。

 
Sergey Likho:

テスト用に fhtm デモブローカーを使用すると、OrderSend 関数は取引を開始しますが、エラーを返します。

再試行したところ、私のミスであることがわかりました。この取引サーバーでのMT5の動作は興味深い

修正しました。必要であれば、PMに送ります。それで、モデレーターを困らせないために、開発者が新しいビルドでDEAL_SL/TPを解決する ときに、KBに投稿します。

 
fxsaber:

リプレイしたところ、私のせいだとわかりました。この取引サーバーでのMT5の興味深い動作が判明しました

修正しました。必要であれば、PMに送ります。それで、モデレーターを煩わせないように、開発者が新しいビルドでDEAL_SL/TPを解決する ときに、KBに投稿します。

はい、PMに送ってください。

 
Sergey Likho:

はい、PMを送ってください

送信しました。

まれですが、このようなアラートが発生することがあります。

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

これは、MT5-OrderSendがエラーで動作していることを示す、純粋に情報提供のためのアラートです(取引には影響しません)。このエラーについては、こちらで 詳しく説明しています。しかし、開発者はこれが MT5 の誤った動作だとはまだ考えていません。


ZYMT5の微妙な点が明らかになりました。ライブラリ経由の取引ではファントムオーダーは発生しません。

 
Andrey Khatimlianskii:

長い歴史に裏打ちされた仕事は、今や飛ぶ鳥を落とす勢いだ!

予期せぬ結果もあった。スクリプトは最後の "ポジション "のオープン/クローズの時間を計算する。

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

OrderCloseTimeエキスパートアドバイザーMQL5

fxsaber, 2018.07.06 00:49

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


結果

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

なぜライブラリのパフォーマンスが純粋なMQL5よりはるかに優れているのかは分析していません。HistorySelectがリアルタイムで遅くなると推測しています。テスターでは確認していません。


はい、HistorySelectは遅くなります。

 

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

ライブラリ: MT4Orders

fxsaber, 2017.09.03 18:52

// 変更リスト:
// 03.09.2017:
// 追加: OrderTicketOpen()を追加 - ポジション開始取引のMT5チケット
// OrderOpenReason() - MT5が取引を開始する理由 (ポジションを開く理由)
//OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


SLによってクローズされたすべてのポジションのプリントアウト

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

ポジションがストップロスに入ったときの終値を知るには?

fxsaber, 2018.07.10 11:46 AM

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

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

ちょっと予想外の結果。スクリプトは最後の "ポジション "の開閉時間を計算する。

なぜライブラリーのパフォーマンスが純粋なMQL5よりはるかに優れているのかは分析していない。HistorySelectがリアルタイムで遅くなると推測しています。テスターでは確認していません。

はい、HistorySelectは遅くなります。

これはライブラリの最新バージョンですか?

 
Vitaly Muzichenko:

これはライブラリーの最新バージョンですか?

はい。

 

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

ライブラリ: MT4Orders

fxsaber, 2017.02.16 15:16

このスクリプトでMT5での約定問題を見つけることができました。ターミナルとトレーディングサーバーの接続を確認し、問題がある場合はサービスデスクに報告することをお勧めします。


アプリケーションのスクリプトを更新しました。例えば、以下のような問題を素早く見つけることができます。

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
ファイル:
 

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

ライブラリ: MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53 pm.

// 30.05.2018
// 追加:取引履歴を使った作業を加速させ、パフォーマンスと実現性の黄金平均を選択した。
// メモリ消費 - VPSでは重要。標準的なGenericライブラリを使用。
// もしジェネリック・ライブラリーを使いたくないのであれば、ヒストリーを扱う古いモードが利用できる。
// これを行うには、MT4Orders-libraryの前に以下の行を記述する必要があります。
//
// #define MT4ORDERS_FASTHISTORY_OFF // 高速取引履歴の実装をオフにする - Genericライブラリを使用しない。

長い履歴での作業は、今はただ飛ぶだけです!

一般的な賞金を数字で確認する
#define  MT4ORDERS_FASTHISTORY_OFF // 取引履歴の高速実装をオフにする - Genericライブラリを使用しない。
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


ジェネリックなしの結果

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


ジェネリックありの結果

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


10K 取引と 20K 注文の履歴では、Generic バリアントは ~30 倍高速です。取引履歴が大きいほど、加速は顕著になる。