JAK TO UGRYŹĆ

O jezykach programowania w platformach i nie tylko.
JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: JAREK67 »

z6yszko pisze:A co będzie jeśli wyłączysz platformę?
Tu się zgadzam. Wtedy jest problem. Ale nadal nie rozumiem twojej koncepcji.

karus123
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 07 lis 2007, 00:32

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: karus123 »

No to mi namieszaliście teraz już zupełnie zgłupiałem. Moja koncepcja zakładała fizyczne zapisanie poziomu początkowego balance między innymi z powodu możliwości wyłączenia platformy itp. I właśnie z tym mam problem jak to zapisać i gdzie oraz jak potem EA ma się do tego odnosić czyli korzystać z tej zapisanej wartości. Takie rozwiązanie jest najprostsze bo wystarczy potem od aktualnego equity odjąć tą wartość i mamy nasz zysk. To co proponujesz wymaga zbudowania całego algotytmu czyli skomplikowania sprawy ale nie wiem być może w MQL nie ma możliwości by to zrobić tak jak opisałem.

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: z6yszko »

Witam ponownie. Wreszcie znalazłem trochę czasu żeby odpowiedzieć. Moja koncepcja obliczenia equity_start opiera się na następujących założeniach:
- po pierwsze: należy zabezpieczyć się przed koniecznością restartu platformy. Gdyby zostały otwarte pozycje, to wtedy przyjęcie jako punktu początkowego AccountEquity() przy otwartych stratnych pozycjach doprowadzi do możliwości zamknięcia na stracie (jeśli tylko equity wzrośnie o zakładaną wartość). Gdy natomiast przyjmiemy balance, to możemy mieć zbyt wysoko ustawioną poprzeczkę (bo wcześniej zamykasz część zyskownych pozycji). Myślę karus że wiesz o co chodzi.
- po drugie: zakładam że strategię można odpalić na różnych parach. Dlatego od equity odejmowałem bieżący profit z pozycji z wybranej pary.

Ale wpadł mi do głowy jeszcze łatwiejszy sposób. Można zapisać bieżący stan konta na przyszłość, a potem w razie restartu platformy odczytać to w funkcji init(). Można to zrobić przez zapisanie do pliku (funkcje obsługi plików: FileOpen, FileWriteDouble). Ja jednak polecam wykonanie tego poprzez komentarz.

Kod: Zaznacz cały

if (isOpen() == false) {
	equity_start = AccountEquity();
	comment = DoubleToStr(equity_start, Digits);
}
...
ticket = OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, comment, MagicNumber, 0, Red);
Oczywiście jeśli nie będziesz uruchamiał stragegii na różnych wykresach ani grał "z ręki", to można przyjąć equity_start=AccountBalance().

W funkcji init() należy odczytać equity_start jeśli jest otwarta jakaś pozycja:

Kod: Zaznacz cały

if (isOpen() == true) {
	equity_start = EquityStart();
}
A funkcja EquityStart() powinna wyglądać następująco:

Kod: Zaznacz cały

double EquityStart() {
	for (int i = OrdersTotal()-1; i >= 0; i--) {
     	OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
     	if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber) && (OrderType() == OP_BUY || OrderType() == OP_SELL)) {
     		return (StrToDoubleOrderComment()));
     	}
	}
	return (0);
}
Potem obliczasz czy wartość konta wzrosła w sposób który opisałem w pierwszej odpowiedzi. Mam nadzieję że teraz pomogłem. Jeśli chcesz, to mogę jeszcze załączyć kod funkcji isOpen(), ale jest dość prosta więc na razie nie mieszam.

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: JAREK67 »

Pomijając brak lewegu nawiasu w

Kod: Zaznacz cały

 return (StrToDouble(OrderComment()));
to bardzo fajny pomysł. :564:

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: z6yszko »

Pisałem z ręki :)
Dzięki Jarek.

karus123
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 07 lis 2007, 00:32

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: karus123 »

Dzięki Panowie zdecydowanie należy wam się pochwała. Chodziło mi tylko o sam sposob zapisania tego gdzieś a potem korzystania z tej zapisanej wartości z resztą sobie poradzę.

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: CoVal »

z6yszko pisze:Witam ponownie. Wreszcie znalazłem trochę czasu żeby odpowiedzieć. Moja koncepcja obliczenia equity_start opiera się na następujących założeniach:
- po pierwsze: należy zabezpieczyć się przed koniecznością restartu platformy. Gdyby zostały otwarte pozycje, to wtedy przyjęcie jako punktu początkowego AccountEquity() przy otwartych stratnych pozycjach doprowadzi do możliwości zamknięcia na stracie (jeśli tylko equity wzrośnie o zakładaną wartość). Gdy natomiast przyjmiemy balance, to możemy mieć zbyt wysoko ustawioną poprzeczkę (bo wcześniej zamykasz część zyskownych pozycji). Myślę karus że wiesz o co chodzi.
- po drugie: zakładam że strategię można odpalić na różnych parach. Dlatego od equity odejmowałem bieżący profit z pozycji z wybranej pary.

Ale wpadł mi do głowy jeszcze łatwiejszy sposób. Można zapisać bieżący stan konta na przyszłość, a potem w razie restartu platformy odczytać to w funkcji init(). Można to zrobić przez zapisanie do pliku (funkcje obsługi plików: FileOpen, FileWriteDouble). Ja jednak polecam wykonanie tego poprzez komentarz.
Panowie, pewnie mozna to zrobic wlasnie w taki sposob jak tu sugeruje z6yszko, jednakze po co wyczyniac takie karkolomne woltyzerki ?
Nie prosciej zapisac te dane po prostu do zmiennych globalnych - tam nie zostana usuniete bez wzgledu na ilosc resetow platformy przez okres 4 tygodni....

Zapisujemy przy pomocy:

Kod: Zaznacz cały

string  global.var.name = "equ_"+Symbol();   // w ten sposob tworzymy unikalna zmienna dla kazdej pary
double equity.on.start = AccountEquity();
GlobalVariableSet(global.var.name,equity.on.start);
Pobieramy z przestrzeni zmiennych globalnych przy pomocy:
GlobalVariableGet(global.var.name);i usuwamy stosujac: GlobalVariableDel(global.var.name);

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: JAK TO UGRYŹĆ

Nieprzeczytany post autor: z6yszko »

Dobrze poznać nową technikę. Dzięki CoVal.
Byłem pewien że zmienne globalne są kasowane w momencie zamknięcia platformy, nie wiedziałem że są zapisywane na dysku.

ODPOWIEDZ