任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 979

 
Vadim_2015:

亲爱的朋友们,我将尽力解释我所要实现的目标.........否则我就会做对......否则我就会把大家都搞糊涂!"。

...

让我们继续对话...根据我的理解,这项任务可以简化为以下内容。为了简化,我们将只调查昨天,即上半年的情况。

首先,我们寻找最早的蜡烛(从昨天图表的左侧看),其收盘价高于开盘价,即我们寻找第一根看涨的蜡烛。如果找到了这支蜡烛,那么从它开始(包括它)到当前一天的最新蜡烛,我们应该找到具有最高点的蜡烛。例如,如果第一根看涨蜡烛的开盘时间 是10:00,那么从它到23:00的蜡烛,我们应该寻找具有最高点的蜡烛。对吗?

 
paladin80:

继续对话...根据我的理解,这项任务可以简化为以下内容。为简化起见,我们将只考察昨天的H1期。

首先,我们寻找最早的蜡烛(从昨天图表的左侧看),其收盘价高于开盘价,即我们寻找第一根看涨的蜡烛。如果找到了这支蜡烛,那么从它开始(包括它)到当前一天的最新蜡烛,我们应该找到具有最高点的蜡烛。例如,如果第一根看涨蜡烛的开盘时间是10:00,那么从它到23:00的蜡烛,我们应该寻找具有最高点的蜡烛。对吗?

哦,感谢上帝...我知道了!是的!是的!是的!这正是我所要做的。如果你知道,你能告诉我怎么做吗?
 
Vadim_2015:
哦,感谢上帝...我被理解了!是的!是的!是的!这正是我所要做的。如果你知道,你能告诉我怎么做吗?
明白了,我会尽量考虑的,但这取决于时事。如果你将来有任何问题,请用一种让程序员更容易理解的方式提出来。
 
Vadim_2015:
哦,感谢上帝...我知道了!是的!是的!是的!这正是我所要做的。如果你知道,你能告诉我怎么做吗?

如果是昨天的蜡烛图,它将是iHigest()中的结束蜡烛图,而开始蜡烛图将是由iBarShift() 获得的第二天的00:00(即今天的蜡烛图)。

算法实例。

1.今天我们要在昨天的小时线中寻找第一根牛股。让它成为endBar的索引

确定今天的第一条一小时酒吧。或者说,它将是零。

3.在iHighest()中,将倒数第二个参数设置为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);
}
   
  
//+------------------------------------------------------------------+
剧本!试试吧。
 
r772ra:
惨不忍睹!尝试。

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();//бар, с которого уходим в историю
 
补遗))的功能来自于此