記事「取引トランザクション:リクエストとレスポンスの構造体、説明、ロギング」についてのディスカッション - ページ 8

 
MrBrooklin #:

では、このイベント・ハンドラーはどのようにして1取引日後のオープン・ポジションを見つけたのだろうか?

よろしく、ウラジミール。

奇跡は起こらない。あなたはロジックを作った。なぜかわかるはずだ.ハンドラがトリガーされたとき、ハンドラの何を探しましたか?どのように探したのですか?何がトリガーになったのか

ハンドラーシグナルというイベントがあります。その中で、あなたはこれらのイベントをフィルタリングする必要があります...

しかし、一般的に、私はこれらのハンドラに依存していませんでした。私は過去と現在の状態の違いを制御した。そしてそれに基づいて。私は何をすべきかについて決定を下した。

 
Artyom Trishkin #:
アレクセイが答えた。ブローカーによる。

これは発言ですか、それとも思い込みですか?他にすることがないから質問しているのではない。理解したいのです。

よろしく、ウラジミール。

 
Artyom Trishkin #:
奇跡はない

私の最初の電子工学の師匠も、(ソ連時代の)地域コンピュータ・サービスセンターで働いていたときに同じことを言っていた。私は彼にもあなたにも完全に同意する。ですから、この問題には論理的な説明が必要なのです。そして、実際の口座でエキスパート・アドバイザーを8ヶ月間取引して一度だけです。だからこそ、このような事態の可能性を排除するために、私はそれを解明しようとしているのです。

よろしく、ウラジミール。

 

このOnTradeTransaction()関数の変形を実際に使ってみて、Expert Advisorが常にオープンポジションを 見つけるようにします。オープンポジションの事実を「視界から外す」コードの部分を黄色で強調しました:

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,   // 貿易取引の構造
   const MqlTradeRequest&        request, // リクエスト構造
   const MqlTradeResult&         result   // レスポンス構造
)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN)
        {
         pos_ticket=trans.position;
         pos_open=trans.price;
        }
     }
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void Open_Add_Position()
  {
//--- 最後にオープンしたポジションのメジクとチケットを持つポジションが現在のシンボルで選択されている場合
   if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&
      PositionGetString(POSITION_SYMBOL)==_Symbol &&
      PositionGetInteger(POSITION_MAGIC)==Magic_Number)
     {
      ....... тогда выполняем определённые действия с целью открытия дополнительной позиции
     }
  }

テスターでは問題なく動作していますが、実際の取引でどのように動作するか見てみます。

ありがとう、ウラジミール。

 
MrBrooklin オープンポジションを 見つけるようにします。オープンポジションの事実が「見えなくなる」ことを除外すべきコードの部分を黄色で強調しました:

テスターでは問題なく動作していますが、実際の取引でどうなるか見てみます。

ありがとう、ウラジミール。

ウラジミール、これらの関数間に関連はありません。OpTradeTransaction()関数を削除しても、コードはまったく同じように動作します。

もしストラテジーが複数のポジションとハッジ口座をオープンするのであれば、コードのこの部分

if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&

が大きなダメージを与える可能性があります。

 
Alexey Viktorov #:

ウラジミール、これらの関数に関連性はありません。OpTradeTransaction()関数を削除すれば、コードはまったく同じように動作します。

ストラテジーが複数のポジションとハッジ口座の開設を提供している場合、コードのこの部分は次のようになります。

が大きなダメージを与える可能性があります。

アレクセイ、EAコードの改良を常に促し、助けてくれてありがとう。さて、本題です。はい、私はヘッジ口座を持っており、複数のポジションを建てることができます。OpTradeTransaction()とあなたが削除を提案しているコードの部分との 関連は直接的です。OpTradeTransaction()ポジションチケットとその始値を取得し、追加のポジションを建てるのに使用しています。これまではすべて完璧に機能していました。問題は、Expert Advisorがオープンポジションを一度も「見ない」ときに発生しました。以前は気がつかなかったので、問題は一度しか発生しないと思っていたのですが、ヒストリーを実行し、プリントアウトを詳しく見てみると、二度ではなく、一度以上発生していることに気がつきました。以前は気づかなかっただけで、今になって、ポジションがある取引セッションから別の取引セッションに移るときに問題が起こることがあることに気づいた。強調したい。なぜか?自分でもわからない。私のFXディーラーには取引セッション間のロールオーバーがある。そのせいかもしれないし、そうでないかもしれない。わからない。現在も同じような状況ですが、追加ポジションを建てるための条件が1つ足りません。新しいコードをテストして、それが害になるかどうかを確かめたい。なぜなら、これ以上悪くなることはないだろうし、特に私はすでに自分の手で悪い状況を「解決」することを学んでいるからだ。私は両方のロボットの動作を停止し、必要な価格でポジションを建てるだけです。

よろしく、ウラジミール。

 
MrBrooklin #:

アレクセイ、EAコードの改良を常に促し、助けてくれてありがとう。さて、本題です。はい、私はヘッジ口座を持っており、複数のポジションを建てることができます。OpTradeTransaction()とあなたが削除を提案しているコードの部分との 関係は直接的です。OpTradeTransaction()ポジション・チケットとその始値を取得し、追加のポジションを建てるのに使います。これまではすべて完璧に機能していました。問題は、Expert Advisorがオープンポジションを一度も「見ない」ときに発生しました。以前は気づかなかったので、問題は一度しか発生しないと思っていたのですが、ヒストリーを実行し、プリントアウトを詳しく見てみると、二度ではなく、一度以上発生していることに気づきました。以前は気づかなかっただけで、今は、ポジションがある取引セッションから別の取引セッションに移るときに問題が発生することがあることに気づいた。強調したい。なぜか?自分でもわからない。私のFXディーラーには取引セッション間のロールオーバーがある。そのせいかもしれないし、そうでないかもしれない。わからない。現在も同じような状況ですが、追加ポジションを建てるための条件が1つ足りません。新しいコードをテストして、それが害になるかどうかを確かめたい。なぜなら、これ以上悪くなることはないだろうし、特に私はすでに自分の手で悪い状況を「解決」することを学んでいるからだ。私はただ両方のロボットの作業を止め、手で必要な価格でポジションを建てるだけだ。

よろしく、ウラジミール。

問題は、PositionSelect(_Symbol)が必ずしも最後のポジションを選択しないことです。したがって、OnTradeTransaction()でポジションチケットを受け取っていない場合、間違ったデータに基づいて決定を下す危険性があります。

 
Alexey Viktorov #:

問題は、PositionSelect(_Symbol) が必ずしも最後のポジションを選択するとは限らないことです。したがって、OnTradeTransaction() でポジションチケットを取得しないと、間違ったデータに基づいて判断するリスクがあります。

ヒントをありがとう。少し考えてみて、実際の取引でどのような支障が出るか見てみます。OnTradeTransaction()関数を放棄するという考えにはまだ賛成できません。問題を徹底的に理解してから、 最終的な決断を下す必要があります。

それでは、ウラジミール。

 
MrBrooklin #:

ヒントをありがとう。少し考えてみて、実際の取引でどのような支障が出るか見てみます。OnTradeTransaction()関数を放棄することにはまだ同意できません。問題を徹底的に理解してから、 最終的な決断を下す必要があります。

それでは、ウラジミール。

拒否しろとは言っていない。しかし、このような使い方をするメリットはゼロだ。

 
Alexey Viktorov #:
OpTradeTransaction() 関数を削除しても、コードはまったく同じように動作します。

私の理解では、関数の削除はその関数の使用を拒否するようなものです。誰がどのように言おうと、重要なのはそれを理解することです。: )

よろしく、ウラジミール。