Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 979

 
Vadim_2015:

Queridos amigos, intentaré explicar lo mejor posible lo que pretendo... ...o lo haré bien... ¡o confundiré a todos!

...

Continuemos la conversación... Según he entendido la tarea puede reducirse a lo siguiente. Para simplificar, sólo investigaremos el día de ayer, el periodo H1.

En primer lugar, buscamos la vela más temprana (mirando desde el lado izquierdo del gráfico de ayer) con el Cierre más alto que la Apertura, es decir, buscamos la primera vela alcista. Si se encuentra ésta, entonces partiendo de ella (incluyéndola) hasta la última vela del día actual, deberíamos encontrar la vela con el Máximo más alto. Por ejemplo, si la hora de apertura de la primera vela alcista es las 10:00, entonces desde ella hasta la vela de las 23:00 debemos buscar la vela con el máximo más alto. ¿Verdad?

 
paladin80:

Continuando con la conversación... Según tengo entendido, la tarea puede reducirse a lo siguiente. Para simplificar, sólo examinaremos el día de ayer, el periodo H1.

En primer lugar, buscamos la primera vela (mirando desde el lado izquierdo del gráfico de ayer) cuyo cierre sea superior a la apertura, es decir, buscamos la primera vela alcista. Si se encuentra ésta, entonces partiendo de ella (incluyéndola) hasta la última vela del día actual, deberíamos encontrar la vela con el Máximo más alto. Por ejemplo, si la hora de apertura de la primera vela alcista es las 10:00, entonces desde ella hasta la vela de las 23:00 debemos buscar la vela con el máximo más alto. ¿Verdad?

Oh, gracias a Dios... ¡Ya lo tengo! ¡SI! ¡SI! ¡SI! Eso es exactamente lo que intento hacer. Si lo sabes, ¿puedes decirme cómo hacerlo?
 
Vadim_2015:
Oh, gracias a Dios... ¡Se me entiende! ¡SI! ¡SI! ¡SI! Eso es exactamente lo que intento hacer. Si lo sabes, ¿puedes decirme cómo hacerlo?
Entendido, intentaré pensarlo, pero depende de la actualidad. Si tiene alguna pregunta en el futuro, por favor, póngala de forma que facilite la comprensión de los programadores.
 
Vadim_2015:
Oh, gracias a Dios... ¡Ya lo tengo! ¡SI! ¡SI! ¡SI! Eso es exactamente lo que intento hacer. Si lo sabes, ¿puedes decirme cómo hacerlo?

Si es la vela de ayer, será la vela final en iHigest(), y la vela inicial será las 00:00 del día siguiente (es decir, la vela de hoy) obtenida de iBarShift().

Ejemplo de algoritmo:

1. Hoy buscamos la primera barra alcista entre las barras horarias de ayer. Que sea el índice endBar

Determina la primera barra de una hora de hoy. O será cero.

3. En iHighest() establezca el penúltimo parámetro como endBar (o endBar +1 debería ser preciso), y el último como 1.

El resultado buscado es High[iHighest(con los parámetros pertinentes)] // O la variable correspondiente, cuyo valor fue asignado en la cláusula anterior.

 
Vadim_2015:
Oh, gracias a Dios... ¡Se me entiende! ¡SI! ¡SI! ¡SI! Eso es exactamente lo que intento hacer. Si lo sabes, ¿puedes decirme cómo hacerlo?
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);
}
   
  
//+------------------------------------------------------------------+
¡GUIÓN! pruébalo.
 
r772ra:
¡ESCRITO! intentándolo.

r772ra¡¡¡Muchas gracias!!! El script hace lo que necesito!!! No todo me queda claro en el último bloque de código, pero lo resolveré. Lo resolveré. Intentaré utilizarlo en el indicador.

Intentaré utilizarlo en un indicador:

Si tiene alguna pregunta en el futuro, por favor, póngala de forma que facilite la comprensión de los programadores.

¡Lo tengo, lo tendré en cuenta!

¡Muchas gracias!

 
Vadim_2015:

r772ra ¡¡¡Muchas gracias!!! El script hace lo que necesito!!! No todo me queda claro en el último bloque de código, pero lo resolveré. Lo principal es que funciona. Intentaré aplicarlo a los indicadores.

¡Muy bien, lo tendré en cuenta!

¡Muchas gracias!

¿Qué es exactamente lo que no está claro?
 
r772ra:
¿Qué es exactamente lo que no está claro?

Explica si me equivoco, creo que la segunda mitad del código del script _"void SetArrow(int cd, color cl," es la parte que se refiere a la función"_OnInit()" del indicador.. y la primera parte del script _"void OnStart()" se refiere a la función "_OnCalculate" del indicador? Es decir, a grandes rasgos, el script tiene 1) cálculo al principio y luego 2) inicialización solamente. En el indicador es al revés.

 
Vadim_2015:

Explica si me equivoco, creo que la segunda mitad del código del script _"void SetArrow(int cd, color cl," es la parte que se refiere a la función"_OnInit()" del indicador.. y la primera parte del script _"void OnStart()" se refiere a la función "_OnCalculate" del indicador? Es decir, a grandes rasgos, el script tiene 1) cálculo al principio y luego 2) inicialización solamente. En el indicador es al revés.

Es una función definida por el usuario que está fuera del alcance de otras funciones.

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

Llamada de función, desde cualquier otra función

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

Creo que no es necesario en el indicador, el buffer es responsable del dibujo

En otras palabras.

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

Más información en

La función

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

Y la llamada

encuentra el número de barras desde el principio del día (el día actual no se recalcula) y esa barra pasa al historial.

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
Addendum)) las funciones se toman de aquí