Caratteristiche utili da KimIV - pagina 107

 
143alex:

Non avete (pronto e disposto a comprare)))) lo stesso ma per lavorare con excel?

no, non disponibile... )))

 

La funzione GetPotentialLossInCurrency() restituisce la perdita potenziale totale delle posizioni aperte nella valuta di deposito. Il calcolo viene eseguito in base al prezzo di apertura della posizione e al livello di prezzo StopLoss. Se StopLoss non è impostato per nessuna posizione, questa funzione restituisce il capitale corrente del conto di trading.

La funzione GetPotentialLossInCurrency() accetta i seguenti parametri:

  • sy - Nome dello strumento. Se impostiamo questo parametro, la funzione controllerà solo le posizioni dello strumento specificato. NULL significa strumento corrente, mentre "" (default) significa qualsiasi strumento.
  • op - Operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Valore predefinito -1 - significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Il valore predefinito -1 significa qualsiasi 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);
}

In allegato c'è uno script per testare la funzione GetPotentialLossInCurrency().

 

Ciao Igor. Complimenti a voi per la vostra serie di funzioni molto utili.

Posso chiederti un aiuto... Voglio fare una specie di armadietto parziale. Ma finora non so come organizzarlo. L'idea è questa:

Ci sono 4 - ordini diciamo -200$ -175$ -150$ e -25$ e ci sono 5+ ordini per un totale di +400$

Se 400 > -200+-175 ma meno di -200+-175+-150 allora chiudi 5 ordini più e meno -200 -175, cioè 2 ordini con una perdita da più a meno.

questo esempio è piuttosto rozzo ma credo di aver reso l'idea...

Il primo problema è che ho bisogno di qualcosa per scriverli. (Non capisco bene Array) o trovare qualche altro modo.

Il 2° problema segue il primo. Supponiamo che io abbia los[x] con lotti di 4 ordini diversi... devo caricare i lotti ( los[x]) in un modulo che cercherà il tiket in base al prezzo o devo aggiungere 1 (los[price]) e 2 (los2[tiket]) mentre ordino i lotti?

Forse puoi indicarmi un posto dove puoi farlo o insegnarmi qualcosa che non so fare =)

 

Probabilmente ogni trader prima o poi inizia a calcolare il numero di pips rimanenti prima che il deposito sia perso. Il calcolo è semplice: prendiamo il denaro, lo dividiamo per il numero di lotti nel mercato, per il valore del punto e otteniamo la risposta che stiamo cercando. Questo è esattamente ciò che fa la mia nuova funzione ReserveDepositInPoint(), che prende i seguenti parametri:

  • sy - Nome dello strumento. Se impostate questo parametro, la funzione controllerà le posizioni solo dello strumento specificato. NULL significa lo strumento corrente, mentre "" (di default) significa qualsiasi strumento.
  • op - Operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Valore predefinito -1 - significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Il valore predefinito di -1 significa qualsiasi MagicNumber.

La funzione ReserveDepositInPoint() gestisce correttamente le posizioni opposte, cioè calcola la differenza tra i lotti Sell e Buy e usa esattamente questa differenza nei calcoli. I calcoli sono basati sul capitale, cioè si suppone che lo stopout sia del 100%. Swap, tasse e commissioni non sono considerate.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

In allegato un Expert Advisor per controllare la funzione ReserveDepositInPoint().

 

Funzione SetFibo().

Questa funzione imposta i livelli di Fibonacci dell'oggetto OBJ_FIBO sul grafico corrente.

  • cl - Array di colori dell'oggetto Livelli di Fibonacci. Parametro obbligatorio. Due elementi. Il primo imposta il colore dell'oggetto, il secondo - il colore delle linee dei livelli.
  • st - Array di stili di oggetti livelli di Fibonacci. Parametro richiesto. Due elementi. Il primo imposta lo stile dell'oggetto, il secondo - lo stile delle linee dei livelli.
  • wd - Array di larghezze dioggetti livelli di Fibonacci. Parametro richiesto. Due elementi. Il primo imposta la larghezza dell'oggetto, il secondo - le larghezze delle linee dei livelli.
  • fl - Matrice di livelli di Fibonacci. Parametro richiesto.
  • nm - Nome dell'oggetto. Quando viene passato il valore predefinito - "", il tempo di apertura della barra corrente viene usato come nome.
  • t1 - Prima coordinata del tempo di impostazione dell'oggetto. Valore predefinito - 0 - tempo di apertura della decima barra.
  • p1 - Prima coordinata dell'oggetto che fissa il prezzo. Valore predefinito - 0 - minimo della decima barra.
  • t2 - Seconda coordinata del tempo di impostazione dell'oggetto. Valore predefinito - 0 - tempo aperto della barra corrente.
  • p2 - Seconda coordinata dell'oggetto che fissa il prezzo. Valore predefinito - 0 - barra corrente bassa.
  • ry - Flag della proprietà BLUE. Il valore predefinito è 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));
    }
  }
}
In allegato c'è uno script per testare la funzione SetFibo().
File:
 

Funzione GetLastThreeExtremumZZ().

Esegue la ricerca degli ultimi tre estremi dello ZigZag e restituisce i loro valori: numero di barra e livello di prezzo per ogni estremo. Tutti questi dati sono contenuti in un array bidimensionale che viene passato come parametro alla funzione. Ecco la lista completa dei parametri della funzione:

  • zz - array bidimensionale di valori ZigZag. I numeri delle barre sono aggiunti alla prima colonna, e i valori dei prezzi sono aggiunti alla seconda colonna. La dimensione dell'array dovrebbe essere zz[3,2].
  • sy - Nome dello strumento. "" o NULL - simbolo corrente. Il valore predefinito è NULL.
  • tf - Timeframe. Valore predefinito 0 - simbolo corrente.
  • dp, dv, bs - Parametri ZigZaga: 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);
}

In allegato c'è uno script per testare la funzione GetLastThreeExtremumZZ().

 

La funzione NumberOfOrdersByPrice().

Restituisce il numero di ordini impostati ad un dato livello di prezzo. Puoi limitare la lista degli ordini da controllare con i parametri della funzione:

  • sy - Nome dello strumento di mercato. Se questo parametro è dato, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Tipo di commercio, tipo di ordine pendente. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 indica qualsiasi tipo di ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito di -1 significa qualsiasi MagicNumber.
  • pp - Il livello di prezzo a cui è impostato l'ordine. Il valore predefinito di -1 è qualsiasi prezzo.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

 

La funzione NumberOfLastLossPosFromDate().

Questa funzione restituisce l'ultima serie di posizioni perdenti (numero in una riga) chiuse da una certa data. Una selezione più accurata delle posizioni da prendere in considerazione è specificata utilizzando parametri esterni:

  • sy - Nome dello strumento di mercato. Se questo parametro è impostato, la funzione considererà solo le posizioni di questo strumento. Il valore predefinito -" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
  • dt - Data e ora in secondi dal 1970. Valore predefinito - 0 significa che tutte le posizioni disponibili nella storia sono prese in considerazione.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

 

La funzione ClosePosExceptTicket().

Questa funzione chiude tutte le posizioni al prezzo di mercato tranne quella con il biglietto passato. Una selezione più accurata delle posizioni da chiudere è specificata da parametri esterni:

  • sy - Nome dello strumento. Se questo parametro è impostato, la funzione controlla le posizioni solo per lo strumento specificato. NULL significa lo strumento corrente, mentre "" (default) significa qualsiasi strumento.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Valore predefinito -1 - qualsiasi MagicNumber.
  • ti - Biglietto per la posizione. Valore predefinito 0 - qualsiasi biglietto.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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();
          }
        }
      }
    }
  }
}

 

Funzione GetChangeBalance().

Restituisce i cambiamenti di bilancio non commerciali (depositi, prelievi, trasferimenti interni, interessi maturati, bonus) da una certa data passata come parametro.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}