取引環境に対応する際の典型的な間違いとその対処法 - ページ 9

 
Algotrader18:

こんにちは。

皆さん、特にfxsaberさんに同じような質問をさせていただきます。
原始的な質問のようだが、その答えが見つからない。
こちら https://www.mql5.com/ru/forum/6343/page939 「検索してみてください」と言われました。fxsaberはこの問題に取り組んでいます。何がうまくいったのか、わからない、興味がない。"そこで、あなたに聞いてみることにしました。

問題はこれだ。ポジションをオープンし、MqlTradeResultの 内容を表示させたい。

retcode、order、volumeは印字されますが、dealとpriceは常に0です。
また、結果構造のコンテンツにアクセスする方法(少なくとも、最初に印刷する)についても教えてください。

これはどうでしょう?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

ポジションをオープンして、 MqlTradeResultの 内容をこのように表示したい

retcode、order、volumeは印刷されますが、dealとpriceは常に0 です。
私が間違っていることと、result 構造体の内容にアクセスする(少なくとも最初にプリントする)方法を アドバイスしてください。

結果にはゼロが書き込まれる。

 
Artyom Trishkin:

これはどうでしょう?

ありがとうございます。でも、結果は同じです...。
 
fxsaber:

結果にはゼロと規定されている。

それじゃあ、全然わからないですよね。何か間違ったことをしているのかと思ったし、そこにゼロがあったら、結果的にどうなるんだろう?
オープンオーダーを見ると、result.retcodeが10009でresult.price = 0 ?
結果が含まれていない場合のresultの意味を教えてください。
 
Algotrader18:
結果が含まれていない場合、どのような意味があるのか説明してください。

これはMT5の機能で、結果は注文(チケットと価格なし)だけで、取引はできません。いくつかのオプションがあります。

  1. 自分で仕組みを考えよう。
  2. すでに用意されている上位(下位は非表示)の開発を利用することで、ほとんどすべての落とし穴を回避することができます。
 
fxsaber:

これはMT5の機能で、結果は注文(チケットと価格なし)だけで、取引はできません。いくつかのオプションがあります。

  1. 自分で仕組みを考えよう。
  2. すでに用意されている上位(下位は非表示)の開発を利用することで、ほとんどすべての落とし穴を回避することができます。
ありがとうございます。

MQL4では結果構造がなく、チケットを受け取って適切な順番を選択し、必要なデータを要求していました。MQL5には、必要なデータを多く含む結果構造があり、これを利用しないのは非論理的です。

1.フォーラムで質問する前に、「すべての仕組みがどのように動いているのか」を自分自身で把握しようとし、その結果、見えてきたものがあります。

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


present double price; // ブローカーが確認した取引価格。

開発者のサンプルコードでは

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
はresult.dealを出力する。つまり、意味があると仮定され、結果構造において常にゼロで表現されるわけではない。他にも、MqlTradeResulからresult.priceだけでなくresult.dealも取得できることを示す例があれば、私が試したようなことができるかもしれません。


結果が注文(チケットと価格なし)だけで取引にならない場合は、MT5の機能である」という情報はどこにもありません。どのような情報をもとにそう判断されたのか、教えてください。

2.チケットによる事前選択なしに、ポジションのオープン(コード10009出現)直後にパラメータを取得できる「すでに準備されている上位(下位は非表示)開発」をご存知でしたら、例を挙げるかリンクを教えてください。

 
Algotrader18:
ありがとうございます。

MQL4では結果構造がなく、チケットを受け取って適切な順番を選択し、必要なデータを要求していました。MQL5では、必要なデータを多く含む結果構造を持っており、これを利用しないのは非論理的です。

1.フォーラムで質問する前に、「すべての仕組みを自分で把握する」ことを心がけましたが、その結果見えてきたのは、「構造の結果」ということです。


double price; // ブローカーによって確認された取引価格がある。

開発者のサンプルコードでは

はresult.dealを出力する。つまり、意味があると仮定され、結果構造において常にゼロで表現されるわけではない。MqlTradeResulからresult.priceだけでなくresult.dealも取得できることを示す例は他にもあり、それを試してみた。


MT5の機能で、結果が注文(チケットと価格なし)だけで取引にならない」という情報はどこにもありません。どのような情報をもとにそう判断されたのか、教えてください。

2.チケットで事前に選択しなくても、ポジションがオープン(コード10009が表示)された直後に、そのポジションのパラメータを取得できる「既に用意されている上位(下位は非表示)の開発」をご存知でしたら、例を挙げていただくか、リンクを教えてください。

取引要求の結果、拒否または成行注文が発生する。これは取引ではなく、また取引によって発生するポジションでもありません。

  1. ポジションを建てるための取引注文がサーバーに送信される(注文=オーダー)
  2. 注文を受け付けた場合、注文を受け付け、キューに入れた結果を返す。
  3. 注文が執行されると、注文執行の結果である取引が表示されます。
  4. 取引結果は、新規ポジション、既存ポジションの増減、ポジションの決済、またはロールオーバーのいずれかとなります。あるいは(ヘッジ口座での)新規ポジション。
 
Artyom Trishkin:

取引要求の結果、拒否または成行注文が発生する。これは取引ではなく、また取引によって発生するポジションでもありません。

  1. ポジションを建てるための取引注文がサーバーに送信される(注文=オーダー)
  2. 注文を受け付けた場合、注文を受け付け、キューに入れた結果を返す。
  3. 注文が執行された場合、注文執行の結果として取引が表示されます。
  4. 取引の結果は、新規ポジション、既存ポジションの数量の増減、ポジションの決済、ロールオーバーのいずれかになります。または新規ポジション(ヘッジ口座の場合)
ありがとうございます-教えてください
- トレードリクエスト結果構造体(MqlTradeResult)が表示されるのは、リストアップしたうちのどのステップの後だと思いますか?

- MQL5の記述による。
"取引依頼結果(MqlTradeResult)の構成
取引サーバは、取引要求に対する応答として、取引要求の処理結果を含むデータを、予め定義された特別な構造体「MqlTradeResult」として返します。と「10009 TRADE_RETCODE_DONE 注文が実行されました。

MqlTradeResultからデータを要求した場合、10009を受け取った後、result.price = 0をどのように説明できますか?
 
Algotrader18:
ありがとうございます。
- トレードリクエスト結果(MqlTradeResult)の構造が表示されるのは、リストアップした中でどのステップ以降でしょうか。

- MQL5の記述による。
"取引依頼結果(MqlTradeResult)の構成
取引サーバは、取引要求に対する応答として、取引要求の処理結果を含むデータを、予め定義された特別な構造体「MqlTradeResult」として返します。と「10009 TRADE_RETCODE_DONE 注文が実行されました。

したがって、取引サーバーのリターンコード10009は、OrderSendリクエストが正常に実行されたことを意味します。つまり、コード10009を受け取った後、MqlTradeResultからデータを要求した場合、result.price = 0と説明できますか?

10009 TRADE_RETCODE_DONE - あなた自身が記述している - 注文が実行されました。これは、単に注文がサーバーに正常にキューイングされ、実行されたことを意味する。

さらに、この注文が実行されると(結局のところ、サーバーによって拒否される可能性がある)、取引が行われます - これが始値との取引の 結果です。

について読む

OnTradeTransaction

Expert Advisor では、TradeTransaction イベントが発生したときに呼び出されます。取引要求の実行結果を処理するための機能である。

voidOnTradeTransaction()
const MqlTradeTransaction&trans,// トレードトランザクションの構造体
const MqlTradeRequest&request,// リクエスト構造体
const MqlTradeResult& result// 応答の構造体
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

MT5の機能で、結果は注文(チケットと価格なし)のみで取引にはならない」という情報はどこにもありません。どのような情報に基づいて、このような結論に至ったのか、教えてください。

自身の経験。

2.チケットによる事前選択なしに、ポジションのオープン(コード10009が出現)直後にパラメータを取得できる「すでに準備されている上位(下位は非表示)開発」をご存知でしたら、その例かリンクを教えてください。

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

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


もう一つオプションがありますが、それは「上級者向け」です。

理由: