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.