Nützliche Funktionen von KimIV - Seite 36

 

Beispiele für die Verwendung von SetRegression().

  • Rote Linie Regressionskanal auf Basis der Balken der letzten 2 Tage.
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    SetRegression(Red, "", d1, 0, True);

  • Brauner Kanal der linearen Regression basierend auf den Balken der letzten 2 Tage.
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    datetime d2=d1-24*60*60;
    while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
    d2=StrToTime(TimeToStr(d2, TIME_DATE));
    SetRegression(Brown, "", d2, d0, True, STYLE_DASH);

PS. Im Anhang finden Sie ein Skript zum Testen der Funktion SetRegression().

Dateien:
 

Die Funktion EquationDirect().

Die Gleichung einer Geraden. Diese Funktion berechnet den Wert der Ordinate Y für die Abszisse X im Schnittpunkt mit einer Linie, die durch zwei beliebige Punkte des Diagramms gezogen wird. Die Funktion benötigt die folgenden obligatorischen Parameter:

  • x1, y1 - Koordinaten des ersten Punktes.
  • x2, y2 - Koordinaten des zweiten Punktes.
  • x - Wert, Abszisse, für den die Y-Ordinate berechnet werden soll.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  if (x2==x1) return(y1);
  return((y2-y1)/(x2-x1)*(x-x1)+y1);
}
 

Beispiele für die Verwendung von EquationDirect().

  • Der rote Punkt befindet sich im Schnittpunkt der Linie, die durch die Minima der Balken 23 und 11 und den senkrechten Nullstrich gezogen wird.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Eine gerade Linie von den roten Punkten durch zwei beliebige Punkte des Diagramms.
    double p, x[2], y[2];
    int    cd=115, i, k, ot;
    string on;
    
    ArrayInitialize(x, 0.0);
    ArrayInitialize(y, 0.0);
    
    k=ObjectsTotal();
    for (i=k-1; i>=0; i--) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (ObjectGet(on, OBJPROP_ARROWCODE)==cd) ObjectDelete(on);
      }
    }
    k=ObjectsTotal();
    for (i=0; i<k; i++) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (x[0]==0) {
          x[0]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
          y[0]=ObjectGet(on, OBJPROP_PRICE1);
        } else {
          if (x[1]==0) {
            x[1]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
            y[1]=ObjectGet(on, OBJPROP_PRICE1);
          }
        }
      }
    }
    if (x[0]==0 || x[1]==0 || y[0]==0 || y[1]==0)
      Message("НЕ инициализированы исходные данные!");
    else {
      if (x[0]>x[1]) k=x[0]; else k=x[1];
      for (i=k; i>=0; i--) {
        if (i!=x[0] && i!=x[1]) p=EquationDirect(x[0], y[0], x[1], y[1], i);
        else {
          if (i==x[0]) p=y[0];
          if (i==x[1]) p=y[1];
        }
        SetArrow(cd, Red, "arr"+i, Time[i], p);
      }
    }

SZY: Im Anhang finden Sie ein Skript zum Testen von EquationDirect().

Dateien:
 

GetArrowInterval() Funktion.

Ich habe diese Funktion geschrieben, um die Entwicklung von Signalindikatoren, d.h. von Indikatoren, die klare Kauf- oder Verkaufssignale geben, zu erleichtern. Das Signal eines solchen Indikators gebe ich in der Regel als Abwärtspfeil oberhalb des Khai eines Balkens oder als Aufwärtspfeil unterhalb des Tiefs des entsprechenden Balkens. Der Wert von "unter" und "über" war in der Regel ein paar Punkte, so dass der Pfeil nicht "über" den Balken laufen würde. Bei einem Indikator mit einem einzigen Zeitrahmen, der z. B. nur für eine Stunde ausgelegt ist, war das kein großes Problem. Für jeden Zeitrahmen hatte ich unterschiedliche Werte "unter" und "über". Für einen Multiframe-Indikator musste ich jedoch die Funktion GetArrowInterval() verwenden:

//+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
int GetArrowInterval() {
  int p = Period();

  switch (p) {
    case 1:     return(4);
    case 5:     return(5);
    case 15:    return(6);
    case 30:    return(8);
    case 60:    return(10);
    case 240:   return(20);
    case 1440:  return(40);
    case 10080: return(80);
    case 43200: return(150);
  }
}

Dies ist eine alte Variante, die sich sehr schnell in eine kompaktere und vielseitigere Form verwandelt hat:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval(int pr=7) {
  if (pr<=0) pr=7;
  return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);
}
 

Beispiele für die Verwendung von GetArrowInterval().

  • Verkaufssignal für den aktuellen Balken.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Kaufsignal auf dem vorherigen (ersten) Balken.
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion GetArrowInterval().

Dateien:
 
Lieber Igor. In e-SOTrailing müssen Sie die Start- und Endpositionen ändern.
 
khorosh писал (а) >>
In e-SOTrailing EA müssen Sie Änderungen an den Takes und Stops vornehmen.

Ich danke Ihnen! Erledigt... Der korrigierte EA ist auf meiner Website zu finden.

 
KimIV писал (а) >>

Die Funktion EquationDirect().

Die Gleichung einer Geraden. Diese Funktion berechnet den Wert der Ordinate Y für die Abszisse X im Schnittpunkt mit einer Linie, die durch zwei beliebige Punkte des Diagramms gezogen wird. Die Funktion benötigt die folgenden obligatorischen Parameter:

  • x1, y1 - Koordinaten des ersten Punktes.
  • x2, y2 - Koordinaten des zweiten Punktes.
  • x - Wert, die Abszisse, für die Sie die Y-Ordinate berechnen möchten.

Schreiben Sie bitte den zweiten Teil der Geradengleichung.

Berechnen Sie den Wert der Ordinate Y für die Abszisse von X im Schnittpunkt mit einer Linie, die durch einen beliebigen Punkt auf einem Diagramm mit einem bestimmten Winkel gezogen wird. Die Funktion benötigt die folgenden obligatorischen Parameter:

  • x1, y1 - Koordinaten des ersten Punktes.
  • a - Winkel in Grad.
  • x - Wert, die Abszisse, für die Sie die y-Ordinate berechnen möchten.

Ich danke Ihnen.

 
Echter Programmierer Igor. Großer Respekt und Achtung für Sie.
 
djday писал (а) >>

Schreiben Sie den zweiten Teil der Gleichung einer Geraden.

Berechnen Sie den Wert der Ordinate Y für die Abszisse X im Schnittpunkt mit einer Linie, die durch einen beliebigen Punkt eines Diagramms mit einem bestimmten Winkel gezogen wird. Die Funktion benötigt die folgenden obligatorischen Parameter:

  • x1, y1 - Koordinaten des ersten Punktes.
  • a - Winkel in Grad.
  • x - Wert, die Abszisse, für die die Y-Ordinate berechnet werden soll.

Ich danke Ihnen.

Ein 45°-Winkel entsteht, wenn die Katheter gleich groß sind. Wenn die Maßeinheit der Katheter metrisch ist, gibt es kein Problem. Der eine Katheter ist zwei Meter lang, der andere ebenfalls zwei Meter. Das ist also ein 45°-Winkel. Aber was ist, wenn ein Katheter die Anzahl der Takte oder die Zeit ist, und der andere Katheter der Preis? Wie stellt man sicher, dass sie gleich sind, so dass der Winkel 45° beträgt? Es ist eine Frage der Skalierung. Gib mir einen Drehpunkt und ich bewege den Boden (c).