オープントレードのチェックに問題がある - ページ 2

 
dazamate:


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, このコードはとてもシンプルに見えますが、私の頭の中ではどう動いているのか理解できません。もし、time0がtime[0]と等しくなるたびにif文は常に真になりませんか?このような仕組みが理解できないのです。

1回目のティック。Time0が Time[0 ]に等しくないのでreturnは実行されず、 Time0は Time[0](現在のバーの開始時間)に設定され、残りのstart関数が 実行されます。

2回目以降のティック:Time 0がまだ現在のバーの開始時間と等しければ、まだ同じバー上にいることになり、returnが実行されてスタート関数が終了します。Time0が 現在のバーの開始時間と等しくない場合、新しいバーにいることになり、returnは実行されず、 Time0は Time[0](新しい現在のバーの開始時間)にセットされ、スタート関数の残りの部分が実行されます。

 
dazamate:

もし、保留中の注文が配置され、それがxの量のバーでトリガーされない場合、それはキャンセルされるようにカウンターを作るためにどのように行くのでしょう?私が思いつくのは、新しいバーが形成されるたびにカウントするカウンターを置き、カウントされたバーの量=保留中の注文がキャンセルされる前に指定された許容バーである場合です。バーカウンターは、新しい保留中の注文が開かれるたびにリセットされるのですか?どうなんでしょう?

保留中の注文 をチェックする関数を作って、それぞれの注文がいつ開かれたかを見て、どのくらい時間が経ったかをチェックし、制限時間より長ければ、注文を閉じます。

 
dazamate:

1時間足でユーロドル、ユーロドル、ポンドドル、ポンドポンド円をスキャンする関数を作りたいのです。それは最後の06:00 gmtローソク足まで戻ってオープンを記録し、さらに24バー前の06:00 gmtローソク足まで戻ってそのオープンを記録し、各ペアの6gmt -6gmtレンジを記録するものである。そして、すべてのペアの6gmt - 6gmtレンジを比較し、最も高いものを返します。1枚のタイムチャートに張り付いているだけでこのようなことができるのでしょうか?

このような問題では、コードを考える前に、まず解決策を考えなければなりません。 フローチャートを作ったり、擬似的なコードを書いたりしてください。フローチャートを作ったり、擬似的なコードを書いたりして、納得のいく解決策を考えてから、コードを見てください。

最後の質問に答えると、はい、それは可能です。例えば、EAがあるペアと異なるペアから特定のローソクのオープン値を取得するために、私はそれを使うでしょう ....

iOpen( string symbol, int timeframe, int shift)

一旦、4つのペアの怒りのためのあなたの値を持っているあなたは簡単にこのようなものを使用して最大のものを決定することができます。

  MathMax( double value4, (MathMax( double value3, (MathMax( double value1, double value2))))) ;

また、値を配列にして、ArraySortを使うこともできます。

EDIT: いくつかの方法は、Strategy Testerでは 正しく動作しないことを念頭においてください。

 
extern int     iOpenHour                = 6;

int start()
  {
  
int b, scannedhour;
datetime bartime;
double dibsclose, dibsopen, prevdayrange;

for(b=0; b<=24; b++)                                   // scans the last 24 bars 
   {
      bartime = iTime("EURUSD", 60, b);                // checks the open time of each bar
      scannedhour = TimeHour(bartime);                 // extracts the hour of that bar
    
      if ( scannedhour == iOpenHour )                  // Check to see if scanned hour = Dibs hour
         {
            dibsclose    = iOpen("EURUSD", 60, b);     // Get the open value of that bar (Close of 6gmt day) 
            dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange = (dibsclose-dibsopen);       // Calculate the range of the Dibs day
         }                                             // End of if statement
    }                                                  // End of for statement


Comment("Prev Dibs day range is...",prevdayrange, "dibsclose  =  ", dibsclose, "dibsopen  =  ",dibsopen, "Scannedhour=",scannedhour);      


   return(0);
  }

さて、これは私自身の試みで、1時間足のチャートをスキャンして、最後の06:00のバーを見つけ、そのオープンを記録し、さらに24本戻ってそのバーのオープン(06:00の日の始まり)を記録し、それら2つの選択されたバーからオープンとオープンの範囲を得るコードを書こうとするものである。

びっくりするほど、うまくいきません。笑 ------> http://myfacewhen.com/307/

私はf*'dアップしている何を教えてください。または私はちょうどこの間違った方法について得たのですか?私は hehe を試みた

 

1つの問題を発見した ... . 24 hours before b is b+24 ... bars count up from current bar ( 0 ) to the left.

dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

change to:

dibsopen     = iOpen("EURUSD", 60, b+24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

よくぞコメントを入れてくれました、非常に良い練習になりました ... :-)

 
RaptorUK:

1つの問題を発見した ... . 24 hours before b is b+24 ... bars count up from current bar ( 0 ) to the left.

よくぞコメントを入れてくれました、非常に良い練習になりました ... :-)


わー、よく見つけた!これを理解するのにしばらくかかりそうだ(笑)。私はその愚かなミスをすべて正しく理解したことを信じることができません。今、私はどこかに到達しているような気がします。そう、私がやっていることを追跡するのを助けるために、そして私がやろうとしていることを皆さんに見てもらうのを超簡単にするために、コメントを追加したのです。今、私は4つのペアを比較するためにそれを取得し、最高値と1つを吐き出すつもりですIllは私がそれで行く方法を知ってみましょう。ありがとうRaptorUK
 
いいものを、よくやった。 どういたしまして :-)
 
extern int     iOpenHour                = 6;

int start()
  {
                                                            //  Array Categorys ( 1  EURUSD, 2 GBPUSD, 3 USDCHF, 4 USDJPY )
int b[4], scannedhour[4];
datetime bartime[4];
double dibsclose[4], dibsopen[4], prevdayrange[4];

//----------------------------------------------------------------------------------------------
//        EURUSD PREV DAY RANGE CALC

for(b[1]=0; b[1]<=24; b[1]++)                               // scans the last 24 bars on eurusd
   {
      bartime[1] = iTime("EURUSD", 60, b[1]);               // checks the open time of each bar
      scannedhour[1] = TimeHour(bartime[1]);                // extracts the hour of that bar
    
      if ( scannedhour[1] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[1]    = iOpen("EURUSD", 60, b[1]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[1]     = iOpen("EURUSD", 60, b[1]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[1] = (dibsclose[1]-dibsopen[1]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement
    

//----------------------------------------------------------------------------------------------
//        GBPUSD PREV DAY RANGE CALC

for(b[2]=0; b[2]<=24; b[2]++)                               // scans the last 24 bars on eurusd
   {
      bartime[2] = iTime("GBPUSD", 60, b[2]);               // checks the open time of each bar
      scannedhour[2] = TimeHour(bartime[2]);                // extracts the hour of that bar
    
      if ( scannedhour[2] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[2]    = iOpen("GBPUSD", 60, b[2]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[2]     = iOpen("GBPUSD", 60, b[2]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[2] = (dibsclose[2]-dibsopen[2]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement



//----------------------------------------------------------------------------------------------
//        USDCHF PREV DAY RANGE CALC

for(b[3]=0; b[3]<=24; b[3]++)                               // scans the last 24 bars on eurusd
   {
      bartime[3] = iTime("EURUSD", 60, b[3]);               // checks the open time of each bar
      scannedhour[3] = TimeHour(bartime[3]);                // extracts the hour of that bar
    
      if ( scannedhour[3] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[3]    = iOpen("USDCHF", 60, b[3]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[3]     = iOpen("USDCHF", 60, b[3]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[3] = (dibsclose[3]-dibsopen[3]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement


//----------------------------------------------------------------------------------------------
//        USDJPY PREV DAY RANGE CALC

for(b[4]=0; b[4]<=24; b[4]++)                               // scans the last 24 bars on eurusd
   {
      bartime[4] = iTime("USDJPY", 60, b[4]);               // checks the open time of each bar
      scannedhour[4] = TimeHour(bartime[4]);                // extracts the hour of that bar
    
      if ( scannedhour[4] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[4]    = iOpen("USDJPY", 60, b[4]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[4]     = iOpen("USDJPY", 60, b[4]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[4] = (dibsclose[4]-dibsopen[4]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement




//----------------------------------------------------------------------------------------------



Comment("DIBS RANGE EURUSD:...", prevdayrange[1],        //Display Ranges of each pair
        "DIBS RANGE GBPUSD:...", prevdayrange[2],
        "DIBS RANGE USDCHF:...", prevdayrange[3],
        "DIBS RANGE USDJPY:...", prevdayrange[4]);      


   return(0);
  }
そこで、すべての変数を配列に変換し、それぞれのチェックを 実行しました。しかし、それがうまくいかなくなりました。このように複数のforループを持つことはできないのでしょうか?
 
dazamate:
そこで、すべての変数を配列に変換し、それぞれのチェックを実行しました。しかし、それがうまくいかなくなりました。このように複数のforループを持つことはできないのでしょうか?
しかし、forループのインデックスに配列は使わないでください。bはforループのたびに0にリセットされるので、再利用しても問題ありません。実際に配列を使用する必要があるのはなぜですか?
 
RaptorUK:
しかし、forループのインデックスに配列は使わないでください。この配列はforループのたびに0にリセットされるので、再利用しても問題はありません。
ああ、はい、あなたが言っていることがわかりました、私はそれを修正し、私が行く方法を参照してください。このEAが私を金持ちにしてくれるなら、いくらかお金をお返ししますよ(笑)