Nützliche Funktionen von KimIV - Seite 11

 
KimIV:
Jeder Mensch hat das Recht auf die linke Seite... Hehe... Ich werde ein bisschen Spaß damit haben

Ilnar fragte im Thema Anhängige Fraktal-Aufträge, wie man anhängige Aufträge auf Fraktalen macht?


Ich glaube, Ilnar hatte einige Schwierigkeiten mit fraktalen Preisniveaus. Deshalb schlage ich vor, meine Funktion zu verwenden:


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
Die Funktion FindNearFractal() sucht nach dem nächstgelegenen Fraktal eines bestimmten Typs für ein bestimmtes Symbol in einem bestimmten Zeitrahmen und gibt dessen Kursniveau zurück. Wenn Sie das Preisniveau des Ortes kennen, an dem sich das Fraktal befindet, ist es bereits einfach, einen Auftrag zu diesem Niveau zu erteilen.
Ist es möglich, dass die Funktion zwei Werte zurückgibt, z. B. die Nummer des Balkens, in dem sich das Fraktal befindet, oder müssen wir einen weiteren Wert anschließen?
 
xrust писал (а):
Ist es möglich, dass die Funktion zwei Werte zurückgibt, z.B. auch die Taktnummer, in der sich das Fraktal befindet, oder soll ich noch einen weiteren anschließen?
Und warum zwei Werte zurückgeben, wenn einer - die Taktnummer - ausreicht? Zu diesem Zweck wird in der Erklärung:
return(NormalizeDouble(f, d));
den Wert des Barzählers s anstelle des Preisniveaus schreiben. In der Ausgabe erhalten Sie die Nummer des fraktalen Balkens. Und Sie erhalten das Preisniveau mit einer der Funktionen iHigh () oder iLow(), je nach Fraktaltyp.
 
Nein, hier ist alles klar, ich frage im Grunde nur. Vielen Dank, Ihre Beiträge sind sehr hilfreich.
 
xrust:
Nein, es ist klar, dass ich im Grunde nur frage.
Ahh... Nun, im Prinzip können Sie ein als Referenz übergebenes Array verwenden. Dann wäre die Anzahl der zurückgegebenen Parameter durch die Größe des Arrays begrenzt.
 

Funktion ExistOrdersByLot().

Gibt ein Kennzeichen für das Vorhandensein eines Auftrags mit der angegebenen Losgröße zurück. True - Auftrag existiert (gesetzt), False - Auftrag existiert nicht (nicht gesetzt). Sie können die Liste der zu prüfenden Aufträge mit Hilfe der Funktionsparameter einschränken:

  • sy - Name des Instruments. Wenn Sie diesen Parameter setzen, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet aktuelles Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Vorgang, Art des schwebenden Auftrags. Gültige Werte: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert -1 steht für einen beliebigen Auftragstyp.
  • mn - Kennung der Bestellung (MagicNumber). Der Standardwert von -1 bedeutet eine beliebige MagicNumber.
  • lo - Größe einer Partie mit einer Genauigkeit von zwei Dezimalstellen. Der Standardwert ist 0 - eine beliebige Losgröße.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

Beispiele für die Verwendung der Funktion ExistOrdersByLot().

  1. Prüfung auf einen Auftrag mit Losgröße 0,2
    ExistOrdersByLot("", -1, -1, 0.2);
  2. Prüfen Sie jeden Auftrag mit der Losgröße 0,3 auf dem aktuellen Chartsymbol
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. Prüfen Sie, ob ein BuyLimit-Auftrag mit der Losgröße 0,5 für ein beliebiges Symbol vorhanden ist
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. Prüfen Sie das Vorhandensein einer SellStop-Order mit der Losgröße 0,1 und der magischen Zahl 123456 bei EURUSD
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. Prüfen Sie das Vorhandensein eines Auftrags mit Lot 0,4 mit der magischen Zahl 987 auf USDJPY
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

Im Anhang finden Sie, wie üblich, ein funktionierendes Skript mit den oben genannten Beispielen.

Dateien:
 

GetLotLastOrder() Funktion.

Gibt die Losgröße des zuletzt erteilten Auftrags oder -1 zurück. Sie können die Liste der zu prüfenden Aufträge mit Hilfe der Funktionsparameter einschränken:

  • sy - Name des Instruments. Wenn dieser Parameter angegeben wird, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Vorgang, Art des schwebenden Auftrags. Gültige Werte: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert von -1 bedeutet eine beliebige Reihenfolge.
  • mn - Kennung der Bestellung (MagicNumber). Der Standardwert -1 bedeutet eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

Beispiele für die Verwendung von GetLotLastOrder().

  1. Größe des Loses der letzten Bestellung ermitteln
    GetLotLastOrder();
  2. Ermittlung der Losgröße des letzten Auftrags für das aktuelle Symbol
    GetLotLastOrder(NULL);
  3. Ermittlung der Losgröße des letzten BuyLimit-Auftrags für ein beliebiges Symbol
    GetLotLastOrder("", OP_BUYLIMIT);
  4. Finden Sie die Losgröße des letzten SellStop-Auftrags mit der magischen Zahl 123456 auf EURUSD
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. Geben Sie die Losgröße des letzten Auftrags mit der magischen Nummer 2345 für das aktuelle Symbol an
    GetLotLastOrder(NULL, -1, 2345);

Im Anhang finden Sie ein traditionell funktionierendes Skript mit den oben genannten Beispielen.

Dateien:
 

GetOrderOpenPrice() Funktion.

Gibt den Einstellpreis der zuletzt geöffneten Order oder 0 zurück. Sie können die Liste der zu prüfenden Orders mit Funktionsparametern einschränken:

  • sy - Name des Instruments. Wenn dieser Parameter angegeben wird, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Vorgang, Art des schwebenden Auftrags. Gültige Werte: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert -1 steht für eine beliebige Reihenfolge.
  • mn - Kennung der Bestellung (MagicNumber). Der Standardwert -1 bedeutet eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

Beispiele für die Verwendung von GetOrderOpenPrice().

  1. Den Eröffnungspreis der letzten Bestellung abrufen
    GetOrderOpenPrice();
  2. Suche nach dem Preis des letzten Auftrags, der für das aktuelle Symbol erteilt wurde
    GetOrderOpenPrice(NULL);
  3. Ermittlung des Einstellpreises des letzten BuyLimit-Auftrags für ein beliebiges Symbol
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. Finden Sie den Preis der letzten SellStop-Order, die mit der Magie 123456 auf EURUSD platziert wurde
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. Geben Sie den Preis des letzten mit magic 2345 erteilten Auftrags für das aktuelle Symbol an
    GetOrderOpenPrice(NULL, -1, 2345);

Im Anhang finden Sie ein perfekt funktionierendes Skript mit den oben genannten Beispielen.

Dateien: