記事"MetaTrader 5 の注文、ポジション、取引"についてのディスカッション - ページ 4

 

OrderSend関数が trueを返し、result.orderに注文チケットがある場合(result.order!=0)、その注文はブローカーによって受理され、取引タブにあることを保証するのでしょうか、それともこの段階ではブローカーのサーバーによってのみ受理され、取引所では受理されないのでしょうか。

また、2つ目の質問として、OrderSendがtrueを返し、result.order==0となる状況はあり得ますか?

 
Aleksey Gunin:

OrderSend関数が trueを返し、result.orderに注文チケットがある場合(result.order!=0)、注文がブローカーによって受理され、取引タブにあることを保証するのか、それともこの段階ではブローカーのサーバーによってのみリクエストが受理され、取引所では受理されないのかを教えてください。

保証します。

2つ目の質問は、OrderSendがtrueを返し、result.order==0となる状況はあり得ますか?

いいえ。

 
fxsaber:

保証。

いいえ。

つい先日、OrderSend機能についての 説明が追加されましたので、オンラインヘルプをご覧ください。

 
Rashid Umarov:

つい先日、OrderSend関数に関する 説明が追加されました。

これは成行注文に適用されますか?

受け付けられた注文は、約定条件のいずれかが発生するまで、取引サーバーに保存され、処理されるのを待ちます:

  • 期限切れ、
  • カウンターリクエストの発生
  • 約定代金の受領による注文の発動
  • 注文取消要求の受信
ターミナル自体は、OrderSendAsyncの前に必ずOrderCheckを呼び出すという仕様はなく、OrderSendはOrderSendAsyncのアドオンです。

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

取引環境での典型的なエラーとその排除方法

fxsaber, 2018.02.20 12:23 pm.

標準的なOrderSend(タイムアウトなし)の実装の条件付きスキーム
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

標準的なOrderSendを実装するための // 条件付きアルゴリズム
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // 回路図
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


このスキームから、同じMetaQuotes-Demo上でOrderSendAsyncを介して成行注文を発注する場合、注文が約定または拒否されるまで、対応する注文を発注するイベントをキャッチすることを保証することは不可能であることが明確にわかります。つまり、MT5には、OrderSendAsyncの中間結果を評価する簡単なメカニズムがありません。


OrderSendは、Result.request_idがOnTradeTransactionのOrderSendAsyncと同じ値になるまで実行されます。またはタイムアウトで終了します。したがって、OrderSend の結果は、対応する request_id を持つ OnTradeTransaction のメッセージのタイプにのみ依存します。

request_id そのものの形成について教えていただけると助かります。私の理解が正しければ、これはターミナル/アカウントを起動/接続した時点からトレードサーバーに送信された注文のカウンターです。ターミナル自体がトレードサーバーからの受信メッセージを分析し、必要なrequest_idを1つだけに割り当てるか(疑わしい)、またはrequest_idを特定のメッセージにリセットします(可能性が高い)。この動作のおかげで、しばらく前に、入札履歴をOrderSendの出力と一致させることができました。しかし、OnTradeTransactionでは正しいrequest_idを持つメッセージが1つしか表示されないため、上の引用文にある非同期モードでの不快な状況が発生します。

 

こんにちは。MqlTradeResult.dealとMqlTradeResult.orderの矛盾を見つけました。

1) 説明(MQL5リファレンスマニュアル)


2) リアルタイム取引

成行注文(TRADE_ACTION_DEAL)を発注しています。Print関数を使ってMqlTradeResultの値を出力します:


とログに表示されます:

Sleep 関数で数秒間「スリープ」し、再度データを出力してみましたが(取引がすでに正確に行われ、ポジションがオープンされている場合)、取引の数字は表示されませんでした。


3) ストラテジー・テスター

ここではすべてのフィールドが埋まっています:



何がこのような違いを生むのでしょうか?

 
Konstantin Kulikov:

こんにちは、MqlTradeResult.dealとMqlTradeResult.orderの不整合が見つかりました。




https://www.mql5.com/ja/docs/trading/ordersend

成行注文を送信する場合(MqlTradeRequest.action=TRADE_ACTION_DEAL)、OrderSend()関数の成功結果は、注文が執行された(対応する取引が執行された)ことを意味しません。取引サーバは、 OrderSend()コールに対するレスポンスを形成する時点でこれらのデータが既知である場合、 返された 結果 構造 体に 取引 または 注文 フィールドの値を記入することが できる 一般的に、OrderSend()コールの応答が送信された後に、注文に対応する取引の実行イベントが発生することがある。したがって、どのようなタイプの取引要求であっても、OrderSend() の実行結果を受信する際には、まず、 返ってきた結果構造 体で利用可能な取引サーバーの戻りコード retcode と外部取引システムの応答コード retcode_external (必要な場合)を確認する必要がある


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

有益な記事をありがとう。メタクォーツ

クエリ1つのfor()ループで、未決済の注文と未決済のポジションの両方をまとめてループさせるにはどうすればよいでしょうか(MQL4ですべての注文をループさせ、注文が約定済みか未決済かをチェックする方法と同様です)?

 
Rahul Dhangar :

有益な記事をありがとう。メタクォーツ

質問です:1つのfor()ループで、未決済の注文と未決済のポジションの両方をまとめてループさせるにはどうすればよいでしょうか(MQL4ですべての注文をループさせ、注文が約定済みか未決済かをチェックする方法と同様です)?

ポジションと未決済注文を計算するには、2つの独立したサイクルを使用する必要があります。1つのサイクルはポジションを列挙し、2つ目のサイクルは保留中の注文を列挙します。例:ポジションとペンディング注文の計算

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

多くの批判があるにもかかわらず、強力なコミュニティがあるのだから:

翻訳とテキストの言葉遣いが理解を妨げている...私は汗をかきながら、誰が最初に来るべきかを見つけるために遠くまで行かなければならなかった:

  • 注文履歴

    履歴から注文に関する情報を取得するには、まず3つの関数のいずれかを使用して注文履歴キャッシュを作成する必要があります:HistorySelect(start, end)、HistorySelectByPosition()、または HistoryOrderSelect(ticket)です。実行に成功すると、HistoryOrdersTotal() 関数によって返された注文数がキャッシュに保存されます。これらのオーダーのプロパティへのアクセスは、適切な関数を使用して、チケットの各要素によって実行されます:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. HistoryOrderGetString(ticket_order, type_property)


対照的:https://www.mql5.com/ja/docs/trading/historyorderstotal 以下に転記。



ヒストリーオーダー合計

履歴内の注文数を返します。HistoryOrdersTotal() を呼び出す前に、まず、HistorySelect() 関数 または HistorySelectByPosition() 関数を使用して、取引と注文の履歴を受け取る必要があります。

int HistoryOrdersTotal();

戻り値

double 型の値。

注意

取引履歴の注文とツールボックスバーの「取引」タブに表示さ れる 未決注文を 混同しないでください。キャンセルさ れた 注文や 取引に至った注文のリストは、クライアント端末のツールボックスの「履歴」タブで確認できます。

以下もご参照ください。


結局のところ、HistoryOrdersTotalと、HistorySelect(start, end) HistorySelectByPosition()またはHistoryOrderSelect(ticket)、あるいは 2番目の文章で言及されているHistorySelectByPosition()の3つの関数のうち、どちらが先なのでしょうか。

難しかったですね、もっと簡単だったかもしれませんが...最初に思いつくのは、2番目のテキストで言及 されている3つのHistorySelect(start, end) HistorySelectByPosition ()か HistoryOrderSelect(ticket)、あるいは HistorySelectByPosition()の どれかだと思うのですが...。

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

こんにちは、
開発者の方に質問です。履歴キャッシュがどれくらいのメモリーを消費するか、おおよその情報を教えてください。

少ない履歴でスクリプトをターミナルで実行したところ、このような結果になりました:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

つまり、数百万件の取引と100万件の注文の履歴がある場合、キャッシュには約1ギガバイトが必要ということですか?

各mqlプログラムに対して?