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

 
Aleksey Vyazmikin GetLastErrorについて勉強した 結果、補足するのは合理的ではないという結論に達しました。
// 変更リスト:
// 08.02.2017:
// 追加: MT4ORDERS::LastTradeRequest およびMT4ORDERS::LastTradeResult 変数 содержат соответствующие данные MT5-OrderSend.

これでMT5-OrderSendの全データを取得できるようになりました。

Print(MT4ORDERS::LastTradeResult.retcode); // オペレーションのリターンコード
Print(MT4ORDERS::LastTradeResult.retcode_external); // 外部取引システムのリターンコード 

MT5のコード自体はこちらMT4のコードと 比較してください。


MT5 では、GetLastError() は取引エラーを返さないことに注意してください。したがって、MT4 のようにしたい場合は、SetUserError を 使用して対応する独自のエラーを生成する必要があります。しかし、そこでもERR_USER_ERROR_FIRST は MT4 バージョンを返しません。

 

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

ライブラリ: MT4Orders

fxsaber, 2022.07.20 00:39

// 変更リスト:
// 20.07.2022
// 追加:OrderLotsOpen() を追加 - 決済/削除前にポジション/注文の全量を表示。ByPass-modeでのみ正しく動作します。

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

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


void OnStart()
{
  const ulong Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // ロット分のポジションを開設。

  for (int i = 1; i <= 4; i++)    
    if (OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
    {
      OrderClose(OrderTicket(), 0.1 * i, OrderClosePrice(), 0); // 0.1、0.2、0.3、...で閉じる。で閉じる。
      
      if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
      {
        OrderPrint();
        
        PRINT(OrderLotsOpen()); // 対応するクローズ前のポジション量。取引履歴から取得。
      }
    }
}


結果

#50167020751 2022.07.20 09:58:58.401 buy 0.10 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.457 1.02468 0.00 0.00 -0.29 0
OrderLotsOpen() = 1.0

#50167020753 2022.07.20 09:58:58.401 buy 0.20 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.512 1.02468 0.00 0.00 -0.59 0
OrderLotsOpen() = 0.9

#50167020754 2022.07.20 09:58:58.401 buy 0.30 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.567 1.02468 0.00 0.00 -0.88 0
OrderLotsOpen() = 0.7

#50167020755 2022.07.20 09:58:58.401 buy 0.40 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.622 1.02468 0.00 0.00 -1.17 0
OrderLotsOpen() = 0.4
 

MT5と比較したライブラリによるクローズドポジションの 表示の特殊性。


取引状況。

  1. BuyLimitを1ロット建てた。
  2. 12:00に0.4ロットのBuyLimitが一部約定。
  3. 0.4ロットのポジションは13:00に決済されました。
  4. 14:00に0.6ロットのBuyLimitの残りが約定。
  5. 0.6ロットのポジションは15:00に決済されました。

MT5では、12:00にオープンし、15:00にクローズしたポジションが1つあったことがわかります。このポジションの始値/終値は非常に奇妙です。


MT4Ordersでは、12:00にオープンして13:00にクローズしたポジションと、14:00-15:00にオープンしたポジションの2つが表示されます。始値/終値は適切なものになります。

 
fxsaber #:

MT5-Marketの一部はこのライブラリを使って書かれている。主な理由は使いやすさである。

たしかにそれは成果である。しかし、市場受け入れ時のエラー・チェックは、すべての状況を再現するわけではありません。

fxsaber#:

エラーについて。

MT5のコード自体はここに あります。MT4のコードと 比較してください。


MT5では、GetLastError()は取引エラーを返さないことに注意してください。したがって、MT4のようにしたい場合は、SetUserErrorを介して 対応する独自のエラーを生成する必要があります。しかし、そこでもERR_USER_ERROR_FIRST は MT4 バージョンを返しません。

情報ありがとうございます。

私の理解は正しいでしょうか?

int er=GetLastError();

int er=MT4ORDERS::LastTradeResult.retcode_external;

に置き換えるだけで、すでに新しいエラーコードを処理しているという理解でよろしいでしょうか?

ところで、私はMT5のエラーの類似を見つけられませんでした:135、145、146です。

 
Aleksey Vyazmikin #:

そう、それは成果だ。しかし、マーキーの入場エラーチェックは、すべての状況を再現するわけではない。

残念ながら、私はマーケットについて理論的な考えしか持っていない。チェックをパスする練習はしていません。

新しいエラーコードを交換し、すでに処理すれば十分だという理解で合っていますか?

正しい。retcodeだけです。ResetLastErrorのアナログは同じスキームです - ゼロの割り当て。

ところで、私はMT5用のエラーのアナログを見つけられませんでした:135、145、146です。

エラーの種類は、戦闘エキスパート・アドバイザーで使用していないため、まったくわかりません。おそらく、MT4で各エラーを再現してみて、その性質を明確に把握し、MT5の同様のエラーと比較すべきです。もしかしたら、すでにどこかに対応表があるかもしれません。すべてのコードに別のプラットフォームでの別名があるわけではありません。

 
fxsaber #:

その通りだ。retcodeだけだ。同じスキームでResetLastErrorのアナログ - ゼロの割り当て。

では、エラー・リセットはどうにかしてあなたのクラスに統合できないでしょうか?4つ目のクラスはどうにかしてそれを必要としなかったからだ。

それとも、最後のエラーに関する情報を呼び出してすぐにリセットするだけでいいのでしょうか。

fxsaber#:

私はエキスパート・アドバイザーを使っていないので、エラーの種類はわかりません。おそらく、MT4で各エラーを再現してみて、その性質を明確に把握し、MT5での類似のエラーと比較すべきです。もしかしたら、すでにどこかに対応表があるかもしれません。すべてのコードが別のプラットフォームで同じ名前を持つという事実はありません。

私はそのような表を探していましたが、見つかりませんでした。エラーはコードにあるとは限りません。ブローカー・センター側の問題もあります。

注文の処理に何らかの問題がある場合、GetLastError(); はコード4756を返すと理解しました。

 
Aleksey Vyazmikin #:

では、エラーリセットをクラスに組み込むことはできるのでしょうか?つまり、4人はそれを必要としていないように見えた。

それとも、最後のエラーに関する情報を呼び出し、それを一度にリセットするだけでいいのでしょうか?

リセットする必要はないと思います。私は、MT4が動作すると仮定している方法との互換性を追加するために言いました。

 
fxsaber #:

リセットの必要はないと思います。MT4が動作すると仮定した方法との互換性を追加するために言いました。

私はまだ明確にする必要があります、これらのエラーは呼び出されたコードの下にありますか?

Print(MT4ORDERS::LastTradeResult.retcode); // オペレーションのリターンコード

似たようなことなので - 何が必要なのか私は理解していない - 下の同じコードはMqlTradeResult 構造体からエラーを返しますか?

Print(MT4ORDERS::LastTradeResult.retcode_external); // 外部取引システムのリターンコード 
 
Aleksey Vyazmikin #:

これらのエラーはコードと呼ばれるものですか?

似たようなことなので - 何が必要なのか私は理解していない - 以下の同じコードは、MqlTradeResult 構造体からエラーを返す?

retcode - MT5エラー。retcode_external - オプションでサードパーティ製のブリッジの開発者によって記入することができるフィールド。

 
fxsaber #:

retcode - MT5のエラー。retcode_external - サードパーティ製ブリッジの開発者が任意で入力できるフィールド。

わかった。今のところ、標準のもので十分だと思う。