Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 979

 
Vadim_2015:

Уважаемые, попробую объяснить по-максимуму чего хочу добиться...    ..или получится у меня ..или совсем всех запутаю!

...

Продолжаем разговор... Как я понял задание можно свести к следующему. Для упрощения будем исследовать только вчерашний день, период Н1.

Сначала ищется самая ранняя свеча (просматривая с левой стороны на графике вчерашнего дня), у которой Close выше Open, т.е. ищем самую первую бычью свечу. Если такая найдена, то начиная от неё (включая и её) аж до самой поздней данного дня, надо найти такую свечу, у которой самый высокий High. Напр., если время открытия первой бычьей свечи 10:00, то от неё и до свечи 23:00 ищем свечу с наивысшим High. Так?

 
paladin80:

Продолжаем разговор... Как я понял задание можно свести к следующему. Для упрощения будем исследовать только вчерашний день, период Н1.

Сначала ищется самая ранняя свеча (просматривая с левой стороны на графике вчерашнего дня), у которой Close выше Open, т.е. ищем самую первую бычью свечу. Если такая найдена, то начиная от неё (включая и её) аж до самой поздней данного дня, надо найти такую свечу, у которой самый высокий High. Напр., если время открытия первой бычьей свечи 10:00, то от неё и до свечи 23:00 ищем свечу с наивысшим High. Так?

ООО, хвала всевышнему... меня поняли!    ДА! ДА! ДА! Именно этого я и пытаюсь добиться. Если знаете, подскажите как это сделать?
 
Vadim_2015:
ООО, хвала всевышнему... меня поняли!    ДА! ДА! ДА! Именно этого я и пытаюсь добиться. Если знаете, подскажите как это сделать?
Понятно, постараюсь подумать, но зависит от текущих дел. Если в будущем будут появляться вопросы, то оформляйте их примерно таким способом, чтоб программистам было понятнее.
 
Vadim_2015:
ООО, хвала всевышнему... меня поняли!    ДА! ДА! ДА! Именно этого я и пытаюсь добиться. Если знаете, подскажите как это сделать?

Если это вчерашняя свеча, то она будет конечная в iHigest() А начальная 00:00 следующего дня (то-есть сегодняшняя) полученная из iBarShift().

Примерный алгоритм:

1. Сегодня ищем среди вчерашних часовых баров первый бычий. Пусть он будет индексом endBar

2. Определяем первый часовой бар сегодня. Или он будет нулевой...

3. В iHighest() ставим предпоследним параметром endBar (или endBar +1 надо уточнить) а последним 1 Получаем индекс бара с наивысшим High на нужном интервале.

4.  Искомый результат High[iHighest(с соответствующими параметрами)] // Или соответствующая переменная значение которой присвоено в предыдущем пункте.

 
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  Спасибо Вам огромное!!! Скрипт делает то что надо!, не все конечно понятно мне в последнем блоке кода, но ниче, разберусь. Главное работает. Буду пробовать переносить в индикатор.

paladin80: 

Если в будущем будут появляться вопросы, то оформляйте их примерно таким способом, чтоб программистам было понятнее.

 

 Ясно, учту!

Всем огромная благодарность! 

 
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();//бар, с которого уходим в историю
 
Добавка))) функции взяты отсюда 
Причина обращения: