Odbicie zysków i strat

Anonim

W wielu strategiach handlowych, istnieją przepisy, które nie pozwalają, aby otworzyć nową transakcję, jeśli istnieje co najmniej jeden z nich nie jest ustawiony poziom StopLoss od . Również częste system obrotu, w którym otwarcie nowych transakcji jest niemożliwe tak długo, jak istnieje co najmniej jeden otwór transakcji, w celu zatrzymania, które mogą być straty. E. Dopóki „nogi” są albo nieobecne lub są na minusie na specyficzne lub dla wszystkich transakcji ogółem.

Oceń ten rozwój (stosunek zysk / strata być odbierane w przypadku zamknięcia stoploss ofert cenowych) nie jest trudne, jeśli liczba otwartych transakcji jest stosunkowo niewielka. W przypadku dużej liczby otwartych transakcji rachunkowość ta stanowi wymierny problem. Uzasadnione jest przesunięcie obliczenie tej wartości na ramionach bezdusznej maszynie, w naszym przypadku - do MQL-robota .

Oto dwie wersje funkcji, które mogą rozwiązać ten problem.

Opcja Funkcja Trading Robots

Pierwsza wersja funkcji jest przeznaczony do stosowania w robotach handlowych. Funkcja zwraca podwójną wartość. To pokazuje, łączna kwota zysku / straty do otrzymania w przypadku zamknięcia wszystkich transakcji na obecnych poziomach StopLoss.Jeśli istnieje co najmniej jedna transakcja z poziomu nieokreślony od StopLoss o>, funkcja zwraca wartość - 1. 1111 . Funkcja ma dwa parametry wejściowe: magia (magiczna liczba; 0 - Zamówienia z dowolną liczbą magiczną przetwarzanie) oraz Symbol (symbol; BRAK - przetwarzania zamówień dowolnych znaków).

Kod funkcji:

double profit_from_sl (int magia, symbol string) {

/ * Zwraca wartość zysków, jakie można osiągnąć, jeśli transakcja zostanie zamknięta na obecnych poziomach StopLoss. Jeśli jest co najmniej jedno zamówienie z niezapisanym zatrzymaniem, zwraca -1. 1111

magiczne - liczby magiczne (0 - przetwarzanie transakcji z każdym ze MagicNumber)

Symbol - symbol (brak - przetwarzanie wszystkich cech) * /

int i = 0,

r_digits = 0;

podwójny zysk = 0; 0;

for (i = OrdersTotal () - 1, i> = 0; i-) {, jeśli przerwa; (! OrderSelect (I SELECT_BY_POS, MODE_TRADES))

if (OrderStopLoss () == 0) // jeśli jest sprawa nie jest ustawiona, Return poziomie -1 SL. 1111

{return (-1.1111);

przerwa;

} // end

if (OrderStopLoss () == 0)

if (((OrderMagicNumber () == magia) || (magic == 0)) && ((OrderSymbol () == symbol) || (symbol == »NIE»))) {

r_digits = MarketInfo (OrderSymbol () MODE_DIGITS);

if (OrderType () == OP_SELL)

zysk + = (NormalizeDouble ((OrderOpenPrice () - OrderStopLoss ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ();

if (OrderType () == OP_BUY)

zysk + = (NormalizeDouble ((OrderStopLoss () - OrderOpenPrice ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ()} // koniec

if (((OrderMagicNumber () == magiczne) || (magiczne == 0)) && ((OrderSymbol () == symbol) || (symbol == »NIE»)))} // koniec

for (i = OrdersTotal () - 1, i> = 0; i -)

powrotu (NormalizeDouble (zysk, 2));} // end

profit_from_sl (int magia, symbol string)

Zatem wartości, które są uzyskiwane na wyjściu, może być stosowany w robotach handlowych do analizy wielkości zysku / straty który zostanie odebrany podczas zamykania transakcji na obecnym poziomie StopLoss.

funkcja do wyświetlania zysk / strata z bieżących zleceń stop

Drugie funkcje wykonań przeznaczone do wizualnego wyświetlania wartości zysku / straty, które zostaną otrzymane na obecnym przystanku.Funkcja zwraca łańcuch wartości: rozszerzony lub krótki komentarz. Ma ona trzy parametry wejściowe:

magiczne (numer magiczny; 0 - Przetwarzanie zlecenia z dowolną liczbą magiczną) Symbol (symbol; BRAK - przetwarzania zamówień dowolnych znaków) i Tryb (tryb wyjścia: 1 - krótkie, 2 - pełne). Funkcja Kod: profit_from_sl ciąg (int magii, symbol ciąg, tryb int) {

/ * Zwraca zysku / straty, które byłyby otrzymane jeśli transakcja zostanie zamknięta na obecnym poziomie stoploss.

magic - magiczna liczba (0 - przetwarzanie transakcji z dowolnego MagicNumber); Symbol

- symbol (NONE - przetwarzanie wszystkich symboli); Tryb

- (tryb wyjścia: 1 - krótki, 2 - pełny). * /

int i = 0,

r_digits = 0;

podwójny zysk = 0. 0,

profit_this = 0. 0;

string text = «»,

text_full = «»;

for (i = OrdersTotal () - 1, i> = 0; i -)

{, jeśli nadal; (! OrderSelect (I SELECT_BY_POS, MODE_TRADES))

if (OrderStopLoss () == 0) // jeśli znajdzie co najmniej jedną ofertę, bez przesiadek, a następnie ocenić zysk / strata jest niemożliwe.

{

wartość text = »zysk / strata nie może być ustalona, ​​to Stop Loss na”

+ OrderSymbol () + »(bilet:«+ OrderTicket () +»).. Nie określono”;

text_full = tekst;

break;} // koniec

if (OrderStopLoss () == 0)

if (((OrderMagicNumber () == magiczne) || (magiczne == 0)) && ((OrderSymbol () == symbol) || (symbol == »NIE»)))

{

r_digits = MarketInfo (OrderSymbol () MODE_DIGITS);

if (OrderType () == OP_SELL)

profit_this = (NormalizeDouble ((OrderOpenPrice () - OrderStopLoss ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ();

if (OrderType () == OP_BUY)

profit_this = (NormalizeDouble ((OrderStopLoss () - OrderOpenPrice ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ();

text_full = text_full + » n» + »Zysk (strata) na«+ OrderSymbol () +»(bilet:«+ OrderTicket () +») będzie”

+ DoubleToStr (profit_this, 2);

zysk + = profit_this;} // koniec

if (((OrderMagicNumber () == magiczne) || (magiczne == 0)) && ((OrderSymbol () == Symbol) || (symbol = = »BRAK»)))

} // end

for (i = OrdersTotal () - 1; i> = 0; i -)

if (tekst == »») text = »Razem zyskiem / stratą będzie "+ DoubleToStr (zysk, 2);

/ * if (! Zysk = profit_this) * /

text_full = text_full + » n» + »całkowity zysk / strata będzie« + DoubleToStr (zysk, 2);

if (mode == 1) return (text);

if (tryb == 2) zwrotny (text_full);} // koniec

profit_from_sl łańcuch (Int magiczne, symbolem ciąg int)

Najprostszym zastosowanie drugiej funkcji jest zmniejszona do wniosku, jego wynik operacji komentować ();.Będzie to wyglądać mniej więcej tak:

int init ()

{return (0);} // end

int init ()

int deinit ()

{return (0);} // end

int deinit ()

profit_from_sl string (int magia, symbol sznurek, tryb int)

{

/ * Zwraca wartość zysk / strata, którą uzyskuje się w przypadku, gdy transakcja zostanie sfinalizowana przez bieżące poziomy StopLoss.

magic - magiczna liczba (0 - przetwarzanie transakcji z dowolnego MagicNumber); Symbol

- symbol (NONE - przetwarzanie wszystkich symboli); Tryb

- (tryb wyjścia: 1 - krótki, 2 - pełny). * /

int i = 0,

r_digits = 0;

podwójny zysk = 0. 0,

profit_this = 0. 0;

string text = «»,

text_full = «»;

for (i = OrdersTotal () - 1, i> = 0; i -)

{, jeśli nadal; (! OrderSelect (I SELECT_BY_POS, MODE_TRADES))

if (OrderStopLoss () == 0) // jeśli znajdzie co najmniej jedną ofertę, bez przesiadek, a następnie ocenić zysk / strata jest niemożliwe…

{

text = »Wartość zysku (straty) można określić, że jest to Stop Loss na”

+ OrderSymbol () + »(bilet:«+ OrderTicket () +») nie jest zainstalowana »;

text_full = tekst;

przerwa;

} // end

if (OrderStopLoss () == 0)

if (((OrderMagicNumber () == magia) || (magic == 0)) && ((OrderSymbol () == symbol) || (symbol == »NIE»))) {

r_digits = MarketInfo (OrderSymbol () MODE_DIGITS);

if (OrderType () == OP_SELL)

profit_this = (NormalizeDouble ((OrderOpenPrice () - OrderStopLoss ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ();

if (OrderType () == OP_BUY)

profit_this = (NormalizeDouble ((OrderStopLoss () - OrderOpenPrice ()), r_digits)

/

MarketInfo (OrderSymbol () MODE_POINT) * OrderLots ()) * MarketInfo (OrderSymbol () MODE_TICKVALUE)

+

OrderSwap ();

text_full = text_full + » n» + »Zysk / strata na«+ OrderSymbol () +»(bilet:«+ OrderTicket () +») będzie”

+ DoubleToStr (profit_this, 2);

zysk + = profit_this;

} // end

if (((OrderMagicNumber () == magia) || (magic == 0)) && ((OrderSymbol () == symbol) || (symbol == »BRAK»)))

} // end

for (i = OrdersTotal () - 1; i> = 0; i -)

if (tekst == »») text = »całkowity zysk (strata) będzie "+ DoubleToStr (zysk, 2);

/ * if (! Zysk = profit_this) * /

text_full = text_full + » n» + »całkowity zysk (strata) będzie« + DoubleToStr (zysk, 2);

if (mode == 1) return (text);

if (mode == 2) return (text_full);

} // end

profit_from_sl string (int magia, symbol sznurek, tryb int)

int start () {

Komentarz (profit_from_sl (0, »BRAK», 2));

zwrotny (0);

} // koniec

Int start ()

// ---------------------- + +

Oczywiście, funkcja jest tylko ogólnym przypadkiem realizacji tego zadania.W rzeczywistych warunkach może wystąpić potrzeba nieco innego oszacowania poziomu StopLoss dla otwartych transakcji. Kody te mogą być traktowane jako podstawa do rozwiązania koniecznych problemów.