Nützliche Funktionen von KimIV - Seite 107

 
143alex:

Haben Sie nicht (bereit und willens, )))) dasselbe zu kaufen, aber mit Excel zu arbeiten?

nein, nicht verfügbar... )))

 

Die Funktion GetPotentialLossInCurrency() gibt den gesamten potenziellen Verlust der offenen Positionen in der Depotwährung zurück. Die Berechnung erfolgt auf der Grundlage des Eröffnungskurses der Position und des StopLoss-Kursniveaus. Wenn für eine Position kein StopLoss gesetzt ist, gibt diese Funktion das aktuelle Eigenkapital des Handelskontos zurück.

Die Funktion GetPotentialLossInCurrency() akzeptiert die folgenden Parameter:

  • sy - Name des Instruments. Wenn wir diesen Parameter setzen, wird die Funktion nur die Positionen des angegebenen Instruments überprüfen. NULL bedeutet das aktuelle Instrument, während "" (Standard) ein beliebiges Instrument bedeutet.
  • op - Handelsbetrieb, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Standardwert -1 - bedeutet eine beliebige Position.
  • mn - Positionsbezeichner (MagicNumber). Der Standardwert -1 bedeutet eine beliebige MagicNumber.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 17.02.2012                                                     |
//|  Описание : Возвращает суммарный потенциальный убыток                      |
//|             открытых позиций в валюте депозита.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetPotentialLossInCurrency(string sy="", int op=-1, int mn=-1) {
  double pl=0;
  double po, tv;                   // Пункт, спрэд и стоимость пункта
  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=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          if (OrderStopLoss()>0) {
            po=MarketInfo(OrderSymbol(), MODE_POINT);
            if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
            else {
              tv=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
              if (OrderType()==OP_BUY) {
                pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
              }
              if (OrderType()==OP_SELL) {
                pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
              }
              pl+=OrderCommission()+OrderSwap();
            }
          } else {
            pl=AccountBalance();
            break;
          }
        }
      }
    }
  }
  return(pl);
}

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

 

Hallo Igor. Ich gratuliere Ihnen zu Ihrer Reihe sehr nützlicher Funktionen.

Kann ich Sie um Hilfe bitten... Ich möchte eine Art teilweisen Schrank bauen. Aber bis jetzt weiß ich nicht, wie ich es anstellen soll. Die Idee ist die folgende:

Es gibt 4 - Aufträge, sagen wir -200$ -175$ -150$ und -25$ und es gibt 5+ Aufträge, die insgesamt +400$ betragen

Wenn 400 > -200+-175, aber weniger als -200+-175+-150, dann schließen Sie 5 Plus- und Minus-Aufträge -200 -175, das sind 2 Aufträge mit einem Verlust von mehr oder weniger.

Dieses Beispiel ist ziemlich grob, aber ich denke, ich habe die Idee verstanden...

Das erste Problem ist, dass ich etwas brauche, um sie aufzuschreiben. (Ich verstehe Array nicht wirklich) oder einen anderen Weg finden.

Das zweite Problem ergibt sich aus dem ersten. Angenommen, ich habe los[x] mit Losen aus 4 verschiedenen Aufträgen... sollte ich Lose ( los[x]) in ein Modul laden , das nach tiket entsprechend dem Preis sucht, oder füge ich 1 (los[Preis]) und 2 (los2[tiket]) hinzu, während ich Lose sortiere?

Vielleicht können Sie mich auf eine Stelle hinweisen, wo Sie dies tun können, oder mir etwas beibringen, was ich nicht kann =)

 

Wahrscheinlich fängt jeder Trader früher oder später an, die Anzahl der verbleibenden Pips zu berechnen, bevor die Einlage verloren ist. Die Berechnung ist einfach: Wir nehmen das Geld, teilen es durch die Anzahl der Lose auf dem Markt, durch den Punktwert und erhalten die gesuchte Antwort. Dies ist genau das, was meine neue Funktion ReserveDepositInPoint() tut, sie nimmt die folgenden Parameter:

  • sy - Name des Instruments. Wenn Sie diesen Parameter setzen, prüft die Funktion nur die Positionen des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, während "" (standardmäßig) ein beliebiges Instrument bedeutet.
  • op - Handelsbetrieb, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Standardwert -1 - bedeutet eine beliebige Position.
  • mn - Positionsbezeichner (MagicNumber). Der Standardwert von -1 bedeutet eine beliebige MagicNumber.

Die Funktion ReserveDepositInPoint() behandelt entgegengesetzte Positionen korrekt, d. h. sie berechnet die Differenz zwischen Verkaufs- und Kaufpositionen und verwendet genau diese Differenz für die Berechnungen. Die Berechnungen basieren auf dem Eigenkapital, d.h. es wird angenommen, dass der Stopout 100% beträgt. Swaps, Steuern und Provisionen werden nicht berücksichtigt.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.02.2012                                                     |
//|  Описание : Возвращает запас депозита в пунктах.                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int ReserveDepositInPoint(string sy="", int op=-1, int mn=-1) {
  int    i, k=OrdersTotal();      // Номера позиций
  int    n, r;                    // Номер символа в массиве, запас депозита в пунктах
  double ol[], tv;                // Массив лотов, стоимость пункта
  string os[];                    // Массив символов

  if (sy=="0") sy=Symbol();
  ArrayResize(os, 0);
  ArrayResize(ol, 0);

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        n=ArraySearchString(os, OrderSymbol());
        if (n<0) {
          n=ArraySize(os);
          ArrayResize(os, n+1);
          ArrayResize(ol, n+1);
        }
        os[n]=OrderSymbol();
        if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
          if (OrderType()==OP_BUY ) ol[n]+=OrderLots();
          if (OrderType()==OP_SELL) ol[n]-=OrderLots();
        }
      }
    }
  }

  n=ArraySize(os);
  for (i=0; i<n; i++) {
    tv=MarketInfo(os[i], MODE_TICKVALUE);
    if (tv==0) Message("В обзоре рынка отсутствует символ "+os[i]+". Точность расчётов не гарантируется!");
    else {
      if (ol[i]!=0) {
        ol[i]=MathAbs(ol[i]);
        r+=AccountEquity()/tv/ol[i];
      }
    }
  }
  if (n>1) r/=n*n;

  return(r);
}

Im Anhang finden Sie einen Expert Advisor zur Überprüfung der Funktion ReserveDepositInPoint().

Dateien:
 

Funktion SetFibo().

Diese Funktion setzt die Fibonacci-Levels des OBJ_FIBO-Objekts im aktuellen Chart.

  • cl - Array der Farben des Objekts Fibonacci Levels. Obligatorischer Parameter. Zwei Elemente. Die erste legt die Farbe des Objekts fest, die zweite - die Farbe der Linien der Ebenen.
  • st - Array von Objektstilen Fibonacci-Stufen. Erforderlicher Parameter. Zwei Elemente. Die erste legt den Objektstil fest, die zweite - den Stil der Linien der Ebenen.
  • wd - Array vonObjektbreiten Fibonacci-Stufen. Erforderlicher Parameter. Zwei Elemente. Die erste legt die Breite des Objekts fest, die zweite - die Breite der Linien der Ebenen.
  • fl - Array von Fibonacci-Ebenen. Erforderlicher Parameter.
  • nm - Name des Objekts. Wenn der Standardwert - "" - übergeben wird , wird die Eröffnungszeit des aktuellen Balkens als Name verwendet.
  • t1 - Erste Koordinate der Objektsetzungszeit. Standardwert - 0 - Öffnungszeit des zehnten Taktes.
  • p1 - Erste Koordinate des Objekts, das den Preis festlegt. Standardwert - 0 - Minimum des zehnten Balkens.
  • t2 - Zweite Koordinate der Objektsetzungszeit. Standardwert - 0 - Öffnungszeit des aktuellen Taktes.
  • p2 - Zweite Koordinate des Objekts, das den Preis festlegt. Standardwert - 0 - aktueller Tiefstand.
  • ry - Flagge der Eigenschaft BLUE; der Standardwert ist False.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Установка объекта OBJ_FIBO Уровни Фибоначчи.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - массив цветов линий                                                |
//|    st - массив стилей линий                                                |
//|    wd - массив ширин линий                                                 |
//|    fl - массив уровней Фибоначчи                                           |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - не луч)                        |
//+----------------------------------------------------------------------------+
void SetFibo(color& cl[], int& st[], int& wd[], double& fl[], string nm="",
             datetime t1=0, double p1=0, datetime t2=0, double p2=0,
             bool ry=False) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;

  int i, k=ArraySize(fl);

  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_FIBO, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1     , t1);
  ObjectSet(nm, OBJPROP_PRICE1    , p1);
  ObjectSet(nm, OBJPROP_TIME2     , t2);
  ObjectSet(nm, OBJPROP_PRICE2    , p2);
  ObjectSet(nm, OBJPROP_COLOR     , cl[0]);
  ObjectSet(nm, OBJPROP_RAY       , ry);
  ObjectSet(nm, OBJPROP_STYLE     , st[0]);
  ObjectSet(nm, OBJPROP_WIDTH     , wd[0]);
  ObjectSet(nm, OBJPROP_LEVELCOLOR, cl[1]);
  ObjectSet(nm, OBJPROP_LEVELSTYLE, st[1]);
  ObjectSet(nm, OBJPROP_LEVELWIDTH, wd[1]);
  if (k>0) {
    ObjectSet(nm, OBJPROP_FIBOLEVELS, k);
    for (i=0; i<k; i++) {
      ObjectSet(nm, OBJPROP_FIRSTLEVEL+i, fl[i]);
      ObjectSetFiboDescription(nm, i, DoubleToStr(100*fl[i], 1));
    }
  }
}
Im Anhang finden Sie ein Skript zum Testen der Funktion SetFibo().
Dateien:
 

GetLastThreeExtremumZZ() Funktion.

Sucht nach den letzten drei Extrema des ZigZag und gibt deren Werte zurück: Taktnummer und Preisniveau für jedes Extremum. Alle diese Daten sind in einem zweidimensionalen Array enthalten, das als Parameter an die Funktion übergeben wird. Hier finden Sie die gesamte Liste der Funktionsparameter:

  • zz - zweidimensionales Array von ZigZag-Werten. Die Taktnummern werden in die erste Spalte und die Preiswerte in die zweite Spalte eingetragen. Die Array-Dimension sollte zz[3,2] sein.
  • sy - Name des Instruments. "" oder NULL - aktuelles Symbol. Der Standardwert ist NULL.
  • tf - Zeitrahmen. Standardwert 0 - aktuelles Symbol.
  • dp, dv, bs - ZigZaga-Parameter: ExtDepth, ExtDeviation, ExtBackstep.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Возвращает последние три экстремума ЗигЗага.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    zz - двумерный массив значений ЗигЗага                                  |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
bool GetLastThreeExtremumZZ(double& zz[][], string sy="", int tf=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double z;
  int i, k=iBars(sy, tf), ke=0;
  ArrayInitialize(zz, 0);

  for (i=0; i<k; i++) {
    z=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (z!=0) {
      zz[ke][0]=i;
      zz[ke][1]=NormalizePrice(z, sy);
      ke++;
      if (ke>3) return(True);
    }
  }
  Print("GetLastThreeExtremumZZ(): Недостаточно баров!");
  return(False);
}

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

 

Die Funktion NumberOfOrdersByPrice().

Gibt die Anzahl der Aufträge zurück, die zu einem bestimmten Preisniveau eingestellt wurden. Sie können die Liste der zu prüfenden Aufträge mit Funktionsparametern einschränken:

  • sy - Bezeichnung des Marktinstruments. Wenn dieser Parameter angegeben wird, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet aktuelles Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Art des Geschäfts, 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.
  • pp - Das Preisniveau, auf das der Auftrag festgelegt wird. Der Standardwert von -1 ist ein beliebiger Preis.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.03.2012                                                     |
//|  Описание : Возвращает количество ордеров, установленных по заданной цене. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
int NumberOfOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
  int d, i, k=OrdersTotal(), ko=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()>1 && OrderType()<6) {
          d=MarketInfo(OrderSymbol(), MODE_DIGITS);
          pp=NormalizeDouble(pp, d);
          if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
            if (mn<0 || OrderMagicNumber()==mn) ko++;
          }
        }
      }
    }
  }
  return(ko);
}

 

Die Funktion NumberOfLastLossPosFromDate().

Diese Funktion liefert die letzte Serie von Verlustpositionen (Anzahl in einer Reihe), die seit einem bestimmten Datum geschlossen wurden. Eine genauere Auswahl der zu berücksichtigenden Positionen wird über externe Parameter festgelegt:

  • sy - Bezeichnung des Marktinstruments. Wenn dieser Parameter gesetzt ist, berücksichtigt die Funktion nur Positionen dieses Instruments. Der Standardwert -" bedeutet ein beliebiges Marktinstrument. NULL bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
  • dt - Datum und Zeit in Sekunden seit 1970. Standardwert - 0 bedeutet, dass alle in der Vergangenheit verfügbaren Positionen berücksichtigt werden.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 14.03.2012                                                     |
//|  Описание : Возвращает последнюю серию убыточных позиций                   |
//|             (количество подряд), закрытых с определённой даты.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDate(string sy="", int op=-1, int mn=-1, datetime dt=0) {
  int i, k=OrdersHistoryTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              if (OrderProfit()<0) kp++; else kp=0;
            }
          }
        }
      }
    }
  }
  return(kp);
}

 

Die Funktion ClosePosExceptTicket().

Diese Funktion schließt alle Positionen zum Marktpreis, außer derjenigen mit dem übergebenen Ticket. Eine genauere Auswahl der zu schließenden Positionen wird durch externe Parameter festgelegt:

  • sy - Name des Instruments. Wenn dieser Parameter gesetzt ist, prüft die Funktion die Positionen nur für das angegebene Instrument. NULL bedeutet das aktuelle Instrument, während "" (standardmäßig) ein beliebiges Instrument bedeutet.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Standardwert -1 - eine beliebige MagicNumber.
  • ti - Ticket zur Position. Standardwert 0 - beliebiges Ticket.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.03.2009                                                     |
//|  Описание : Закрытие позиций по рыночной цене за исключением одной,        |
//|           :  с переданным тикетом.                                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ti - тикет позиции              ( 0   - любой тикет)                    |
//+----------------------------------------------------------------------------+
void ClosePosExceptTicket(string sy="", int op=-1, int mn=-1, int ti=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ti==0 || ti!=OrderTicket()) ClosePosBySelect();
          }
        }
      }
    }
  }
}

 

GetChangeBalance() Funktion.

Liefert nicht handelsbezogene Saldenänderungen (Einzahlungen, Abhebungen, interne Überweisungen, Zinsabgrenzungen, Boni) ab einem bestimmten, als Parameter übergebenen Datum.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2010                                                     |
//|  Описание : Возвращает неторговое изменение баланса с определённой даты    |
//|             (пополнения, снятия, внутренние переводы).                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - Дата и время в секундах с 1970 года  (0 - с начала истории)        |
//+----------------------------------------------------------------------------+
double GetChangeBalance(datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderType()==6) {
      if (dt<OrderCloseTime()) p+=OrderProfit();
    }
  }
  return(p);
}