btw. Informacje z raportów można wyciągnąć stąd - IReportPosition -
Kod: Zaznacz cały
long to = System.currentTimeMillis();
long from = to - 5 * Period.MONTHLY.getInterval(); // np 5 miesięcy do tyłu
for ( IReportPosition m : context.getReportService().getClosedPositions(from, to) ) {
console.getOut().println( m.getPositionId() + " " + m.isLong() + " " + m.getInstrument() + " " + m.getSwaps() + " " + m.getCommission() );
}
I można zsumować ze sobą wszystkie wartości wg swapów, prowizji, itd jak w funkcji getCommission. A jak można policzyć swap, bo jest domyślnie w walucie bazowej? Można pobrać takie wartości
https://www.dukascopy.com/client/javado ... ition.html i jest cena zamknięcia getClosePrice() więc można to przemnożyć i przekonwertować na walutę główną konta z tego
https://www.dukascopy.com/wiki/en/devel ... sion-utils to jest 1 linia kodu utils.getRate(JFCurrency.getInstance("JPY"), JFCurrency.getInstance("CHF")); i można pobierać kurs danej pary np AUDPLN, PLNJPY itp.
Kod: Zaznacz cały
package jforex;
import java.util.*;
import com.dukascopy.api.*;
public class _my_own_statement implements IStrategy {
private IEngine engine;
private IConsole console;
private IHistory history;
private IContext context;
private IIndicators indicators;
private IUserInterface userInterface;
public void onStart(IContext context) throws JFException {
this.engine = context.getEngine();
this.console = context.getConsole();
this.history = context.getHistory();
this.context = context;
this.indicators = context.getIndicators();
this.userInterface = context.getUserInterface();
}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instrument, ITick tick) throws JFException {}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
// zwraca wartosc kosztow prowizji
console.getOut().println( "suma prowizji wynosi: " + getCommission(period) );
// jak wyciagnac inne dane
long to = System.currentTimeMillis();
long from = to - 5 * Period.MONTHLY.getInterval(); // 5 miesiecy do tylu, mozna wpisac 12 lub inną date ale to tylko wersja pokazowa
for ( IReportPosition m : context.getReportService().getClosedPositions(from, to) ) {
console.getOut().println( m.getPositionId() + " " + m.isLong() + " " + m.getInstrument() + " " + m.getSwaps() + " " + m.getCommission() );
}
// gdy zwrocilo wszystkie dane zatrzymaj strategie
context.stop();
}
public double getCommission(Period period) throws JFException {
long to = System.currentTimeMillis();
long from = to - 5 * Period.MONTHLY.getInterval();
double x = 0;
for ( IReportPosition m : context.getReportService().getClosedPositions(from, to) ) {
String str = m.getCommission().toString();
String res = "";
char p = str.charAt(str.length()-3);
char l = str.charAt(str.length()-2);
char n = str.charAt(str.length()-1);
if (Character.toString(p).equals("P") && Character.toString(l).equals("L") && Character.toString(n).equals("N")) {
res = str.substring(0, str.length()-3);
x = x += Double.parseDouble(res);
}
}
//console.getOut().println( x + " " + res);
return x;
}
}
I w konsoli zwróci pare przykładowych info z transakcji za ostatnie 5 miesięcy, na końcu jest wyliczenie funkcji getCommision i suma prowizji -83.61000000000003 ( to są moje trejdy z demo z paru ostatnich dni ) i potem zatrzyma strategie context.stop()
Kod: Zaznacz cały
2018-02-01 00:00:10 151526197 false GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151223340 false EUR/USD 0.00 USD -14.12 PLN
2018-02-01 00:00:10 151526301 true GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151526299 true GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151479417 false FRA.IDX/EUR 0.00 EUR -2.48 PLN
2018-02-01 00:00:10 151525442 false GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151196741 false EUR/USD 0.00 USD -7.00 PLN
2018-02-01 00:00:10 151526001 false GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151526442 true GBP/USD 0.00 USD -3.40 PLN
2018-02-01 00:00:10 151211179 false EUR/USD 0.00 USD -6.99 PLN
2018-02-01 00:00:10 151218250 true EUR/USD 0.00 USD -14.12 PLN
2018-02-01 00:00:10 151479431 false FRA.IDX/EUR 0.00 EUR -2.48 PLN
2018-02-01 00:00:10 151212621 true EUR/USD 0.00 USD -14.04 PLN
2018-02-01 00:00:10 151526293 true GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 151479429 false FRA.IDX/EUR 0.00 EUR -2.48 PLN
2018-02-01 00:00:10 151216593 false EUR/USD 0.00 USD -14.12 PLN
2018-02-01 00:00:10 151525441 true GBP/USD 0.00 USD -0.34 PLN
2018-02-01 00:00:10 suma prowizji wynosi: -83.61000000000003
Teraz to jest niepotrzebne, ale przy kolejnym wypełnianiu pita pewnie może się przydać bo faktycznie te standardowe raporty są toporne do liczenia...
-- 12 maja 2018, 13:58 --
Jeszcze tylko coś dodam, bo może za te kilka miesięcy ktoś też tym się będzie zajmował, chociaż wątpię... Chyba niemożliwe jest sprawdzenie wartości przez equlas porównując np tick.getTime() i czas zamknięcia pozycji. Są jednak różnice w testerze w czasie. Przykładowe wyliczenia dla czasu zamknięcia pozycji o 03-5-2018 10:25:45, w milisekundach jest to wartość z tej listy wyżej 1525343145000
(tick time) 1525343145001 (closed position time) 1525343145000 | (tick time > closed position time) false
(tick time) 1525343144846 (closed position time) 1525343145000 | (tick time > closed position time) true
Jest różnica zaledwie 0000000000001 dlatego wygenerowanie takiego raportu będzie możliwe przez puszczenie testu historycznego za rok wstecz i przeskanowanie czasu dla każdej zamkniętej pozycji i dopiero na koniec testu wygenerowałoby taki raport ?! Nie wiem jak to można inaczej rozwiązać... Ale to tylko tak przy okazji o tym pisze. W raportach na bieżąco jest to sprawdzane i na bieżąco są zbierane dane.
-- 12 maja 2018, 14:14 --
Sorry za ten offtop i troche spamu, ale może ktoś za jakiś czas też to będzie rozkminiał, więc wrzuce jeszcze ten kod i wynik. Pozycja była zamknięta o 10:25:45 3.05.2018 czyli 1525343145000
Kod: Zaznacz cały
public void onTick(Instrument instrument, ITick tick) throws JFException {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(1525343145000L);
//console.getOut().println( sdf.format(calendar.getTime()) );
Long T = new Long(tick.getTime());
Long L = new Long("1525343145000");
console.getOut().println( T + " " + L + " | " + (T < L));
if (T > L) {
//console.getOut().println( sdf.format(calendar.getTime()) + " " + sdf.format(tick.getTime()) );
console.getOut().println( sdf.format(T) + " " + sdf.format(L) );
context.pause();
}
}
I w konsoli dostaje wyniki:
2018-05-03 10:25:46 03-5-2018 10:25:46 03-5-2018 10:25:45
2018-05-03 10:25:46 1525343146637 1525343145000 | false << kolejny tick gdzie czas jest już większy, już 10:25:46
2018-05-03 10:25:45 03-5-2018 10:25:45 03-5-2018 10:25:45
2018-05-03 10:25:45 1525343145001 1525343145000 | false << wartość nie jest równa, różnica 0000000000001
2018-05-03 10:25:44 1525343144846 1525343145000 | true
2018-05-03 10:25:43 1525343143861 1525343145000 | true
2018-05-03 10:25:43 1525343143756 1525343145000 | true
2018-05-03 10:25:42 1525343142803 1525343145000 | true
2018-05-03 10:25:40 1525343140653 1525343145000 | true
-- 12 maja 2018, 14:14 --
Ok, to wszystko.