Skomplikowana funkcja.

O jezykach programowania w platformach i nie tylko.
Ribelo
Stały bywalec
Stały bywalec
Posty: 44
Rejestracja: 18 lut 2010, 20:28

Skomplikowana funkcja.

Nieprzeczytany post autor: Ribelo »

Tak na wstępie przedstawię do czego mi to, może dzięki temu będzie prościej rozwiązać mój problem.

Piramiduję dość mocno i gęsto w różnych miejscach zróżnicowanym lotem.

Próbuję zrobić funkcję, która by mi liczyła odległość stopa tak, by był odległości, w której stracę procent z zarabianych aktualnie w piramidzie pieniędzy.

Jednym słowem mam porozrzucane zlecenia z różnym lotem, na których aktualnie zarabiam, dajmy na to, 1000zł. Chcę mieć stopa w takim miejscu, by w razie czego stracić tylko 20% tej kwoty, czyli 200zł.

To co aktualnie udało mi się łopatologicznie wymyślić.

Sumuję przemnożony dystans przebyty przez zlecenie x przez wartość w lotach tego zlecenia. Mnożę tą wartość przez procent. Następnie punkt(broker 5 cyfrowy) po punkcie sprawdzam, czy w tej odległości zarabiam tyle, ile chciałbym zarabiać. Później tą ilość pipsów, którą naliczyłem dodaję do wartości BE całej piramidy.

Jednym słowem działa, ale w momencie, kiedy co tick liczymy punkt po punkcie odległość, to każdy komputer ma prawo zwolnić. Przy odległości 100 pipsów/punktów mamy pętlę wywoływana 1000x....na tick...na jednej parze walutowej...

Tak to aktualnie wygląda.

Kod: Zaznacz cały

double GetRequiredDistance ( double percent) { //wrzucamy procent
   double required.lot.distance = GetTotalLotDistance() * percent * 0.01;   //GetLotDistance zwraca sumę pips*lot wszystkich zleceń
   double calculated.lot.distance;
   double pip = 1 * global.multiplier * Point; // otrzymujemy najmniejszą wartość ceny dostępną u brokera.
   double step;
   double distance;
   
   while ( required.lot.distance >= calculated.lot.distance ) {
      step += pip; //co pętlę dodajemy pips //
      calculated.lot.distance = 0;
      for ( int i = last.order; i >= 0; i-- ) { // last.order jest numerem na liście ostatniego zlecenia -1 //
         if ( OrderSelect ( orders.var[i][0], SELECT_BY_TICKET, MODE_TRADES ) ) { // orders.var jest tablicą w których zapisane są wszelkie wartości każdego zlecenia. W tym wypadku czytujemy ticket.number według numeru.
            if ( OrderSymbol() == symbol ) {
               distance = + step;
               calculated.lot.distance += distance * OrderLots();
            }           
         }
      }
   }
   return(step); //zwracaną wartość dodajemy do BE piramidy //
}
Jakiekolwiek sugestie mile widziane.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Aktualny zysk ze wszystkich pozycji / wartość pipsa z pozycji = ilośc pipsów na zero

Aktualny zysk ze wszystkich pozycji * 0.20 / wartość pipsa z pozycji = ilość pipsów na stratę 20%

Ribelo
Stały bywalec
Stały bywalec
Posty: 44
Rejestracja: 18 lut 2010, 20:28

Nieprzeczytany post autor: Ribelo »

Niestety nie działa to tak. To było pierwsze co spróbowałem.

Aktualny zysk, jest to:
Ilość pipsów pozycji * Lot pozycji * wartość pipsa.

Nie muszę więc dzielić przez wartość pipsa, wystarzcy, że zsumuję:
Ilość pipsów pozycji * Lot pozycji.

W ten sposób mam cały zysk.

Inna sprawa, że problem chyba pojawia sie, kiedy na którejś pozycji tracę. Zmniejszając dystans nie uwzględniam tego, że mam funkcję paraboliczną. Po przekroczeniu cefnięciu się ceny poniżej ceny wejścia(dla longa), tracę z każdym pipsem.

Działałoby to, gdybym miał funkcję liniową, a nawet nie wiem co mam za funkcję.

Zwie się to co powinienem zrobić, chyba badaniem przebiegu funkcji. A to co ja aktualnie robię, to badam przebieg funkcji na piechotę, bo wiem jaki jest najmniejszy krok tej funkcji.

Być może coś mieszam, ale wydaje mi się, że dokładnie w ten sposób próbowałem to zrobić i odległość wychodziła albo za bardzo uśredniona, albo kosmiczna.

EDIT

Chyba Cię źle zrozumiałem. Muszę iść coś przetestować.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Licz do uśrednionej ceny wszystkich pozycji to rozwiązuje wiele problemów.

Ribelo
Stały bywalec
Stały bywalec
Posty: 44
Rejestracja: 18 lut 2010, 20:28

Nieprzeczytany post autor: Ribelo »

Dzięki, działa. Coś mi się wczoraj pomieszało i mnożąc przez procent wychodziły mi kosmiczne wartości. Dziś nie brałem poprawki, że mogłem coś wczoraj spieprzyć...a jednak. Już kiedyś sobie obiecywałem, że nie będę pisał po 2 w nocy :wink:

Dzięki.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Nie ma sprawy
Ribelo pisze: ... Dziś nie brałem poprawki, że mogłem coś wczoraj spieprzyć...a jednak. Już kiedyś sobie obiecywałem, że nie będę pisał po 2 w nocy :wink:

Dzięki.

Szczerze nie polecam. Ja najlepsze pomysły mam rano lub akurat jak robię coś zupełnie niezwiązanego z programowaniem

Awatar użytkownika
cf16
Stały bywalec
Stały bywalec
Posty: 33
Rejestracja: 27 sty 2012, 18:43

Nieprzeczytany post autor: cf16 »

(lot1*price1+lot2*price2+ ... +lotn*pricen)/(lot1+lot2+...+lotn) to jest cena po ktorej jestes kupiony/sprzedany zalezy czy suma lotow +/-.
ta cena -/+ ile pipsow na strate 20% przy tej sumie lotow = twoja cena.

ODPOWIEDZ