Nützliche Funktionen von KimIV - Seite 57

 

Die Funktion ArrayInsertDouble()

Fügt ein Element eines Arrays mit dem angegebenen Index ein. Gibt die Anzahl der Elemente (Größe) des neuen Arrays zurück. Das Einfügen wird wie folgt durchgeführt. Zunächst wird die Größe des Arrays um eins erhöht. Dann werden alle Elemente, deren Index größer oder gleich dem einzufügenden Element ist, einzeln an das Ende des Arrays verschoben, um Platz für das einzufügende Element zu schaffen. Schließlich wird der Wert in die gewünschte Zelle geschrieben. Die Funktion ArrayInsertDouble() benötigt die folgenden Parameter:

  • m - Ein Array von Elementen des Typs double.
  • e - Wert des einzufügenden Array-Elements.
  • i - Index des einzufügenden Array-Elements. Wenn der Indexwert kleiner als Null oder größer oder gleich der Array-Größe ist, wird das Element an das Ende des Arrays angefügt. Der Standardwert ist -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

SZY: Im Anhang finden Sie Skripte zum Testen der Funktionen ArrayInsertDouble(), ArrayInsertInt() und ArrayInsertString().

ZZZY: Ich habe die b-Array-Bibliothek auf meiner Website aktualisiert.

 

Igor, da wir über Arrays sprechen, können wir auf meine alte Anfrage zurückkommen, über das Sortieren von Arrays ('Nützliche Funktionen von KimIV'). Was vorhin gemacht wurde, ist ein bisschen falsch, entschuldigen Sie den indirekten TOR.

Ich muss ein zweidimensionales Array nach einer bestimmten Spalte (Zeile) sortieren, analog zu der Operation in EXCEL. Dieses Verfahren ist erforderlich, um die Spearman-Statistik "Spearman's Rank Correlation Coefficient" in einigen Varianten der Analyse von Korrelationsmatrizen Währungen (Portfolios) zu verwenden.

 

Die Funktion BubbleSort2().

Diese Funktion blendet die Elemente eines zweidimensionalen Arrays in eine beliebige Spalte ein. Sie können auch die Sortierrichtung angeben. Die Funktion BubbleSort2() benötigt die folgenden Parameter:

  • a - Zweidimensionales Feld von Elementen. Obligatorischer Parameter.
  • r - Nummer (Index) der Sortierspalte (Spalte). Der Standardwert ist 0 - die erste Spalte (Spalte mit einem Nullindex).
  • m - Sortierrichtung. Gültige Werte: MODE_ASCEND - aufsteigende Reihenfolge, MODE_DESCEND - absteigende Reihenfolge. Der Standardwert ist MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
Im Anhang finden Sie ein Skript zum Testen der Funktion BubbleSort2().
Dateien:
 

GetTypeLastDeleted() Funktion.

Diese Funktion gibt den Typ des zuletzt gelöschten Auftrags oder -1 zurück. Es kann Situationen geben, in denen wir die EA-Operationslogik an den Typ eines gerade gelöschten Auftrags binden müssen. Wenn Sie z. B. gerade BuyStop gelöscht haben, sollten Sie das tun, aber wenn BuyLimit, sollten Sie etwas anderes tun, usw. Die Funktion GetTypeLastDeleted() akzeptiert die folgenden optionalen Parameter:

  • sy - Name des Instruments. "" - beliebiges Zeichen, NULL - aktuelles Zeichen. Der Standardwert ist "".
  • mn - Kennung der Benutzerbestellung (MagicNumber). Standardwert -1 - eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а) >>

Ja, jetzt das hier.

#include "b-KimIV.mqh" // Zusätzliche Funktionsbibliothek

Hallo Oleg!

Um die Bibliothek b-Positions. mqh fehlerfrei zu kompilieren, benötigen Sie die Funktionen, die bereits in diesem Zweig enthalten sind:

  • GetNameOP() - Gibt den Namen der Handelsoperation zurück.
  • GetNameTF() - Gibt den Namen des Zeitrahmens zurück.
  • IIFc() - Gibt je nach Bedingung einen von zwei Werten zurück.
  • Message() - Nachrichtenausgabe im Kommentar und im Protokoll.

Sie können also wie folgt vorgehen:

  1. Erstellen Sie eine leere Datei mit dem Namen b-kimiv.mqh in demselben Ordner, in dem Sie b-Positions.mqh haben.
  2. Fügen Sie die oben genannten Funktionen ein und kompilieren Sie b-Positions.mqh.

>> Viel Glück!

 

Die Funktion iBarLargest().

Diese Funktion gibt den Index des größten Balkens oder -1 zurück. Die Größe des Balkens wird von der Funktion auf eine von zwei Arten gemessen, die durch den Eingabeparameter ty - Art der Suchbegriffe - bestimmt wird. Entweder nur die Körpergröße oder zusammen mit den Schatten. Die Funktion iBarLargest() akzeptiert die folgenden optionalen Parameter:

  • sy - Name des Werkzeugs. "" oder NULL - das aktuelle Symbol. Der Standardwert ist "".
  • tf - Zeitrahmen. Der Standardwert ist 0 - der aktuelle Zeitrahmen.
  • ty - Art der Suchbegriffe. Gültige Werte - 0 - High-Low, 1 - abs(Open-Close).
  • co - Anzahl der Zeitreihenelemente. Standardwert - 0 - alle Elemente.
  • in - Index des Anfangsbalken. Standardwert - 0 - aktueller Balken.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
ZS: Im Anhang finden Sie ein Skript zum Testen der Funktion iBarLargest().
Dateien:
 

Die Funktion iBarOfDayCalc().

Diese Funktion gibt die berechnete Balkenanzahl vom Beginn des Tages an zurück. Die Balken werden von eins an nummeriert, d.h. der Balken mit der kürzesten Öffnungszeit an einem bestimmten Tag ist die Nummer eins, der nächste Balken ist die Nummer zwei usw. Diese Funktion ist nützlich, um die Ein- und Ausstiegszeiten zu optimieren. Wenn jemand an Details interessiert ist, kann er Fragen stellen. Ich werde mein Bestes tun, um sie zu beantworten. Die Funktion iBarOfDayCalc() benötigt die folgenden optionalen Parameter:

  • tf - Zeitrahmen. Der Standardwert ist 0 - der aktuelle Zeitrahmen.
  • dt - Datum und Uhrzeit der Öffnung der Bar. Der Standardwert ist 0 - aktuelle Zeit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

SZY. Im Anhang finden Sie ein Skript zum Testen der Funktion iBarOfDayCalc(). Die folgende Abbildung zeigt, wie das Skript zu verwenden ist.

Dateien:
 

Funktion iBarOfDayReal().

Diese Funktion gibt die aktuelle Taktnummer vom Beginn des Tages an zurück. Die Balken werden mit eins nummeriert, d.h. der Balken mit der kürzesten Öffnungszeit an einem bestimmten Tag erhält die Nummer eins, der nächste Balken die Nummer zwei usw. Ich habe noch keinen praktischen Nutzen für diese Funktion gefunden. Aber ich habe es geschrieben, um es zu haben :-) zusammen mit der Funktion iBarOfDayCalc(). Die Funktion iBarOfDayReal() akzeptiert die folgenden optionalen Parameter:

  • sy - Name des Handelsinstruments. NULL oder "" - aktuelles Symbol. Der Standardwert ist "".
  • tf - Zeitrahmen. Standardwert - 0 - aktueller Zeitrahmen.
  • dt - Datum und Uhrzeit der Bareröffnung. Standardwert - 0 - aktuelle Zeit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

SZY: Ich füge ein Skript bei, um die Funktion iBarOfDayReal() zu testen. Die folgende Abbildung zeigt, wie das Skript zu verwenden ist.

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

Die Funktion iBarOfDayReal().

Ich habe noch keine praktische Anwendung für diese Funktion gefunden.

jjjj... :)

Ich bin hier als ein Trainingstool, beschlossen, ein Skript, das die zurückgelegte Strecke berechnet zu schreiben.

Falls jemand weiß, dass es ein Programm gibt, das zählt, wie viele Kilometer die Maus auf dem Monitor gelaufen ist.

Hier addieren Sie also die Open-Close-Balken des aktuellen Tages (Woche, Monat oder Jahr) oder, wenn Sie sich vorstellen

eine andere Art, wie ein Faden und eine Nadel, die einen Pelzmantel nähen: Auf-zu-zu-zu-zu-zu-zu-zu-zu-zu-zu-zu... im Verlauf des Diagramms.

Das Gleiche, aber auf dem Hoch-Tief...

*

Das Problem begann schon bei den ersten Schritten.

Wie filtere ich die Balken des aktuellen Tages aus dem Diagramm...

Ich werde versuchen, Ihre Funktionen für dieses Dilemma zu nutzen.

 

Igor. Guten Tag.

Vielleicht können Sie eine einfache Aufgabe für Sie zeichnen: Die Aufgabe (für mich) ist die folgende:

Die Aufgabe besteht darin, festzulegen, bei welchem Kurswert die Signallinie den MACD kreuzt, oder, anders ausgedrückt, das MACD-Histogramm wird gleich Null.

Die Lösung dieses Problems wird benötigt, um z.B. in den Signalen eines Handelssystems, das diesen Indikator verwendet, einen Stoppkurs oder ein Orderlimit für den nächsten Balken zu berechnen,
.

die visuell das Kursniveau anzeigt, bei dem das MACD-Histogramm die Null-Linie kreuzt (d. h. die Kreuzung einer Linie mit der Kurslinie im Diagramm)

Dies bezieht sich auf den prozentualen MACD, der nach der FormelMACD= (FastEMA/SlowEMA - 1) berechnet wird. Perioden 12, 26, Signal 9.

Ich habe Codes für Omega und Metostock, aber ich kann nirgendwo anders finden, wie man sie in MT4 implementiert.

Vielen Dank