Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 979

 
Vadim_2015:

Liebe Freunde, ich werde versuchen, so gut ich kann, zu erklären, was ich erreichen möchte... ...oder ich werde es richtig machen ...oder ich werde alle verwirren!

...

Lassen Sie uns das Gespräch fortsetzen... So wie ich es verstanden habe, kann die Aufgabe auf Folgendes reduziert werden. Der Einfachheit halber werden wir nur den gestrigen Tag, also den H1-Zeitraum, untersuchen.

Zunächst suchen wir nach der frühesten Kerze (von der linken Seite des gestrigen Charts aus gesehen), bei der der Schlusskurs höher ist als der Eröffnungskurs, d. h. wir suchen nach der ersten zinsbullischen Kerze. Wenn diese gefunden wird, sollte man von ihr (einschließlich dieser) bis zur letzten Kerze des aktuellen Tages die Kerze mit dem höchsten Hoch finden. Wenn z.B. die Eröffnungszeit der ersten bullischen Kerze 10:00 Uhr ist, dann sollten wir von dieser Zeit bis zur 23:00 Uhr Kerze nach der Kerze mit dem höchsten Hoch suchen. Oder?

 
paladin80:

Fortsetzung des Gesprächs... Meines Erachtens kann die Aufgabe auf Folgendes reduziert werden. Der Einfachheit halber werden wir nur den gestrigen Tag, den Zeitraum H1, untersuchen.

Zunächst suchen wir nach der frühesten Kerze (von der linken Seite des gestrigen Charts aus gesehen), deren Schlusskurs höher ist als der Eröffnungskurs, d.h. wir suchen nach der ersten bullischen Kerze. Wenn diese gefunden ist, dann sollten wir, ausgehend von ihr (einschließlich dieser) bis zur letzten Kerze des aktuellen Tages, die Kerze mit dem höchsten Hoch finden. Wenn z.B. die Eröffnungszeit der ersten bullischen Kerze 10:00 Uhr ist, dann sollten wir von dieser Zeit bis zur 23:00 Uhr Kerze nach der Kerze mit dem höchsten Hoch suchen. Oder?

Oh, Gott sei Dank... Ich hab's! YES! YEAH! YES! Das ist genau das, was ich zu tun versuche. Wenn Sie es wissen, können Sie mir sagen, wie man es macht?
 
Vadim_2015:
Oh, Gott sei Dank... Ich habe verstanden! YES! YES! YES! Das ist genau das, was ich zu tun versuche. Wenn Sie es wissen, können Sie mir sagen, wie man es macht?
Verstanden, ich werde versuchen, darüber nachzudenken, aber es hängt von den aktuellen Ereignissen ab. Wenn Sie in Zukunft Fragen haben, formulieren Sie diese bitte so, dass sie für die Programmierer leichter verständlich sind.
 
Vadim_2015:
Oh, Gott sei Dank... Ich hab's! YES! YES! YES! Das ist genau das, was ich zu tun versuche. Wenn Sie es wissen, können Sie mir sagen, wie man es macht?

Wenn es sich um die gestrige Kerze handelt, ist dies die Endkerze in iHigest(), und die Startkerze ist 00:00 des nächsten Tages (d. h. die heutige Kerze), die aus iBarShift() ermittelt wird.

Beispielalgorithmus:

1. Heute suchen wir nach dem ersten Bullenbarren unter den gestrigen Stundenbarren. Es sei der endBar-Index

Bestimmen Sie heute den ersten Ein-Stunden-Balken. Oder es wird Null sein.

3. Setzen Sie in iHighest() den vorletzten Parameter auf endBar (oder genauer: endBar +1) und den letzten auf 1.

Das gesuchte Ergebnis ist High[iHighest(mit entsprechenden Parametern)] // oder die entsprechende Variable, deren Wert in der vorherigen Klausel zugewiesen wurde.

 
Vadim_2015:
Oh, Gott sei Dank... Ich habe verstanden! YES! YES! YES! Das ist genau das, was ich zu tun versuche. Wenn Sie es wissen, können Sie mir sagen, wie man es macht?
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);
}
   
  
//+------------------------------------------------------------------+
SCHRIFT! Versuchen Sie es.
 
r772ra:
SCREPT! versuchen.

r772ra Herzlichen Dank!!! Das Skript tut, was ich brauche!!! Im letzten Codeblock ist mir nicht alles klar, aber ich werde es herausfinden. Ich werde es herausfinden. Ich werde versuchen, sie als Indikator zu verwenden.

Ichwerde versuchen, sie in einem Indikator zu verwenden:

Wenn Sie in Zukunft Fragen haben, formulieren Sie sie bitte so, dass sie für die Programmierer leichter verständlich sind.

Ich habe es verstanden, ich werde es berücksichtigen!

Herzlichen Dank!

 
Vadim_2015:

r772ra Herzlichen Dank!!! Das Skript tut, was ich brauche!!! Im letzten Codeblock ist mir nicht alles klar, aber ich werde es herausfinden. Die Hauptsache ist, dass es funktioniert. Ich werde versuchen, sie auf den Indikator anzuwenden.

In Ordnung, ich werde es berücksichtigen!

Herzlichen Dank!

Was genau ist nicht klar?
 
r772ra:
Was genau ist nicht klar?

Erklären Sie, wenn ich falsch liege, ich denke, die zweite Hälfte des Skriptcodes _"void SetArrow(int cd, color cl," ist der Teil, der sich auf die Funktion"_OnInit()" im Indikator bezieht.. und der erste Teil des Skripts _"void OnStart()" bezieht sich auf die Funktion "_OnCalculate" im Indikator? Ich meine, grob gesagt, das Skript hat zunächst 1) Berechnung und dann 2) nur Initialisierung. Beim Indikator ist es genau umgekehrt.

 
Vadim_2015:

Erklären Sie, wenn ich falsch liege, ich denke, die zweite Hälfte des Skriptcodes _"void SetArrow(int cd, color cl," ist der Teil, der sich auf die Funktion"_OnInit()" im benutzerdefinierten Indikator bezieht.. und der erste Teil des Skripts _"void OnStart()" bezieht sich auf die Funktion "_OnCalculate" im Indikator? Ich meine, grob gesagt, das Skript hat zunächst 1) Berechnung und dann 2) nur Initialisierung. Beim Indikator ist es genau umgekehrt.

Es handelt sich um eine benutzerdefinierte Funktion, die nicht in den Anwendungsbereich anderer Funktionen fällt.

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

Funktionsaufruf aus einer beliebigen anderen Funktion

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

Ich denke, Sie brauchen es nicht in den Indikator, der Puffer ist für die Zeichnung verantwortlich

Mit anderen Worten.

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

Weitere

Die Funktion

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

Und der Aufruf

die Anzahl der Balken vom Tagesbeginn an (der aktuelle Tag wird nicht neu berechnet) und dieser Balken wird in die Historie aufgenommen.

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
Addendum))) werden die Funktionen von hier übernommen