OnTradeTransaction関数について質問です。 - ページ 5

 
papaklass:

OnTradeTransaction()は、取引イベントのRUNNERである。何がきっかけになったかは問題ではなく、重要なのはその事象が発生したことです。

以下は、ドキュメントからの抜粋です。

OrderSend() / OrderSendAsync() は、TRADE FUNCTIONS です。

OnTradeTransaction() では、取引注文の 送信に使用した関数が OrderSend() と OrderSendAsync() のどちらであってもかまいません。

主題を作る前に何度も読み返しましたが.何も言いませんよ。

しかし、それにもかかわらず、私の結論は、1秒間に1つのトランザクションを失うよりも、ヒープで1つのトランザクションを失う方が確率が高く、もしかしたら1(秒)にもならないかもしれないということです。それこそ、私が知りたいことです。あなたの意見を聞いて みたい。かなり希少なシングルであれば、取引に失敗する確率はどのくらいなのでしょうか?

 
papaklass:
確率の面では、わからない。

マイケルの実体験に基づく、たったひとつの意見に頼るしかない。もし彼が半年間、山ほどの注文から一度も取引を失っていないのなら、一度の注文も失われないと考えることにしよう。

論理を破綻させないようにしながら、少しずつコツをつかんでいるのですが、時々、片方が邪魔になることも......。

 
AlexeyVik:

私たちは、マイケルさんの経験に基づくたった一つの意見に頼らざるを得ないでしょう。もし彼が半年間、山ほどの注文から一度も取引を失っていないのなら、一度の注文も失われないと仮定する。

ロジックを壊さないようにしながら、少しずつマスターしているのですが、時々、一方が他方を邪魔することが判明して......。

アレクセイ、自分に素朴な疑問を持ってみてください。

各コマンドの後に履歴を調べるのと、1回だけ、あるいは全く 注文を再確認しないのと、どちらが良いでしょうか(OnTradeTransactionは トリガーされませんでした)。

バリデーションの実装は簡単ではありませんが(ちなみに私の例には間違いがあります)、大原則は「every order」には「magic」があることです。

そしてもうひとつ。私はすでに、誰もが自分の道を自由に歩むことができると言っているのですが......。

 
Mikalas:

アレクセイ、自分に簡単な質問をしてみてください。

各コマンドの後に履歴を掘り下げるのが良いのか、それとも一度か二度、注文(OnTradeTransactionが機能しなかった)を再確認するのが良いのか?

バリデーションの実装は簡単では ありませんが(ちなみに私の例には間違いがあります)、大原則は「every order」には「magic」があることです。

そしてもうひとつ。私はすでに、誰もが自分の道を自由に歩むことができると言っているのですが......。

マイケル この素朴な疑問に対する答えが、今回の議論のきっかけになったんです。そして今のところ手放すつもりはない。しかし、OrderSend()コマンドや保留中の注文が有効になった後、あるいはstop/stopを使用してポジションを閉じる 際に、取引損失が発生するのかどうかがまだ理解できていないのです。

最初の回答で、OrderSendAsync() でもトランザクションは失われない と理解しました。このような稀な取引をわざわざ確認する必要があるのかどうか、判断するために理解しようとしているのです。しかも、配分したものを考慮しながら。

純粋に論理的に 考えれば、OrderSend()が応答を得るまで終了しなければ、トランザクションが失われることはない。しかし、保留中の注文の発動とポジションの決済は、私のロジックには合いません。この場合の取引は、それぞれMT5内で発生したものであれば、失われることはありませんが、サーバーを経由した場合は...。どうだろう。(しかし、直感的には、サーバーから答えが送られてきて、OnTradeTransaction()が作動するのでしょう。

 

みんな、ここで問題だ。

ポジションを開くと、OnTradeTransaction は TRADE_TRANSACTION_DEAL_ADD のみを処理する...すべて順調です。

例えばSellStopが置かれた場合、TRADE_TRANSACTION_ORDER_ADDのみがトリガーされる...。また、すべてが正常である。

しかし、ポジションと保留注文を設定すると、TRADE_TRANSACTION_DEAL_ADDは動作し、 TRADE_TRANSACTION_ORDER_ADDは 2回 動作する。

どうしてこうなんだろう

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

みんな、ここで問題だ。

ポジションを開くと、OnTradeTransaction は TRADE_TRANSACTION_DEAL_ADD のみを処理する...すべて順調です。

例えばSellStopが置かれた場合、TRADE_TRANSACTION_ORDER_ADDのみがトリガーされる...。また、すべてが正常である。

しかし、ポジションと保留注文を設定すると、TRADE_TRANSACTION_DEAL_ADDは動作し、 TRADE_TRANSACTION_ORDER_ADDは 2回 動作する。

どうしてそうなのか

どこかで勘違いしているのでは?TRADE_TRANSACTION_ORDER_ADDとTRADE_TRANSACTION_DEAL_ADDの少なくとも2つのイベントが必要です。なぜTRADE_TRANSACTION_ORDER_ADDが出ないのかは不明です。

スイッチをコメントアウトして、OnTradeTransactionで受信したすべてのイベントの完全なログを印刷してみてください。

 
C-4:

どこかで勘違いしているのでしょう。いずれの場合も、TRADE_TRANSACTION_ORDER_ADDとTRADE_TRANSACTION_DEAL_ADDという2つのイベントが最低限必要です。なぜTRADE_TRANSACTION_ORDER_ADDが出ないのかは不明です。

スイッチをコメントアウトして、OnTradeTransactionで受信したすべてのイベントの完全なログを印刷してみてください。

はい、やってみました。switch(type)の前にPrint(EnumToString(type))が出力されましたが、私が説明したとおりの出力でした。

以下は、繰り返された実験です。




 

あなたのコードを自分でチェックしました。- すべて正常に動作します。

フォローのために逆指値注文 を出すことなく、オプション

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE(トレーディング・トランザクション・オーダー)。

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD。

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

ストップオーダーを送信するオプション。

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE(トレーディング・トランザクション・オーダー・アップデート

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD。

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE(トレーディング・トランザクション・オーダー)。

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD。


s.e.、フルサイクルにかかる時間は60-70msecと安定していて、嬉しい驚きでした。開発者の皆さん、お疲れ様でした。
 
C-4:

あなたのコードを自分でチェックしました。- すべて正常に動作します。

その後逆指値注文 を出すことなくバリアント。

逆指値注文を送信するオプション。

s.e.、フルサイクルにかかる時間は60-70msecと安定しており、嬉しい驚きでした。開発者の皆さん、お疲れ様でした。

どうやらこれはトランザクションの損失らしい・・・。と、まずは(ドキュメントより抜粋)。

また、これらのトランザクションが端末に到着する順番は保証されていない

Vasilyさん、これはテスターですか、それともデモですか?テスターのサンプルを持っています。テスターと口座でOnTradeTransactionの操作に違いがあるのでしょうかね。ときどきチェックさせていただきます。


ps; トランザクションを失った後、次の OnTradeTransaction の起動時に突然表示されることがわかりました。

 
AlexeyVik:

どうやらこれはトランザクションの損失らしい・・・。と、まずは(ドキュメントより抜粋)。

Vasilyさん、これはテスターですか、それともデモですか?テスターのサンプルがあります。テスターのOnTradeTransactionと口座のOnTradeTransactionに違いがあるのでしょうかね。ときどきチェックさせていただきます。


ps; 取引を失った後、次にOnTradeTransactionを有効にすると突然現れることが判明しました。

いいえ、トランザクションは失われませんが、特定の順序で来ないかもしれません。

TRADE_TRANSACTION_REQUESTだけが常に最初に来ます。そうでなければ、注文のためのチケットを得ることはできません。

ドキュメントをよく読んでください。