オープンポジションをグループ分けする - ページ 9

 
Sergey Voytsekhovsky:

私の理解が正しければ、これは正しい方法だと思います。より経験豊富な同志として、そのようなフィルタが動作します新生児位置をキャッチする目的のために、アドバイスしてください?それとも、もっといい方法があるのでしょうか?

これはAlexeyのためのものです。私は何らかの理由でOnTradeTransaction() を使って仕事をすることはありません。

 
Alexey Viktorov:

そのため、他の投稿を後回しにしろということでしょうか?言及されないようにする?それはおかしい。

私見では、フォーラムの別のセクションを定義し、そこで各問題を別のトピックにする方が良いと思います。トピック数は、1トピックあたりの投稿数よりはるかに少ないです。そのため、かなりの数のトピックがあるにもかかわらず、現在、個々の問題やバグレポートが プッシュバックされているほどには、プッシュバックされないのです。

さて、知らないことを赤で強調しましたね。何が問題だったのでしょうか?それはどのように現れたのでしょうか?そして、新方式とは?

バグの報告について:「正しいか正しくないか」ですが、報告したい人は報告します。そして、嫌なら嫌でいいんです。 そして、「自分のことを語らせる」みたいに自分を封印するのは、言い訳にしかならない。

 
Sergey Voytsekhovsky:

私の理解が正しければ、これは正しい方法だと思います。より経験豊富な同志として、そのようなフィルタが動作します新生児位置をキャッチする目的のために、アドバイスしてください?それとも、もっと正しい選択肢があるのでしょうか?

私見ですが、このセリフは

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

は不要です。そして、一般的に、私は現在、以下のバリアントのためにOnTradeTransactionの 操作を再考しています。

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

案件を追加した時点では、その案件を発生させた注文のチケットがない。しかし、私は今、スリッページのためにグリッドステップを無効にしないために注文の開始価格を必要とするように、我々は注文とそのプロパティのチケットが必要な場合は、それが最良のバリエーションです。

一般的に、私は特定のタスクのために書くことの支持者です。一方、SBは普遍性が高く、時には絶対に不要な変数を追加する必要があります。

 
Artyom Trishkin:

さて、知らないことを赤で強調しましたね。何が問題だったのでしょうか?それはどのように現れていたのでしょうか?そして、その新しい方法とは何だったのか。

そして、エラーメッセージについて:「正しいか正しくないか」ですが、報告したい人は報告します。そして、嫌なら嫌でいいんです。そして、「自分のことを人に話させる」ように自分を閉ざしてしまうのは、言い訳です。

古いディスクのどこかに、古い端子が残っているんです。もし見つかったら、旧図書館と新図書館をお見せしますよ。そうすれば、実質的な会話ができるようになります。そうでなければ、そうでないと記憶しているので、何を話すことがあるのか?今そこにないものをどう説明するか、どう見せるか。
 
Alexey Viktorov:

私見ですが、このセリフは

は不要です。一般的に、私は現在、以下のバリアントのOnTradeTransaction オペレーションを再考しています。

取引を追加した時点では、その取引を発生させた注文のチケットがありません。しかし、注文のチケットとそのプロパティが必要な場合、私は今、注文の開始価格が必要であり、グリッドステップがスリッページのためにノックダウンされないように、これは最良の選択肢である。

一般的に、私は特定のタスクのために開発することを支持します。そして、UBは普遍性を詰め込み、さらに、時には絶対に不要な変数を要求しています。

正しい方向を示してくれて非常に感謝している。この方法でやりました(以下、うまくいくようです)。

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

今、Take Profitや直接注文で決済したポジションのティッカーをどのようにキャッチするかで頭を悩ませています。これらのポジションをメインのポジション配列から削除するために、それらのティックだけが必要です。

 
Sergey Voytsekhovsky:

正しい方向に導いてくれたことに非常に感謝している。そうしました(以下、動作するようです)。

現在、takeprofitや直接注文で決済したポジションのティックをどのようにキャッチするかで頭を悩ませています。これらのポジションをメインのポジション配列から削除するために必要なのは、それらのティックだけです。

シンボルとマジックのチェックを追加します。

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

以下は、ポジションクローズを 検出するコードの一部です。

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

ENUM_DEAL_REASON 列挙から閉鎖の理由で分けることもできます。

別のExpert Advisorで

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

前者の場合は注文が必要ですが、後者の場合は取引で十分です。一般的に、何か必要なものがあると、それを書くことになります。

 
Alexey Viktorov:

シンボルとマジックのチェックも追加します

以下は、ポジションクローズを 検出するコードの一部です。

ENUM_DEAL_REASON 列挙から閉鎖の理由で分けることもできます。

ここで別のExpert Advisorで

前者の場合はオーダーが必要で、後者の場合はトレードで十分です。一般的には、必要な時に書きます。

こんばんは。あなたの対応と配慮は、私にとって大変光栄なことです。ありがとうございます。

賢明なアドバイスをありがとうございました。一つは、彼らは現時点ではあまり必要とされていない、私のExpert Advisorは、それが高い周波数、小さなポジションの多くのため、競合他社を持っていない、おそらくないだろう。自分一人では息が詰まる、他にどこで人と競えるのか?もちろん、そうなれば端末にもアカウントにも1つずつ入っていることになる。2つ目は、まだよく分かっていないだけで、遠回しかもしれませんが、もしかしたら少しはリソースを節約できるかもしれません。

あなたの例は良いものです、必ず保存します、しかし、私にはチケットも順番も取引もありません。正確には、何百本もあって、今どれが閉まるかわからないということです。ポジションを閉じるという事実が計算から外れる可能性があると示唆され、今それを実行しようとしています。

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

私のExpert Advisorはポジションジェネレーターであり、積極的にポジションをオープンし、同時にクローズする方法を知っています。この位置(ポジションチケット)を配列・構造体から探し出し、削除するだけです。つまり、こういうことです。

そして、タイプライターとして、リファレンスからサンプルコードを使用してみますと、この関数についてのセクションで、そこに呼び出されています。

//|OnTradeTransaction_Sample.mq5|(エムキューブ
//| Copyright 2018, MetaQuotes Software Corp.
//|httpsを使用しています。//wwwmql5.com|コメント||電子書籍ストア「BookLive!
//+------------------------------------------------------------------+
#property copyright"Copyright 2018, MetaQuotes Software Corp."
#プロパティリンク"https://www.mql5.com"
#property version"1.00"
#property description"TradeTransactionイベントリスナーの例"

 
Sergey Voytsekhovsky:

こんばんは。あなたの対応と配慮に敬意を表します。若い人たちが言うように、賞賛と敬意を表します。

賢明なアドバイスをありがとうございました。私はMagikとシンボルをほぼ意識的にオンにしません、まず、彼らは今非常に必要とされていないので、私のExpert Advisorは、それが高い周波数、最小位置の膨大な数を持っているので、任意の競合他社を持っていない、おそらくないだろう。自分一人では息が詰まる、他にどこで人と競えるのか?もちろん、そうなれば端末も口座もそれ一本となる。2つ目は、まだよく分かっていないだけで、遠回しかもしれませんが、もしかしたら少しはリソースを節約できるかもしれません。

あなたの例は良いものです、必ず保存します、しかし、私にはチケットも順番も取引も ありません。正確には、何百本もあって、今どれが閉まるかわからないということです。ポジションを閉じるという事実が計算から抜かれる可能性があると示唆されたので、これからやってみようと思います。

私のExpert Advisorはポジションジェネレーターであり、積極的にポジションをオープンし、同時にクローズする方法を知っています。この位置(ポジションチケット)を配列・構造体から探し出し、削除するだけです。つまり、こういうことです。

そして、タイプライターとして、リファレンスのサンプルコードを使ってみますと、この関数についてのセクションで、そこに呼び出されています。

このようなヒントをもとに、ドキュメントから自分で何かを考えようとしている人と、私の小さな知識を共有することは、いつでもうれしいものです。© I.A. Krylov.カッコーがカッコーに褒められたことでコックを褒める。)))

自分のためだけにEAを書くのであれば、もちろん多少の自由はききます。シンボルとマジックを確認する必要がないと思うのであれば、確認する必要はありません。

ハイライトについて

ポジションチケット、オーダーチケット、トランザクションチケット、全部あります。また、取引や/または注文のオープニングポジションを引くことも難しくありません。全てはMqlTradeTransactionの 構造体の中にある


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Alexey、それはすべてOnTradeTransaction イベントの処理にのみ関連しています。

イベントが発生し、ポジションを閉じる取引が実行されました。この瞬間、すでにポジションはなくなっている。これは、注文と案件のリスト(コードには存在しない)を選択 し、読み取ることで確認できます。

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
そして、私たちは、ポジションが通常2つの注文と2つの取引しかないハッジ口座について話していることに注意してください。