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

 
fxsaber:

注文が800件を超えたことがある。このような場合、数百の注文をハッシュマップする必要があります

しかし、15分ごとに起こるわけではありませんよね?
 
mktr8591:
でも、15分ごとに起こることじゃないでしょう?

そうだね。

 

このバンドルをご利用の方へ

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

ライブラリ: MT4Orders

fxsaber, 2021.05.12 21:58

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // 取引環境の同期を待つ最大時間(単位:µs
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

私はシンクロナイザーを更新することをお勧めします。

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

ライブラリ: TradesID

fxsaber, 2021.06.30 15:53

ByPass.mqhが更新されました。部分的に約定した注文を削除する状況で正しく機能します。問題発生時のロギングを追加しました。

修正 されるまではb2958で 作業することをお勧めします。

 
fxsaber:

MT4Orders.mqhのコード(2021.06.01から)について、いくつかの点を明確にしてください:

1. 1413行目 HistoryDealSelect2():
else if (::HistoryDealGetInteger(DealTicket, DEAL_TIME_MSC) < OrderTimeFill)
            break;

ここでは、取引時刻が注文時刻より短い場合、履歴サイクルが中断されます。

mqh における取引の時間が、その取引が約定した注文の時間よりも短いということは、実際には起こりませんか(注文が一度に複数の取引で約定した場合を意味するのではありません)。

2. 2259行目 MT4OrderSend():

return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult)
          #ifdef  MT4ORDERS_BYPASS_MAXTIME
            && (!MT4ORDERS::IsHedging || _B2(MT4ORDERS::ByPass += MT4ORDERS::LastTradeResult.order))
          #endif // #ifdef MT4ORDERS_BYPASS_MAXTIME
                                                                                          ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order - MT5-ヘッジ機能
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (_B2(::PositionSelect(MT4ORDERS::LastTradeRequest.symbol)) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // MT4ORDERS::OrderSendのHistoryDealSelect
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

注文が MT4ORDERS::ByPass+= に追加されないのはなぜですか?

3: いくつかの関数で、WHILE(A) マクロを使用しています: 1088行目

#define  WHILE(A) while ((!(Res = (A))) && MT4ORDERS::Waiting())

なぜIsStopped()をチェックしないのですか? 時間を最適化するためですか? ユーザーがOrderSend_MaxPauseを数秒に設定したらどうしますか?

4.OrderSend(LastTradeRequest,LastTradeResult)の前に、LastTradeResultをクリアしていないことに気づきました。これは関数自体が行っているのでしょうか?文書化されていない機能ですか?

 
mktr8591:

MT4Orders.mqhのコード(2021.06.01から)について、いくつかの点を明確にしてください:

1. 1413行目 HistoryDealSelect2():

ここでは、取引時刻が注文時刻より短い場合、履歴サイクルが中断されます。

mqh における取引の時間が、その取引が約定した注文の時間よりも短いということは、実際には起こりませんか(注文が一度に複数の取引で約定した場合を意味するのではありません)。

文脈から大きく外れている。HistoryDealSelect2が 呼び出される場所を見てください。Result.orderが完全に実行された状態でnullの場合、Result.dealはそこにあります。保存には時間制限があります。おそらく、大規模なヒストリーの問題でテストされています。すでに覚えていない。私自身は、OrderSendの 組み込みシンクロナイザーを使用していません。なぜなら、NULL MT4ORDERS::OrderSend_MaxPauseを取るから です。

 
mktr8591:

2. 行 2259 MT4OrderSend():

MT4ORDERS::ByPass+=に注文が追加されないのはなぜですか?

ネッティングのためのByPassは考えたことがありません。自分用に書いています。
 
mktr8591:

3. いくつかの関数でマクロWHILE(A)を使っている:1088行目

なぜIsStopped()をチェックしないのですか? 時間を最適化するためですか? ユーザーがOrderSend_MaxPauseを数秒に設定したらどうしますか?

実際には、ここで問題はないと思います。忘れっぽいから追加しなかったのではありません。

 
mktr8591:

4.OrderSend(LastTradeRequest,LastTradeResult)の前に、LastTradeResultをクリアしていないことに気づきました。これは関数自体が行っているのでしょうか?文書化されていない機能ですか?

すべてのMqlTradeResultフィールドはOrderSendによって埋められるようです。

 
fxsaber:


ありがとう!

図書館は素晴らしい。

 
fxsaber:
僕はネットのためにByPassをデザインしたわけじゃない。自分のために書いているんだ。
ネットの観点からByPassのコードを見てみた。(もちろん、テストしてください)。