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().
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 oggettilivelli 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 dioggettilivelli 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().
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.
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);
}
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);
}
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();
}
}
}
}
}
}
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);
}
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:
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:
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.
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.
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:
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:
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:
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:
Funzione GetChangeBalance().
Restituisce i cambiamenti di bilancio non commerciali (depositi, prelievi, trasferimenti interni, interessi maturati, bonus) da una certa data passata come parametro.