EAでBarsを逆引きして分析する - ページ 3

 
paranoyakX:

アドバイスありがとうございます。これは私のコードの非常にシンプルなバージョンです。

このスレッドを開いた理由はDetectExistingPattern()関数 です。

OnTick() の最初の実行でコードを実行する方法については、すでにサンプルコードをお渡ししましたので、OnInit() の中ではなく、OnTick() の最初の呼び出しでDetectExistingPattern() を実行するように、それに応じてあなたのコード投稿を更新してください。

また、"Bars "を使用して新しいバーを検出することはできません。これは不正解です。Time[0]」または「SeriesInfoInteger( _Symbol, _Period,SERIES_LASTBAR_DATE)」のどちらかを使用する必要があります。以下はその例です。

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

OnTick() の最初の実行でコードを実行する方法については、すでにサンプルコードをお渡ししましたので、それに従ってコード投稿を更新し、OnInit() 内ではなくOnTick() の最初の呼び出しでDetectExistingPattern() が実行されるようにしてください。

また、"Bars "を使用して新しいバーを検出することはできません。これは不正解です。Time[0]」または「SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )」のどちらかを使用する必要があります。以下はその例です。

FMICさん、ありがとうございます。ちなみに、Barsの 使い方は、私の記憶では、みんながそう書いていたので、私もそうしていました。なぜいけないのでしょうか?また、動作がおかしいのでしょうか?

ps:メタトレーダー4を使っているので、mql4でいいんですよね?

 
paranoyakX:

ありがとうございます!@FMICさん、@jjcさんに頼まれたので簡単なコードを追加しました。ちなみに、Barsの使い方は、私の記憶では、みんながそう書いていたので、私もそうしていました。なぜいけないのでしょうか?また、動作がおかしいのでしょうか?

ps:メタトレーダー4を使っているので、mql4でいいんですよね?

いいえ、そうではありません。フォーラムでは、多くのユーザーが、"Bars "メソッドは非常に古く信頼性が低い ことを示していることがわかります。ですから、これを使うのは間違っています。Time[0]」を使うか、MQL5とも互換性を持たせたいなら「SeriesInfoInteger( _Symbol, _Period,SERIES_LASTBAR_DATE)」を使いましょう。私の例をご覧ください。
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

wow、私はあなたのコードを使用することを知りませんでしたありがとうございました。
 
Bars is unreliable (a refresh/reconnect can change the number of bars on the chart) volume is unreliable (miss ticks) Always use time.Bars is unreliable (a refresh/reconnect can change bar on the chart).新しいキャンドル - MQL4フォーラム
 
paranoyakX:

このスレッドを開いた理由はDetectExistingPattern()関数 です。

最初の質問に戻って...この例では、CheckTrendPattern()関数を変更して、特定のバーから開始するようにするのが一つの方法でしょう。1 から 10 までの固定の範囲を使用する代わりに、指定された開始点から 1 から 10 までのオフセットを使用します。

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

既存の注文がなく、現在パターンが満たされているかどうかをチェックしたい場合は、CheckTrendPattern() の代わりに CheckTrendPattern(0) を使用します。

起動時に、もし既存の注文があれば、以下のように、その注文のトリガーとなったパターンを探すことができます。これは、私が最初に提案したのと同じで、既存の注文のオープン 時間に相当するバーインデックスを取得し、そこから逆算して探すのです。

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
CheckTrendPattern(BarShiftOfOrderOpen);

しかし、FMICが言うように、このチェックはOnInit()ではなく、OnTick()の最初の呼び出しで行うことが望ましいです。私がこれを提案する理由は、「初期化を中断する」こととは全く関係がありません。むしろ、EAがすでにチャートにアタッチされている状態でMT4が再スタートするとき、ブローカーからの注文リストや更新されたバー履歴をまだ100%確実に持っていないことを懸念しているのです。

もう一つの考慮すべき点は、次のようなシナリオで、すべて1本のバーでカバーされる時間内に発生します。

  • パターンを見つけ、取引を行う
  • 未決済の取引が、ストップロスに当たるなどの理由で決済される。
  • MT4が(意図的かどうかにかかわらず)終了する。
  • MT4が再スタート
  • EAが現在のパターンを再検索し、未決済取引がないため、同じバーで別の取引を行う

これを防ぐために、オープンオーダーだけでなくクローズドオーダーもチェックするとよいでしょう。

 
あなたの経験を共有していただきありがとうございます。
jjc:

最初の質問に戻りますが...この例では、CheckTrendPattern()関数を変更して、特定のバーから開始するように指示することが1つの選択肢となります。1 から 10 までの固定の範囲を使用する代わりに、指定された開始点から 1 から 10 までのオフセットを使用します。

既存の注文がなく、現在パターンが満たされているかどうかをチェックしたい場合は、CheckTrendPattern() の代わりに CheckTrendPattern(0) を使用します。

私の本当のパターンはこれではなく、固定された数字(例えば10)ではなく、動的なものなのですが、私のパターンチェック方法は異なっているので、それを思い出すことができず、これは本当に困りました。そのため、パターンを検索する際にこのコードを使うことができません。この場合、同じバーを何度もチェックすることになるので、後方にパターンを検索したくはなかったのです。パフォーマンスの問題を心配していたのですが、問題なさそうなので、おっしゃる通り、起動時と実行時の両方で使えるように、パターン検索方法を変更しようと思います。これにより、パターンを変更した場合、再検索の手順を変更しなければならず、忘れることができるといった問題を防ぐこともできます。また、@FMICさんがおっしゃるように、この部分はインジケータにした方がいいかもしれません(あまり書いてませんが)そうすれば、検索して再検索するのも問題ないでしょう。
jjc

起動時に、もし既存の注文があれば、以下のように、その注文のトリガーとなったパターンを探すことができます。これは私が最初にした提案と同じで、既存の注文のオープン時間に相当するバーインデックスを取得し、そこから逆算して探し始めます。 しかし、FMICが言うように、このチェックはOnInit()ではなく、最初のOnTick()の呼び出しで行うことが望ましいのです。私がこれを提案する理由は、「初期化を中断する」こととは全く関係がありません。むしろ、EAがすでにチャートにアタッチされている状態でMT4が再スタートするとき、ブローカーからの注文リストや更新されたバー履歴をまだ100%確実に持っていないことを懸念しているのです。

もう一つの考慮すべき点は、次のようなシナリオで、すべて1本のバーでカバーされる時間内に発生します。

  • パターンを見つけ、取引を行う
  • 未決済の取引が、ストップロスに当たるなどの理由で決済される。
  • MT4が(意図的かどうかにかかわらず)終了する。
  • MT4が再スタート
  • EAが現在のパターンを再検索し、未決済取引がないため、同じバーで別の取引を行います。

この部分は本当に重要で、私は冗長な注文を出す可能性があります。この部分は本当に重要で、冗長な注文を出す可能性があります。

WHRoederさんの新しいバーチェック・コントロールはとてもシンプルで美しいです。私は私のコードにあなたのメソッドを追加しました、ありがとうございます。

 

皆さん、こんにちは。

FMICがアドバイスしてくれたように、私は自分のパターンを見つけてシグナルを出し、さらにいくつかのデータを私の注文に使用するインジケータを書きました(私は異なる価格で複数の注文を出すかもしれません)。今、私は自分のEAでそれを使用したいのですが、私は質問があります、私は実際にあなたの経験を必要としています。このインディケータからシグナルを得たとき、注文を出したり(売り指値、買い指値など)、mt4が何らかの理由でクラッシュした場合、その出した注文がこのインディケータのどのシグナルのものかをどうやって見つけることができますか? その際、バーシフトを使って良いですか?以前話したように、注文作成時刻を見つけて、そのバーシフトを見つけて、このシフトを使ってインディケータ値を取得しようとすれば良いですか?この注文とインジケーターのシフトは どのように一致させればいいのでしょうか?

ありがとうございます。

 
paranoyakX: こんにちは、@FMICがアドバイスしてくれたように、私は自分のパターンを見つけて、シグナルと私の注文に使用するいくつかのデータを与えるインジケータを書きました(私は異なる価格で複数の注文を開くかもしれない)。今、私は自分のEAでそれを使用したいのですが、私は質問があります、私は実際にあなたの経験を必要としています。このインディケータからシグナルを得たとき、注文を出したり(売り指値、買い指値など)、mt4が何らかの理由でクラッシュした場合、その出した注文がこのインディケータのどのシグナルのものかをどうやって見つけることができますか? その際、バーシフトを使って良いですか?以前話したように、注文作成時間を見つけ、そのバーシフトを見つけて、このシフトを使ってインディケータ値を取得しようとすれば良いですか?この注文とインジケーターのシフトはどのように一致させればよいですか?
はい、あなたはiBarShift() を使用することができます、ちょうどjjcが 以前の記事であなたに説明したように、その後iCustom() 関数を通じてあなたの指標のデータを参照してください。
 
FMIC:
はい、iBarShift() を使用することができます。ちょうどjjcが 以前の投稿であなたに説明したように、その後iCustom() 関数経由であなたのインジケータのデータを参照します。
FMICさん、ありがとうございます。私のパターンをインジケータにするというのは、本当に良いアドバイスでした。もちろん、私のコード全体を変更することになりますが、より一貫性のあるものになると思います。