Nützliche Funktionen von KimIV - Seite 46

 
SK. писал (а) >>

Das ist es, was ich meine. Sie müssen die bestehenden Sachzwänge berücksichtigen, die sich im Allgemeinen ständig ändern.

Gibt es eine Funktion, die alle möglichen Beschränkungen analysiert?

Dasselbe gilt für Änderungen.

--

(Ich habe 16 Funktionen - 3 für jede gute Order (OP,SL,TP) und 2 für jede Marktorder (SL,TP),

und dann einige weitere Funktionen, die Kombinationen von Genehmigungen analysieren).

ja, ich habe auch eine separate Funktion zum Setzen einer Reihenfolge, die alle möglichen Einschränkungen prüft, und eine separate (teilweise ähnlich der ersten) für Änderungen. ich werde den Code nicht weitergeben - es gibt so viel "linkes" Zeug, das nur ich brauche, dass - autsch. :-) aber im Allgemeinen - es ist schwierig, ohne sie in den realen Handel Expert Advisors. :-)

 
Shu писал (а) >>

Ja, ich habe auch eine separate Funktion zum Setzen einer Reihenfolge, die alle möglichen Einschränkungen prüft, und eine separate (teilweise ähnlich der ersten) zum Ändern. Ich werde Ihnen den Code nicht geben - es gibt so viele "linke" Tricks, die nur ich brauche, dass - autsch. :-) aber im Allgemeinen - es ist schwierig, ohne sie in den realen Handel Expert Advisors. :-)

Eigentlich wollte ich mich selbst überprüfen - ob ich alles berücksichtigt habe. Wenn Sie diese nicht überprüfen, kann es zu einer Reihe von Bounces kommen (manchmal mit der Aussicht, gesperrt zu werden).

Ich werde meine Kontrollen kurz auflisten.

1) StopLevel. Zum Beispiel, wenn Sie den SL BuyStop ändern.

Es wird nicht nur die Entfernung geprüft. Sie sollten die aktuelle Position des StopLevels und die Richtung der Stop-Order-Bewegung analysieren.

Wenn SL außerhalb des StopLevel-Korridors liegt, können Sie es in die Nähe oder auf unbestimmte Zeit verschieben.

Befindet sich der SL innerhalb des Korridors, wird die Aufwärtsbewegung abgelehnt. Die Abwärtsbewegung wird akzeptiert, allerdings unter Berücksichtigung des StopLevels: Wenn die Änderungsdistanz innerhalb des Distanzkorridors auf 3 p festgelegt ist und der Korridor 30 p beträgt, dann wird der tatsächliche Wert, der zur Ausführung akzeptiert wird, durch die Korridorgrenze des StopLevels definiert.

2) FreezeLevel.

3. Verhältnis von StopLevel und TICKSIZE. Der Auftrag darf außerhalb aller Korridore liegen, aber nicht ein Vielfaches von TICKSIZE betragen - dann gibt es Ärger. Sie muss in Richtung der Änderungsrichtung abgerundet werden. Kritisch für "Nicht-Währung".

4. Lose. Minlote +/- Minlote. Berücksichtigen Sie, dass Teil- und Gegenschließungen auch auf Minilots beschränkt sind (obwohl das meiner Meinung nach unlogisch ist, aber so ist es nun einmal).

Nach persönlichen Prüfungen wird der Auftrag erteilt, wenn jede Prüfung positiv ausgefallen ist (keine Sperre).

 

Vollständig veröffentlichte Funktionsbibliotheken:

b-Graphics.rar - Arbeit mit grafischen Objekten.

b-Indicators.rar - Arbeit mit Indikatoren.

 

Die Funktion ArrayLR().

Diese Funktion erzeugt ein Array von linearen Regressionswerten. Die Funktion akzeptiert die folgenden obligatorischen Parameter:

  • x ist ein Array mit numerischen Reihenwerten. Dies ist der Eingabeparameter. Dieses Array muss die Werte enthalten, bevor die Funktion aufgerufen wird.
  • y ist ein Array von linearen Regressionswerten. Dies ist der Ausgabeparameter, d.h. das Array wird nach Ausführung der Funktion gefüllt.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR(double& x[], double& y[]) {
  double a, b, c, sx=0, sx2=0, sxy=0, sy=0;
  int    i, n=ArraySize(x);

  if (n>1) {
    for (i=0; i<n; i++) {
      sx+=i+1;
      sy+=x[i];
      sxy+=(i+1)*x[i];
      sx2+=(i+1)*(i+1);
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
    if (c!=0) a=a/c; else a=0;
    b=(sy-a*sx)/n;
    ArrayResize(y, n);
    for (i=0; i<n; i++) y[i]=a*(i+1)+b;
  } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", n);
}
 

Beispiel für die Verwendung der Funktion ArrayLR().

Markieren wir die Kursniveaus der linearen Regression für die letzten 30 Balken.

#define r 30
double x[r], y[];
for (int i=0; i<r; i++) x[i]=Close[i+1];
ArrayLR(x, y);
for (i=0; i<r; i++) SetArrow(170, Red, "arr"+i, Time[i+1], y[i]);

P.S. Im Anhang finden Sie ein Skript zum Testen der Funktion ArrayLR().

Dateien:
 
KimIV писал (а) >>

Vollständig veröffentlichte Funktionsbibliotheken:

b-Graphics.rar - Arbeit mit grafischen Objekten.

b-Indicators.rar - Arbeit mit Indikatoren.

Sehr cool! >> Vielen Dank!

 
Parabellum писал (а) >>

Igor, es gibt einen guten Indikator, der mehrere Kerzen zu einer einzigen zusammenfassen kann. Aber es funktioniert nur auf dem Stundenchart. Ist es möglich, sie universell zu machen?

Ich danke Ihnen.

?

 
Parabellum писал (а) >>

?

ooh... Entschuldigung...

Ein solcher Indikator wurde bereits geschrieben, ich weiß nicht mehr, von wem, und ich weiß nicht mehr, wo ich ihn gesehen habe... Ich dachte, du würdest es selbst finden oder jemand würde dir den Link geben...

 

Die Funktion ArrayLR() arbeitet nicht genau.

1. Die zeitliche Lage der Balken wird nicht berücksichtigt. Bei fehlenden Balken funktioniert es nicht richtig.

2. der zur Berechnung der Koeffizienten verwendete Algorithmus hat einen Nachteil in Form von Rundungsfehlern, siehe "Help me write a linear regression" (ganz unten auf der Seite Rosh wird dieser Fall bestätigt).

3. Ich schlage einen Algorithmus ohne diese Nachteile vor.

4. Wenn Sie X[i]=Time[i+1]; durch X[i]=i+1; ersetzen, ist der Algorithmus ähnlich, jedoch ohne Fehlerakkumulation.

5. Bars werden nicht nur an Wochenenden übersprungen :-(((

Hier ist meine Variante

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.09.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии y(x)=A*x+B.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

void Array_LR(double &X[], double& Y[])
{
      double mo_X = 0, mo_Y = 0, var_0 = 0, var_1 = 0;
      int    i,N=ArraySize(X);
      double A,B;
     
      if(N>1)  {
         for ( i = 0; i < N; i ++ ) {
            mo_X +=X[i];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
        
      for ( i = 0; i < N; i ++ )   {
         var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
         var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
      // значение коэффициента A
      if(var_1!=0)   A = var_0 / var_1; else A=0;
      // значение коэффициента B
      B = mo_Y - A * mo_X;
      ArrayResize(Y, N);
     for (i=0; i<N; i++) Y[i]=A*X[i]+B;
    } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", N);
    
}

Hier ist ein Bild

Arbeitsbeispiel

#define r 280
void start() {
  double X[r], Y[r];
  for (int i=0; i<r; i++)  {
    Y[i]=Close[i+1];
    X[i]=Time[i+1];
  }
   Array_LR(X, Y);
  for (i=0; i<r; i++) {SetArrow(170, Blue, "arr"+i, X[i], Y[i])}

Skript zur Überprüfung beigefügt

Dateien:
 
Prival писал (а) >>
Hier ist meine Variante

OK, Sergei! Es gibt zwei Varianten dieser Funktion.

Meine Variante ist gut, weil sie mit dem eingebauten Grafikobjekt OBJ_REGRESSION identisch ist. Wenn jemand Preise von diesem Objekt nehmen muss, wird ihm meine Funktion helfen, während Ihre, leider... Aber es könnte für etwas anderes verwendet werden... Ich danke Ihnen!