Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 979

 
Vadim_2015:

Cari amici, cercherò di spiegare al meglio quello che voglio ottenere... ..o lo farò bene ..o confonderò tutti!

...

Continuiamo la conversazione... Come ho capito il compito può essere ridotto a quanto segue. Per semplificare, esamineremo solo ieri, il periodo H1.

Per prima cosa, cerchiamo la prima candela (guardando dal lato sinistro del grafico di ieri) con la chiusura superiore all'apertura, cioè cerchiamo la prima candela rialzista. Se questa viene trovata, allora partendo da essa (compresa) fino all'ultima candela del giorno corrente, dovremmo trovare la candela con il massimo più alto. Per esempio, se l'ora di apertura della prima candela rialzista è 10:00, allora da essa fino alla candela delle 23:00 dovremmo cercare la candela con il massimo più alto. Giusto?

 
paladin80:

Continuando la conversazione... Per come la vedo io, l'incarico può essere ridotto a quanto segue. Per semplificare, esamineremo solo la giornata di ieri, periodo H1.

In primo luogo, cerchiamo la prima candela (guardando dal lato sinistro del grafico di ieri) la cui chiusura è superiore all'apertura, cioè cerchiamo la prima candela rialzista. Se questa viene trovata, allora partendo da essa (compresa) fino all'ultima candela del giorno corrente, dovremmo trovare la candela con il massimo più alto. Per esempio, se l'ora di apertura della prima candela rialzista è 10:00, allora da essa fino alla candela delle 23:00 dovremmo cercare la candela con il massimo più alto. Giusto?

Oh, grazie al cielo... Ce l'ho! SÌ! YEAH! SÌ! È esattamente quello che sto cercando di fare. Se lo sai, puoi dirmi come fare?
 
Vadim_2015:
Oh, grazie al cielo... Ho capito! SÌ! SÌ! SÌ! È esattamente quello che sto cercando di fare. Se lo sai, puoi dirmi come fare?
Capito, cercherò di pensarci, ma dipende dall'attualità. Se avete domande in futuro, per favore mettetele in un modo che renda più facile la comprensione da parte dei programmatori.
 
Vadim_2015:
Oh, grazie al cielo... Ce l'ho! SÌ! SÌ! SÌ! È esattamente quello che sto cercando di fare. Se lo sai, puoi dirmi come fare?

Se è la candela di ieri, sarà la candela finale in iHigest(), e la candela iniziale sarà 00:00 del giorno successivo (cioè la candela di oggi) ottenuta da iBarShift().

Algoritmo di esempio:

1. Oggi stiamo cercando la prima barra a toro tra le barre orarie di ieri. Che sia l'indice endBar

Determinare la prima barra di un'ora oggi. Oppure sarà zero.

3. In iHighest() impostate il penultimo parametro come endBar (o endBar +1 per essere precisi), e l'ultimo come 1.

Il risultato cercato è High[iHighest(con i relativi parametri)] // O la variabile corrispondente, il cui valore è stato assegnato nella clausola precedente.

 
Vadim_2015:
Oh, grazie al cielo... Ho capito! SÌ! SÌ! SÌ! È esattamente quello che sto cercando di fare. Se lo sai, puoi dirmi come fare?
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! provalo.
 
r772ra:
SCHIFO! provando.

r772ra Grazie mille!!! Lo script fa quello che mi serve!!! Non tutto mi è chiaro nell'ultimo blocco di codice, ma lo capirò. Troverò il modo. Cercherò di usarlo nell'indicatore.

Cercheròdi usarlo in un indicatore:

Se avete domande in futuro, per favore mettetele in un modo che renda più facile la comprensione da parte dei programmatori.

Ho capito, ne terrò conto!

Grazie mille!

 
Vadim_2015:

r772ra Grazie mille!!! Lo script fa quello che mi serve!!! Non tutto mi è chiaro nell'ultimo blocco di codice, ma lo capirò. Troverò il modo. Cercherò di applicarlo all'indicatore.

Va bene, ne terrò conto!

Grazie mille!

Esattamente cosa non è chiaro?
 
r772ra:
Esattamente cosa non è chiaro?

Spiega se mi sbaglio, credo che la seconda metà del codice dello script _"void SetArrow(int cd, color cl," sia la parte che si riferisce alla funzione"_OnInit()" nell' indicatore.. indicatore, e la prima parte dello script _"void OnStart()" si riferisce alla funzione "_OnCalculate" nell'indicatore? Cioè, grosso modo, lo script ha 1) calcolo all'inizio e poi 2) solo inizializzazione. Nell'indicatore è il contrario.

 
Vadim_2015:

Spiega se mi sbaglio, penso che la seconda metà del codice dello script _"void SetArrow(int cd, color cl," sia la parte che si riferisce alla funzione"_OnInit()" nell' indicatore personalizzato.. indicatore, e la prima parte dello script _"void OnStart()" si riferisce alla funzione "_OnCalculate" nell'indicatore? Cioè, grosso modo, lo script ha 1) calcolo all'inizio e poi 2) solo inizializzazione. Nell'indicatore è viceversa.

È una funzione definita dall'utente che è al di fuori dell'ambito di altre funzioni.

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

Chiamata di funzione, da qualsiasi altra funzione

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

Penso che non ne abbiate bisogno nell'indicatore, il buffer è responsabile del disegno

In altre parole.

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

Ulteriori

La funzione

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

trova il numero di barre dall'inizio del giorno (il giorno corrente non viene ricalcolato) e quella barra va nella storia.

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
Addendum)) le funzioni sono prese da qui