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

 
FMIC:

EAにはOnStart() はありませんが、おっしゃることはわかります。しかし、OPはあなたのコメントに対しても、次のように言っています。

そうです、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。EAが実行されている間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味するとは限りませんし、最も妥当と思われます。

paranoyakXさんからの詳しい情報が必要です。

 
jjc:

はい、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。必ずしも「EAがOnTick()を実行している間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味しているのが最も妥当なところでしょう。

paranoyakX さんからもっと情報が必要です。

こんにちは、皆さん。

これを明確にさせてください。私のコードは、前のバーで非常に基本的なパターンを探して、注文を開くかどうかを決定しますが、新しいバーが来たときにのみ新しい注文を開くことを確認 します。つまり、私は最後のバーの終値を待って、パターンをチェックし、それが問題なければ注文を開きます。

EAを再実行する場合、これらの基本情報(パターンの開始と終了バー、最高値と最安値など)を再び見つけ、グローバル変数に再び入力したいのですが、そのためにこれが必要です。私は、開始と終了の情報を使って、いつ注文を閉じるかを決定します。したがって、EAの実行中にOnInitで新しいバーが表示されなくても、それは十分な問題ではありません。

 
jjc:

はい、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。必ずしも「EAがOnTick()を実行している間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味しているのが最も妥当なところでしょう。

paranoyakXさんからの詳しい情報が必要です。

はい!おっしゃる通りです。OPからの最新の情報では、彼は間違いなくOnTick() 上ではなく、OnInit() 上ですべてを実行しているようです。私は、OPがもう少し正しくやっていると、間違って思い込んでいました。彼のロジックがすべてOnInit() の中にあるとは思いもよりませんでした。
 
paranoyakX:

こんにちは。

これを明確にさせてください。私のコードは、前のバーの非常に基本的なパターンを探して、注文を開くかどうかを決定しますが、新しい注文を開くことは、新しいバーが出てきたときにのみチェックされます。つまり、私は最後のバーの終値を待って、パターンをチェックし、それがOKなら、注文を開くことになります。

EAを再実行する場合、これらの基本情報(パターンの開始と終了バー、最高値と最安値など)を再び見つけ、グローバル変数に再び入力したいのですが、そのためにこれが必要です。私は、開始と終了の情報を使って、いつ注文を閉じるかを決定します。したがって、EAの実行中にOnInitで新しいバーが表示されなくても、それは十分な問題ではありません。

OnInit() の中ですべてを行うべきではありません。OnTick()の中で全てのロジック(リカバリーを含む)を行うべきでしょう。これは重要 です。OnInit()の中で行うと、予想外の問題が発生し、EAを「初期化」状態にしたまま、そのロジックをすべて行ってしまうことになります。だから、正しくやってください。初期化(変数、外部パラメータチェックなど)だけをOnInit() で行い、それ以外はOnTick() で行ってください。
 
FMIC:
OnInit() の中でそのすべてを行うべきではありません。OnTick()の中で全てのロジック(リカバリーを含む)を行う必要があります。これは重要です。OnInit()の中でやると、予想外の問題が発生し、EAを「初期化」状態にしたまま、そのロジックをすべて実行することになります。だから、正しくやってください。初期化(変数、外部パラメータチェックなど)だけをOnInit() で行い、それ以外はOnTick() で行ってください。

いえいえ、そんなことはありません。私はOnTickですべてを実行しているのですが、単純にこのティックが新しいバーに属しているかどうかをチェック し、私のスタッフを実行しているのです。OnInitで実行しているのは、注文を再検索し、前に計算したパターンを再計算することです。これはOnInitで実行され、現在開いている注文が属するパターンを見つけると言ったのです。

説明できるといいのですが。

 
paranoyakX:

いえいえ、そんなことはありません。私はOnTickですべてを実行しているのですが、単純にこのティックが新しいバーに属しているかどうかをチェックし、私のスタッフを行っているのです。OnInitで実行しているのは、注文を再検索し、前に計算したパターンを再計算することです。これはOnInitで実行され、現在開いている注文が属するパターンを見つけると言ったのです。

説明できるといいのですが。

はい、私はあなたの投稿でそれを理解しました私が言いたいのは、OnInit()の中でそれをやってはいけないということです。注文やパターン、その他すべての計算はOnTick()の中で行うべきです。

OnTick()の中でローカルな静的変数を定義して、すべてのチェックと パターン定義を行い、その変数をfalseにセットしてください。

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

はい、あなたの投稿でそれを理解しました私が言いたいのは、OnInit()の中でそれをしないでください、ということです。注文やパターン、その他すべての計算はOnTick()の中で行うべきものです。

OnTick()の中でローカルな静的変数を定義して、すべてのチェックとパターン定義を行い、そしてその変数をfalseにセットすればいいのです。

すいません、さっきは誤解してました。なぜOnInitでやらないのか?その方が便利じゃないですか?そうすると、最初のティック 以降、ティック ごとに、trueにならないif文を実行することになるのです。これは、コードに不必要な負荷をかけることになると思います。

OnInitが存在する理由は、私のグローバル変数のようなものを初期化するためではないですか?

 
paranoyakX:

説明できるといいのですが。

あなたが言っていることを確信するためには、いくつかのコードを見る必要があると思います。例えば、既存のオープントレードを生成したヒストリカルパターンを探しているのは、(a) オープントレードの管理方法、どこで/いつクローズするかなどを教えてくれるからなのか、それとも (b) なぜ既存のトレードが開かれたかを説明するマーカーをチャートに描くためだけなのかが明らかではありません。

私は一般的に、OnTick()でできる限りのことを行い、グローバル変数にはできるだけ状態を保持しないようにすべきだというFMICに同意します。

 
paranoyakX:

申し訳ありません、私は以前あなたを誤解していました。なぜOnInitしないのでしょうか?その方が便利じゃないですか?そうすると、最初のティック以降、ティックのたびに、真にならないif文を実行することになります。これは、コードに不必要な負荷をかけることになると思います。

OnInitが存在する理由は、私のグローバル変数のようなものを初期化するためではないですか?

OnInit()の 中でそれを行うのは正しくありません。初期化の実行が滞ってしまいますし、スタティック変数はその状態を維持するので、OnTick()の たびにチェック するのではなく、「一度」だけチェック することになります。if( FirstOnTick )" は非常に速く、OnTick() で実行されている他のすべてのコードと比較すると、特に負荷が小さいです。
 

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

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

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


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



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};