Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 979

 
Vadim_2015:

Caros amigos, vou tentar explicar da melhor maneira possível o que estou tentando alcançar... ...ou eu vou acertar ...ou vou confundir a todos!

...

Vamos continuar a conversa... Como eu entendi, a tarefa pode ser reduzida ao seguinte. Para simplificar, só ontem investigaremos o período H1.

Primeiro, procuramos a vela mais antiga (olhando do lado esquerdo do gráfico de ontem) com o Fechar mais alto que o Aberto, ou seja, procuramos a primeira vela em alta. Se esta for encontrada, então, a partir dela (incluindo-a) até a última vela do dia atual, devemos encontrar a vela com o mais alto Alto. Por exemplo, se o horário de abertura da primeira vela em alta é às 10:00, então, a partir dela até a vela das 23:00, devemos procurar a vela com a mais alta. Certo?

 
paladin80:

Continuando a conversa... Pelo que entendi, a tarefa pode ser reduzida ao seguinte. Para simplificar, vamos examinar apenas o dia de ontem, o período H1.

Primeiro, procuramos a vela mais antiga (olhando do lado esquerdo do gráfico de ontem), a mais alta do que a mais alta do Open, ou seja, procuramos a primeira vela em alta. Se esta for encontrada, então, a partir dela (incluindo-a) até a última vela do dia atual, devemos encontrar a vela com o mais alto Alto. Por exemplo, se o horário de abertura da primeira vela em alta é às 10:00, então, a partir dela até a vela das 23:00, devemos procurar a vela com a mais alta. Certo?

Oh, graças a Deus... Consegui! SIM! SIM! SIM! É exatamente isso que estou tentando fazer. Se você sabe, você pode me dizer como fazer isso?
 
Vadim_2015:
Oh, graças a Deus... Fui compreendido! SIM! SIM! SIM! É exatamente isso que estou tentando fazer. Se você sabe, você pode me dizer como fazer isso?
Entendido, vou tentar pensar sobre isso, mas depende de assuntos atuais. Se você tiver alguma dúvida no futuro, por favor, coloque-a de uma forma que facilite a compreensão dos programadores.
 
Vadim_2015:
Oh, graças a Deus... Consegui! SIM! SIM! SIM! É exatamente isso que estou tentando fazer. Se você sabe, você pode me dizer como fazer isso?

Se for o castiçal de ontem, será o castiçal final em iHigest(), e o castiçal inicial será 00:00 do dia seguinte (ou seja, o castiçal de hoje) obtido de iBarShift().

Exemplo de algoritmo:

1. Hoje estamos procurando a primeira barra de touro entre as barras de hora de ontem. Que seja o índice de barras finais

Determinar a primeira barra de uma hora hoje. Ou será zero.

3. Em iHighest() defina o penúltimo parâmetro como endBar (ou endBar +1 deve ser preciso), e o último como 1.

O resultado procurado é Alto[iHighest(com parâmetros relevantes)] // Ou a variável correspondente, cujo valor foi atribuído na cláusula anterior.

 
Vadim_2015:
Oh, graças a Deus... Fui compreendido! SIM! SIM! SIM! É exatamente isso que estou tentando fazer. Se você sabe, você pode me dizer como fazer isso?
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! experimente.
 
r772ra:
SCREPT! tentando.

r772ra Muito obrigado!!! O roteiro faz o que eu preciso!! Nem tudo está claro para mim no último bloco de código, mas eu vou descobrir. O principal é que funciona. Vou tentar usá-lo em indicador.

Vou tentar usá-lo em um indicador:

Se você tiver alguma dúvida no futuro, por favor, coloque-a de uma forma que facilite a compreensão dos programadores.

Eu o tenho, eu o levarei em consideração!

Muito obrigado!

 
Vadim_2015:

r772ra Muito obrigado!!! O roteiro faz o que eu preciso!! Nem tudo está claro para mim no último bloco de código, mas eu vou descobrir. O principal é que funciona. Vou tentar aplicá-lo ao indicador.

Tudo bem, vou levar isso em consideração!

Muito obrigado!

Exatamente o que não está claro?
 
r772ra:
Exatamente o que não está claro?

Explique se eu estiver errado, acho que a segunda metade do código do script _"void SetArrow(int cd, color cl," é a parte que se refere à função"_OnInit()" no indicador personalizado.. indicador, e a primeira parte do script _"void OnStart()" refere-se à função "_OnCalculate" no indicador? Quero dizer, grosso modo, o roteiro tem 1) cálculo no início e depois 2) inicialização apenas. No indicador é o inverso.

 
Vadim_2015:

Explique se eu estiver errado, acho que a segunda metade do código do script _"void SetArrow(int cd, color cl," é a parte que se refere à função"_OnInit()" no indicador.. indicador, e a primeira parte do script _"void OnStart()" refere-se à função "_OnCalculate" no indicador? Quero dizer, grosso modo, o roteiro tem 1) cálculo no início e depois 2) inicialização apenas. No indicador é o inverso.

É uma função definida pelo usuário que está fora do escopo de outras funções.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Chamada de função, a partir de qualquer outra função

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

Acho que você não precisa dele no indicador, o tampão é responsável pelo desenho

Em outras palavras.

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

Mais

A função

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

E a chamada

encontramos o número de barras desde o início do dia (o dia atual não é recalculado) e essa barra entra para a história.

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
Adendo))) as funções são assumidas a partir daqui