どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 979

 
Vadim_2015:

親愛なる友人たちへ、私が何を目指しているのか、できる限り説明しよう...。...あるいは、正しく理解するか......あるいは、みんなを混乱させるかだ!

...

話を続けよう...。私が理解したところでは、タスクは次のように集約されます。簡略化のため、上半期である昨日のみ調査する。

まず、昨日のチャートの左側から見て、終値が始値より高い、つまり最初の強気なローソク足を探します。もしこれが見つかったら、そこから(それを含めて)現在の日の最新のローソク足まで、最も高いHighを持つローソク足を見つける必要があります。例えば、最初の強気ローソクの開始 時間が10:00であれば、そこから23:00のローソクまで、我々は最高のHighを持つローソクを探す必要があります。そうだろ?

 
paladin80:

話を続けて...私の理解では、この課題は次のように還元されます。簡略化のため、昨日の日、H1期のみの検証を行う。

まず、昨日のチャートの左側から見て、最も古いローソク足の終値が始値より高いもの、つまり最初の強気なローソク足を探します。もしこれが見つかったら、そこから(それを含めて)現在の日の最新のローソク足まで、最も高いHighを持つローソク足を見つける必要があります。例えば、最初の強気ローソクの開始時間が10:00であれば、そこから23:00のローソクまで、我々は最高のHighを持つローソクを探す必要があります。そうだろ?

ああ、よかった...。やったぜ!はい。イヤーッ!はい。それこそが私の目指すところです。もしご存知でしたら、その方法を教えていただけませんか?
 
Vadim_2015:
ああ、よかった...。理解された!?はい。はい。はい。それこそが私の目指すところです。もしご存知でしたら、その方法を教えていただけませんか?
理解しました、考えてみますが、時事問題次第ですね。今後、何か質問があれば、プログラマーが理解しやすいように書いてください。
 
Vadim_2015:
ああ、よかった...。やったぜ!はい。はい。はい。それこそが私の目指すところです。もしご存知でしたら、その方法を教えていただけませんか?

昨日のローソク足であれば、iHigest()で終了ローソク足となり、iBarShift() で取得した翌日の00:00(つまり今日のローソク足)がスタートローソク足となります。

アルゴリズムの例

1.今日は、昨日の時間足の中で、最初のブルバーを探します。endBarのインデックスとする

今日最初の1時間バーを決定する。あるいはゼロになる。

3.iHighest()では、最後から2番目のパラメータをendBar(正確にはendBar +1)とし、最後のパラメータを1として設定します。

求められた結果は High[iHighest(with relevant parameters)] // あるいは,前の節で値が代入された対応する変数です.

 
Vadim_2015:
ああ、よかった...。理解された!?はい。はい。はい。それこそが私の目指すところです。もしご存知でしたら、その方法を教えていただけませんか?
void OnStart()
  {
 double  longValue;
 datetime t1,t2;    
 int b1,b2,h; 
 
 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
          Print("",bStart);                 
   for(int i=bStart;i<bStart+1000;i++)
      {
       longValue = Close[i+1]-Open[i+3];
       
//--- само условие
         
       if(longValue>0) 
       {
      t1= iTime(NULL,0,i); //
      t2= iTime(NULL,PERIOD_D1,iBarShift(NULL,PERIOD_D1,t1,false)-1);//00.00.00 время 
      
     // Print("",TimeToStr(t1,TIME_DATE|TIME_SECONDS)); 
     // int("",TimeToStr(t2,TIME_DATE|TIME_SECONDS))Pr;
     
      b1= iBarShift(NULL,0,t1,false);
      b2= iBarShift(NULL,0,t2,false); 
      
      h=iHighest(NULL,0,MODE_HIGH,b1-b2+1,b2);//нашли максимум
      
      SetArrow(159,clrCoral,"h"+(string)Time[h],Time[h],High[h]); //рисуем пипичку
     
       }
   }
  }
//+------------------------------------------------------------------+
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=0) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}
//-------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}
   
  
//+------------------------------------------------------------------+
SCRIPT!を試してみてください。
 
r772ra:
SCREPT!を試しています。

r772ra ありがとう ございました!!!!このスクリプトは私が必要とすることを行ってくれます!最後のコードのブロックでは、すべてが明確ではありませんが、私はそれを把握します。何とかします。インジケーターで使ってみようと思います。

インジケータに使ってみようと 思います。

今後、何か質問があれば、プログラマーが理解しやすいように書いてください。

了解です!参考にさせていただきます。

ありがとうございました。

 
Vadim_2015:

r772ra ありがとうございました!!!!このスクリプトは私が必要とすることを行ってくれます!最後のコードのブロックでは、すべてが明確 ではありませんが、私はそれを把握します。要は、「動く」ということです。インジケーターに応用してみます。

わかりました、考慮します!

ありがとうございました。

まさに、何が明確でないのか?
 
r772ra:
まさに、何が明確でないのか?

間違っていたら説明してください、スクリプトコード_"void SetArrow(int cd, color cl," の後半は、インジケータ内の_OnInit()」 関数を参照している部分だと思います。.インジケーターで、スクリプトの最初の部分_"void OnStart()"は、インジケーター内の関数 "_OnCalculate " を指しているのでしょうか。つまり、大雑把に言うと、スクリプトには最初に1)計算があり、その後2)初期化のみということです。インジケーターではその逆です。

 
Vadim_2015:

間違っていたら説明してください、スクリプトコード_"void SetArrow(int cd, color cl," の後半は、インジケータ内の_OnInit()」 関数を参照している部分だと思います。.インジケーターで、スクリプトの最初の部分_"void OnStart()"は、インジケーター内の関数 "_OnCalculate " を指しているのでしょうか。つまり、大雑把に言うと、スクリプトには最初に1)計算があり、その後2)初期化のみということです。インジケーターではその逆です。

他の機能の範囲外であるユーザー定義関数です。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка значка на графике, объект OBJ_ARROW.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=0) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}

関数呼び出し、他の関数から

SetArrow(159,clrCoral,"h"+(string)Time[h],Time[h],High[h]); //рисуем пипичку

インジケータには必要ないと思います、バッファは描画を 担当します

つまりは

          longBarsBuffer[i]=High[h]+5*Point(); - то что необходимо получить. 
       else 
          longBarsBuffer[i]=0.0; 

さらに

機能

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}

そして、その呼びかけ

は、一日の始まりから何本目のバーかを 求め(現在の日は再計算されません)、そのバーが履歴に入ります。

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
追記)) 関数はここから 引用しています。