panel jforex tester offline

O jezykach programowania w platformach i nie tylko.
-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Jest to rozwinięcie tego widgetu ( http://forex-nawigator.biz/forum/next-t ... ml#p880362 ). Dodałem zapisanie wyników w CSV oraz Stop Loss. Opis niżej.
panel_beta2.png
Stop Loss

default stop loss - przesuwa Stop Loss o wartość domyślną SL ustawioną na początku przy uruchomieniu strategii, pobiera informacje z aktualnej ceny więc jeśli wartość domyślna SL to 20 pips wtedy będzie można do każdej ceny przesunąć o 20 pips tzn oddalić lub przybliżyć na taką odległość. Tutaj też zmienia realizacje zlecenia dla short po cenie BID, dla long po cenie ASK, domyślnie jest odwrotnie. Oraz grupuje wszystkie Stop Loss z otwartych pozycji w jedno.

set SL on last candle for SHORT - Przestawia SL nad ostanią świece i zmienia realizacje zlecenia po cenie BID. Jeśli klikniesz to dla pozycji długich to je zamknie. To jest tylko dla pozycji krótkich. Dlatego też wyróżniłem to kolorami.

set SL on last candle for LONG - Przestawia Stop Loss pod ostatnią świece i zmienia realizacje zlecenie po cenie ASK. Jeśli klikniesz to dla pozycji krótkich to je zamknie. To jest tylko dla pozycji długich. Dlatego też wyróżniłem to kolorami.

Można przestawiać tymi funkcjami SL pod ostatnią świece a potem wcisnąć "default stop loss" żeby odsunąć SL i potem znowu można szukać kolejnej świecy gdzie można w ten sposób zabezpieczyć zysk. Początkowa wartość Stop Loss jest ustawiana wg wartości którą wpiszemy jako wartość domyślna, więc jak damy 20 pips to policzy nam 20 pips dla każdego otwartego zlecenia które dodamy. Potem można kliknąć "default stop loss" i cała grupa SL-i zostanie połączona razem i będą wisieć po jednej cenie. Potem przestawia się całą grupe SL dla wszystkich otwartych pozycji tymi trzema funkcjami ( guzikami )

Zapisanie tradów jako plik CSV

Ścieżka do folderu tmp w Ubuntu /tmp/
Ścieżka dla Windows to chyba C:\\temp\\ - niestety nie mam Windowsa więc nie wiem jaka jest dokładnie ścieżka do folderu temp. Jest podany tutaj przykład na jforex wiki i jest tam ścieżka chyba dla Windows https://www.dukascopy.com/wiki/en/devel ... cks-in-csv
Trzeba ustawić ścieżce do folderu np temp inaczej pojawi się błąd w konsoli File write error. Tam po zakończeniu testów, naciśnięciu STOP powinien pojawić się plik, tylko przed zakończeniem testów trzeba kliknąć show orders, inaczej tego pliku z testów nie będzie w formie CSV w tym katalogu. Próbowałem zrobić automatyczny zapis po zakończeniu testów ale coś nie chce działać. Tak samo próbowałem co świece M5 robić zapis ale nie zapisuje mi ostatniej fazy zlecenia gdzie jest zamknięcie tylko historie od startu do świecy przed zamknięciem w interwale 5 minut. I musiałem to tak zostawić na razie, czyli trzeba kliknąć show orders w panelu, na dole w konsoli pojawi się lista pozycji i kiedy tak się stanie wtedy powinien pojawić się też plik w folderze. Najlepiej zwolnić tempo kiedy będziemy to robili i dać pause żeby sprawdzić czy ten plik tam jest zanim naciśniemy STOP.

Kolejny błąd jakiego nie rozwiązałem to złe grupowanie po ID, źle grupuje liczby po ID. Można to poprawić w excelu, posortować potem. Tak wygląda fragment z arkusza gdzie widać jak źle sortuje przy generowaniu ID.

id: label:
11 order1503585523379
12 order1503585524480
13 order1503585524674
14 order1503585524818
15 order1503585525002
16 order1503585525119
17 order1503585526733
18 order1503585526743
19 order1503585526871
1 order1503585519657
2 order1503585520280
3 order1503585520405
4 order1503585520570
5 order1503585521929
6 order1503585522101
7 order1503585522269
8 order1503585522982
9 order1503585523082
20 order1503585527052
10 order1503585523255

Informacje jakie są zapisywane w pliku CSV
id, label, instrument, order command, amount, fill time open price, close price, profit in pips, profit in USD, commission, profit in account currency, stop loss price, take profit price

Ponadto nie kasuje poprzednich wpisów z testu jeśli nie skasowaliśmy pliku po zakończeniu, tylko dopisuje kolejne wiersze do poprzedniego pliku. Więc jeśli nie skasowaliśmy poprzedniego pliku przed nowymi testami trzeba po prostu skasować poprzednie wiersze z pliku tj edytować arkusz.

To jeszcze nie to... Są kolejne błędy i niedociągnięcia do poprawy, ale w tej wersji jest Stop Loss i można go ustawiać na ostatniej świecy a potem ew. odsuwać jeśli coś nie będzie grało, i ponownie zabezpieczyć przesuwając na inną świece, więc już jest lepiej niż w poprzedniej wersji przynajmniej pod tym względem. Pewnie poprawie te błędy za jakiś czas, ale wrzucam to teraz, ponieważ jest tutaj Stop Loss i komuś się może przyda, jeśli z tego korzysta lub będzie korzystał...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Wrzuce to tutaj żeby nie śmiecić w dzienniku... Jednak można robić symulacje całego kapitału na kilku intrumentach ( http://forex-nawigator.biz/forum/od-100 ... ml#p884050 ). Wystarczy skopiować funkcje, instrument, indykator i w symulacji dodać 2 instrumenty, akurat tutaj dla testów jest skrypt https://www.dukascopy.com/wiki/en/devel ... stochastic oraz instrumenty EURUSD i USDJPY. Wygląda na to że symulacja na całym kapitale jest możliwa, skoro liczy trejdy z dwóch wykresów ( instrumentów ) dla całego depozytu.

To tylko informacja że takie rozwiązanie jest możliwe, ale nie będę modyfikował widget panel, chyba że ktoś będzie chciał żebym dodał np możliwość wyboru 4 instrumentów. Ale jeszcze sprawdze czy to faktycznie działa tak jak powinno.

-- Dodano: 18 wrz 2017, 09:01 --

Obrazek

Ten skrypt próbuje przerobić na coś takiego co analizuje cykle stochastic z M5 i M1 oraz ticks. Więc anlizowane będą 3 interwały. Następnie dodam do tego alarmy dźwiękowe i dzięki temu będę miał sygnały do zmiany trendu oraz wejścia i wyjścia z małym ryzykiem na wykresach tickowych. Skrypt może wtedy działać i sygnalizować setupy na demo jforex a grać można u innego brokera na MT4. No ale na razie to dopiero zacząłem robić taki skrypt który liczy cykle stocha. Robienie tego ręcznie wymaga skupienia i analizowania zbyt dużej liczby zmiennych, a sprowadzenie tego do sygnałów dźwiękowych wydaje się lepszym pomysłem. Jak będzie działało to może wrzuce ten skrypt tutaj...

Ten cykl na obrazku pojawia się w trendzie, potem kiedy stoch wraca znowu na wartość 1, czyli 80 w trendzie spadkowym oznaczałoby to nowy niższy dołek i szczyt ( prawdopodobnie ). Tak samo uderzanie od bandy do bandy od wartości 20 do 80 mogą odzwierciedlać wyższe/niższe dołki lub szczyty na wykresie ceny. Dopiero teraz zorientowałem sie że można znaleźć takie ustawienia żeby współgrały z tym czego szukam, a w tym przypadku z dołkami i górkami na wykresach M5, M1, ticks. I że mogę to sprowadzić do alarmów które informują mnie o zmianie cyklu na M5 albo M1 oraz inne dźwieki które informują że stoch na M1 albo ticks jest na wartościach skrajnych 80 lub 20.

-- Dodano: 18 wrz 2017, 09:33 --

W załączniku Stochastic_signal_test.java.zip jest modyfikacja która pokazuje że w jforex da się jednak robić symulacje całego konta na kilku instrumentach. To nie jest ten skrypt który liczy cykle stochastic !

-- Dodano: 18 wrz 2017, 14:04 --

Test utawień stochastic 120 5 5 na EURUSD, reczna analiza i skalpowanie, przesuwanie reaczne SL na BE

-- Dodano: 18 wrz 2017, 14:12 --

Pozycje otwierane dziś, na realnym rynku, nie na testerze.

-- Dodano: 18 wrz 2017, 15:05 --

Wchodziłem z ryzykiem 1-2 pipsa. Moim celem jest ograniczyć ilość zagrań na jednym instrumencie, dlatego że naciąłem się pare razy kiedy strategia ( ciągle rozwijam metody ) nie działała, a ja mimo to ponawiałem wejścia na tym samym instrumencie. Efekt wiadomy, powiększałem tylko straty, narastała frustracja. Tydzień temu zaczałem ograniczać ilość trejdów do 3 dzienie i ustaliłem że robie tylko 1 trejd na 1 instrumencie. A z tego powstała idea, że mogę właśnie wchodzić z minimalnym ryzykiem 1-2 pips, przestawiać sl na be i potem trzymać ile się da. I w ten sposób nauczyć się ciąć straty i trzymać zyski. I obecnie próbuje stosować takie zasady, troche poukładać to co robie, bo w ostatnim czasie straciłem przez overtrading. Na testowym koncie straciłem 80% kapitału, małe konto ale rozwaliłem je prawie. Próbuje to na nowo poukładać teraz i wspomóc się automatami.

-- Dodano: 18 wrz 2017, 15:14 --

Ostatnie zagrania. Pierwszy trejd straciłem 0.9 pips + prowizja, drugi BE, tylko koszt prowizji. Jeśli setup zadziała to reakcja rynku może być różna, raz poleci na 15pips, raz na 2-3 pips. Liczy się skuteczność. Dlatego chce ograniczyć wejścia i przetestować 1 trejd na 1 instrumencie dziennie żeby nie wpadać w overtrading kiedy nie ma zmienności albo strategia nie działa. Tyle materiału do analizy wystarczy.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Przykład skryptu który rejestruje stochastic w ustawieniach 120-5-5 na dwóch interwałach czasowych jednocześnie. Jest to tylko przykład działania pokazany na konsoli. Analizowany jest tylko EURUSD jako przykład i ramy czasowe M1 oraz M5. Komunikaty na czerwono oznaczają że stochastic jest na wartościach ekstremalnych 20 lub 80.

Pierwsze wejście na wartość ekstremalną, tutaj był komunikat z M1 ale nie miałem włączonego wykresu M1 tylko M5 więc nie widać, ale pokazuje że skrypt analizuje dane w tle. W tym momencie counter zeruje się i pojawia się w konsoli komunikat na czerwono. "----" takie kreski to oznaczenie dla stoch z M5, a bez kresek to stoch dla M1
https://images81.fotosik.pl/813/9afa3523d990d3d3.png

Tutaj stoch był na obu interwałach na wartościach ekstremalnych, w tym przypadku był pod 20
https://images84.fotosik.pl/813/bf6fb3c04b44a10f.png

Kiedy stochastic wraca, czyli wychodzi ponad 20 lub wraca pod 80 zaczyna się cykl liczenia ile stoch jest już pomiędzy wartościami 80 a 20. Kiedy znowu dotknie wartości ekstremalnych pojawia się na czerwony komunikat i counter sie zeruje.
https://images84.fotosik.pl/813/7e31a1308cb8c756.png

To tylko przykład. Kolejny rozwinięciem może być dodanie reszty interwałów, kilku intrumentów, drugiego stocha z wartościami 5-3-3 lub 7-5-5 i analizowanie tego wszystkiego ( rynku ) jednocześnie. Następnie dodanie sygnałów dźwiękowych kiedy stoch wraca nad 20 lub pod 80, czyli schodzi z wartości ekstremalnych albo dopiero tam wchodzi, liczenie counterem ile czas jest w tej pozycji - na tych wartościach.

...

Można tego używać na realnym rynku tylko trzeba zrobić kopie czyli zmienić nazwe pliku i linie kodu

Kod: Zaznacz cały

public class _manualtrader_version_one implements IStrategy {
np na public class _manualtrader_version_one_GBPUSD i taka sama nazwa pliku dla każdego instrumentu który ma być analizowany . Następnie zmienić jeszcze linie

Kod: Zaznacz cały

public Instrument instrument = Instrument.EURUSD;
czyli ustawić jaki ma być instrument. I można puścić na realnym rynku żeby generowało takie sygnały, akurat tylko widoczne w konsoli obecnie w ten sposób jak na obrazkach. No ale można tego użyć na realnym rynku do analizy. Będzie dawało sygnały tekstowe w konsoli jforex.

Aha. Można też zmienić ustawienia stochastic, tutaj ( zmienić wartość 120-5-5 na 5-3-3 na przykład. Wtedy będzie analizował takie ustawienia i kiedy stoch wchodzi na wartości 20 lub 80 w tych ustwieniach ).

Kod: Zaznacz cały

private OfferSide side = OfferSide.BID;
    private int fastKPeriod = 120; // 5
    private MaType slowDMaType =  MaType.SMA;
    private int slowKPeriod = 5; // 3
    private MaType slowKMaType =  MaType.SMA;
    private int slowDPeriod = 5; // 3
    private int shift = 0;
    private int counter = 0;
Ogólnie chce dodać 2 wksaźniki żeby analizował jednocześnie np stoch 120-5-5 oraz 7-3-3 ale tutaj wrzucam przykład, więc... może kiedyś tutaj wstawie inne wersje jak bedę to rozwijał dalej.

-- Dodano: 20 wrz 2017, 15:02 --

Mam modyfikacje tego z dźwiękiem i oknami popup ale nie testowałem jeszcze na realnym rynku, w czasie rzeczywistym jak to działa, więc na razie nie wrzucam. W testach wywala mi jakiś błąd krytyczny systemu i cały dźwięk siada po jakimś czasie trwania testów, pewnie dlatego że dźwięki na siebie nachoodzą w tym samym czasie przez zbyt szybkie tempo. Tak samo nie wiem jaki wpływ ma okno popup w czasie rzeczywistym, jak długo będzie wisieć, czy trzeba tym jakoś zarządzać. W testach okno się pojawia i test chwilo się zatrzymuje do póki nie zamkne okna przez kliknięcie na OK. Jak to sprawdze dokładnie to wtedy będę wrzucał, ale jeśli ktoś chce to mogę to tutaj wstawić w takiej formie jaka jest obecnie.

-- Dodano: 20 wrz 2017, 15:17 --

Na realnym rynku okna popup wyskakują wszędzie, można mieć w tle jforex a robić coś innego, jak przeglądanie neta, MT4, i to okno pojawi się na pierwszym planie, więc dobrze to rozwiązali w jforex. Możesz zajęty czymś innym a kiedy nadejdzie sygnał okno wyskakuje i nie musisz ciągle śledzić tego zaglądając do jforex :P

Tutaj przeglądałem nawigatora kiedy wyskoczyło okno
https://images82.fotosik.pl/814/7c151ced75ed0773.png

Tutaj oglądałem wykresy na jforex, kiedy wyskoczył komunikat. Na dole widać komunikaty z realnego rynku.
https://images83.fotosik.pl/813/27b1c8076b4ccd35.png

Tylko na razie nie ogarnąłem zarządzania okienkami, bo teraz co chwile wyskakuje jakieś okno więc to upierdliwe troche, dlatego nie wrzucam tych modyfikacji z dźwiękiem i oknami popup tutaj.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
T-REX
Pasjonat
Pasjonat
Posty: 857
Rejestracja: 23 cze 2010, 23:33

Re: panel jforex tester offline

Nieprzeczytany post autor: T-REX »

-rookie- pisze: Wchodziłem z ryzykiem 1-2 pipsa.

Ten tester uwzględnia spready?
Prawdziwa głupota zawsze pokona sztuczną inteligencję

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

T-REX pisze:Ten tester uwzględnia spready?
Nie.

W jforex wbdowany jest indykator Bar Spread Analyzer, można wykorzystać jego pomiary ale na razie nie mam czasu na zabawe z tym.

A co chcesz konkretnie? Pytaj śmiało, może będę mógł coś pomóc.

Awatar użytkownika
T-REX
Pasjonat
Pasjonat
Posty: 857
Rejestracja: 23 cze 2010, 23:33

Re: panel jforex tester offline

Nieprzeczytany post autor: T-REX »

Tak się na razie przymierzam bo inicjatywa zacna, a że najwięcej czasu mam w weekend gdy rynek nie bangla, to było by fajnie potestować to i owo na speed time. :564:
Prawdziwa głupota zawsze pokona sztuczną inteligencję

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Skąd się wzięły te 1-2 pipsy...? Tak samo jak w tym skrypcie wyżej, wracający stoch z wartości 80 lub 20 to jest trigger. Wtedy jest większe prawdopodobieństwo że rynek pójdzie w danym kierunku i wszedłem na górce albo na dołku w ten sposób dzięki ustawieniom sotchastic który pokrywa się z górkami i dołkami. Na EURUSD obecnie testuje ustawienia 120-5-5 dla wykresu tickowego oraz 7-5-5 dla M1 i M5. I w ten sposób mogę ograniczyć ryzyko jeśli będę wchodził jak najbliżej dołka lub górki.

Na EURUSD przy 2 pipsach zysków przesuwam SL na BE.

Ale to już sam musisz przejrzeć wykres żeby załapać jak to chodzi. Na obrazku 1 jest krótki opis.

I mam utawienia realizacji SL po cnie ASK dla buy oraz BID dla sell, czyli odwrotni niż standardowo.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 20 wrz 2017, 21:12 przez -rookie-, łącznie zmieniany 1 raz.

Awatar użytkownika
T-REX
Pasjonat
Pasjonat
Posty: 857
Rejestracja: 23 cze 2010, 23:33

Re: panel jforex tester offline

Nieprzeczytany post autor: T-REX »

nieźle pomyślane. :564:
Prawdziwa głupota zawsze pokona sztuczną inteligencję

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Teraz chyba w do góry i podbieranie dołków. Zobaczymy...

edit - jest nowy dołek, 2 pipsy na plus i BE. Tylko z trzymanie pozycji marnie u mnie, ale mniej więcej tak to chodzi.

Skoro już poruszyłem wczoraj temat, to tutaj jest przykład na realnym rynku.

edit - I ostatni przykład - zrealizowałem zysk z long jak widać, nie trzymałem do BE. Wejście nr 3 planowałem tutaj, z takim krótkim SL ale rynek nie cofnął się dlatego nie otworzyłem pozycji. Potem możecie sprawdzić że nowy niższy szczyt gdzie stoch wrócił na 80 był w okolicach 1.19047, czyli jakieś 5 pips od tego wierzchołka niżej. I to jest ten sam schemat analizy niższych szczytów i stochatic który pisałem wczoraj na obrazku 1. I tak to wygląda...

-- Dodano: 21 wrz 2017, 13:14 --

Wrzuce jeszcze skrypt counter bo będzie to potrzebne do zbudowania panelu dla liczenia cyklów stochastic. Na tym panelu będzie widoczna lista i licznik ile trwa już cykl stochastica od momentu wyjścia z poziomu 80 lub 20. Jeszcze nie wiem jak to ma wyglądać, ale mechanizm do zrobienia tego jest w tym przykładzie. Kiedy klikniesz na ADD wtedy doda 1 do liczby wyświetlanej po lewej oraz pokaże aktualną cene BID, kliknięcie na remove to odjęcie od tej liczby 1. I w ten sposób zbuduje mechanizmy w tym panelu do analizowania i modyfikowania ustawień, ale to dopiero za jakiś czas..

https://images84.fotosik.pl/815/25d5d1484e74c1c5.png

Kod: Zaznacz cały

package jforex;

import java.awt.Color;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.*;

import com.dukascopy.api.*;
import com.dukascopy.api.drawings.ICustomWidgetChartObject;

public class Strategy_widget_counter implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IChart chart;
    
    private Instrument instrument = Instrument.EURUSD;
        
    // counter
    private int count = 0;
    private double price;
    
    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.chart = context.getChart(instrument);
        
        ICustomWidgetChartObject widget = chart.getChartObjectFactory().createChartWidget();
        
        JPanel panel = widget.getContentPanel();
        
        final JLabel label = new JLabel("hello world");
        label.setForeground(new Color(255,255,255));
        
        JButton buttonAdd = new JButton("add");
        JButton buttonRemove = new JButton("remove");
        
        buttonAdd.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed( ActionEvent e ) {
               console.getOut().println( e );
               count += 1;
               String str = Integer.toString(count);
               String str_2 = Double.toString(price);
               label.setText(count + " " + str_2);
            }
        });
        
        buttonRemove.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed( ActionEvent e ) {
               console.getOut().println( e );
               count -= 1;
               String str = Integer.toString(count);
               String str_2 = Double.toString(price);
               label.setText(count + " " + str_2);
            }
        });
        
        
        
        // end 
        panel.add( label );
        panel.add( buttonAdd );
        panel.add( buttonRemove );
        
        // add widget on chart
        chart.add( widget );
        
        
    }

    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 {
        price = history.getLastTick(instrument).getBid();
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
    
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: panel jforex tester offline

Nieprzeczytany post autor: -rookie- »

Póki co dodam tutaj kilka funkcja dla siebie, jak będę miał troche natchnienia żeby sie w tym grzebać to zaczne to składać. Tutaj przykład jak pobierać wartość stochastic z wykresu tickowego. Funkcja shift nie jest obsługiwana dlatego trzeba szukać z zakresu, tutaj jest zakres 2 ticków, wywala komunikaty błędów w konsoli ( java.lang.ArrayIndexOutOfBoundsException )ale potem będę to optymalizował i poprawiał.

Kod: Zaznacz cały

// wstawić nad onStart()
 private Instrument instrument = Instrument.EURUSD;
private OfferSide side = OfferSide.BID;
    private int fastKPeriod = 120;
    private MaType slowDMaType =  MaType.SMA;
    private int slowKPeriod = 5;
    private MaType slowKMaType =  MaType.SMA;
    private int slowDPeriod = 5;
    private int shift = 0;

// wstawić do funkcji  onTick()
long from = history.getTick(instrument, 2).getTime();
        long to = history.getLastTick(instrument).getTime();
        
       double[][] stochastic = indicators.stoch(instrument, Period.TICK, side, fastKPeriod, slowKPeriod, slowKMaType, slowDPeriod, slowDMaType, from, to);
        
        console.getOut().println( stochastic[0][0] + " " + stochastic[0][1] + " " + stochastic[1][0] + " " + stochastic[1][1]);
W ten sposób będzie można wyświetlać w panelu informacje o tym że stoch zaczyna cykl wychodzenia z wartości 80 lub 20 i można ustawić żeby wtedy pokazywał się zielony napis buy albo czerwony sell i krzyczał z tego panelu, a obok tego był pokazany cykl od ilu ticków lub świec cena jest ponad tymi wartościami.

Dla wykresu tickowe trzeba sprawdzić wartości wejścia na 90 i 10, a wyjścia ustawić na 80 i 20. Sprawdzić to.

Druga sprawa to zrobienie pomiaru między ostatnim szczytem gdzie stoch był na 80 w trendzie spadkowym a nowym niższym szczytem gdy znowu wraca na 80 ( http://forex-nawigator.biz/forum/resources/image/146683 ) żeby tego ręcznie nie rozkminiać. Można policzyć różnice w cenie kiedy stoch wraca na 80 od ostatniej ceny gdzie tam był, czyli zrobić pomiar od początku cyklu do końca i w ten sposób w trendzie spadkowym otrzymam liczbe ujemną, a we wzrostowym dodatnią i w tym widget można zamienieć to na napis "trend kupuj" gdy jest liczba dodatnia lub "sprzedaż" dla liczby ujemnej. Uprościć proces analizy. Ale jeszcze nie wiem czy to ma sens.

Dodatkowo myślałem żeby dodać przyciski żeby automat próbował zawierać tranakcje albo przełączać na ręczny tryb.

I przydałaby sie analiza kilku instrumentów jednocześnie, żeby w panelu były widoczne informacje dla kilku intrumentów bez przłaczania się między wykresami. Ciekawe czy da rade tak zrobić.

-- Dodano: 22 wrz 2017, 13:21 --

A, właśnie. Po co robić automat? Bo trzeba sprawdzić potem skuteczność sygnałów i rozpoznać te działające stupy od nie działających robiąc automatyczny test zamiast ręcznie klikać po historii. http://forex-nawigator.biz/forum/wszyst ... ml#p884649

-- Dodano: 23 wrz 2017, 10:06 --

Kolejny element układanki i kolejny problem który trzeba będzie rozwiązać. Nie wiem co zrobiłem źle, ale strategia nie zawiera jednocześnie transakcji na dwóch różnych instrumentach już nie mówiąc o tym że ma zawierać transakcje z dwóch ramach czasowych na EURUSD, na H1 i M5. Wygląda na to że coś spaprałem w instrukacjacj warunkkowych albo funkcjach bo nie otwiera pozycji mimo sygnału do póki poprzednia nie zostanie zamknięta np. kiedy jest otwarta pozycja na USDJPY to na EURUSD mimo sygnałów z dwóch strategii ( sygnały są opisane w konsoli 1, 2, 3 oraz kierunek otwarcia buy / sell ) pozycja nie zostaje otwarta.

https://images83.fotosik.pl/817/f5c57bb3fb04408f.png

Kod: Zaznacz cały

package jforex.strategies;

import com.dukascopy.api.Configurable;
import com.dukascopy.api.IEngine;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IIndicators;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IOrder;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import com.dukascopy.api.IChart;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IIndicators.MaType;

public class Stochastic_signal_test implements IStrategy {
    private IEngine engine;
    private IIndicators indicators;
    private IConsole console;
    private IChart chartA;
    private IChart chartB;
    private IChart chartC;

    @Configurable("Amount")
    public double amount = 0.01;
    @Configurable("Period")
    public Period fixedPeriod = Period.ONE_MIN;
    @Configurable("Instrument A")
    public Instrument selectedInstrument_A = Instrument.EURUSD;
    @Configurable("Instrument B")
    public Instrument selectedInstrument_B = Instrument.USDJPY;
    @Configurable("Instrument C - EURUSD second period")
    public Instrument selectedInstrument_C = Instrument.GBPUSD;

    private OfferSide side = OfferSide.BID;
    private int fastKPeriod = 5;
    private MaType slowDMaType =  MaType.SMA;
    private int slowKPeriod = 3;
    private MaType slowKMaType =  MaType.SMA;
    private int slowDPeriod = 3;
    private int shift = 0;
    private int counter = 0;


    public void onStart(IContext context) throws JFException {
        engine = context.getEngine();
        indicators = context.getIndicators();
        console = context.getConsole();
        chartA = context.getChart(selectedInstrument_A);
        chartB = context.getChart(selectedInstrument_B);
        chartC = context.getChart(selectedInstrument_C);
        
        //console.getOut().println( chartB.getInstrument() );
        
        //context.getChart(selectedInstrument_B).addIndicator(indicators.getIndicator("STOCH"));
        //context.getChart(selectedInstrument_A).addIndicator(indicators.getIndicator("STOCH"));
    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        if (selectedInstrument_A.equals(instrument) && period.equals(fixedPeriod)) {
            double[] stochastic = indicators.stoch(instrument, Period.ONE_HOUR, side, fastKPeriod, slowKPeriod , slowKMaType, 
                    slowDPeriod, slowDMaType, shift );
            createOrderOnStochastic_A(instrument, bidBar, stochastic);
        }
        if (selectedInstrument_B.equals(instrument) && period.equals(fixedPeriod)) {
            double[] stochastic2 = indicators.stoch(instrument, Period.FIVE_MINS, side, fastKPeriod, slowKPeriod , slowKMaType, 
                    slowDPeriod, slowDMaType, shift );
            createOrderOnStochastic_B(instrument, bidBar, stochastic2);
        }
        /*
        if (selectedInstrument_C.equals(instrument) && period.equals(fixedPeriod)) {
            double[] stochastic3 = indicators.stoch(instrument, Period.FIVE_MINS, side, fastKPeriod, slowKPeriod , slowKMaType, 
                    slowDPeriod, slowDMaType, shift );
            createOrderOnStochastic_C(instrument, bidBar, stochastic3);
        }
        */
        
        // 23.09.2017 - myślałem że trzeba stworzyć dodatkowy wykres, czyli instrument C ale chyba trzeba zrobić instrukcje na tym samym wykresie
        // instrumentu tylko określić nowe parametry a konkretnie wybrać inną rame czasową - period . Przykład niżej:
         
        if (selectedInstrument_A.equals(instrument) && period.equals(fixedPeriod)) {
            double[] stochastic4 = indicators.stoch(instrument, Period.FIVE_MINS, side, fastKPeriod, slowKPeriod , slowKMaType, 
                    slowDPeriod, slowDMaType, shift );
            createOrderOnStochastic_D(instrument, bidBar, stochastic4);
        }
        
        //console.getOut().println( period );
    }

    private void createOrderOnStochastic_A(Instrument instrument, IBar bidBar, double[] stochastic) throws JFException {
        OrderCommand orderCommand;
        
        //console.getOut().println( arrayToString( stochastic ) + " " + stochastic[0] + " " + stochastic[1] );
        
       // console.getOut().println( instrument );
        
        if ((stochastic[0] >= 80) && (stochastic[1] >= 80)) {
            orderCommand = OrderCommand.SELL;
            closeOppositeIfExistA(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
            
            console.getOut().println( 1 + " sell");
            
        } else if ((stochastic[0] <= 20) && (stochastic[1] <= 20) ) {
            orderCommand = OrderCommand.BUY;
            closeOppositeIfExistA(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
             console.getOut().println( 1 + " buy");
        }
        
        
    }
    
    private void createOrderOnStochastic_B(Instrument instrument, IBar bidBar, double[] stochastic2) throws JFException {
        OrderCommand orderCommand;
        
        //console.getOut().println( arrayToString( stochastic ) + " " + stochastic[0] + " " + stochastic[1] );
        
        //console.getOut().println( instrument );
        
        if ((stochastic2[0] >= 80) && (stochastic2[1] >= 80)) {
            orderCommand = OrderCommand.SELL;
            closeOppositeIfExistB(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
            console.getOut().println( 2 + " sell");
        } else if ((stochastic2[0] <= 20) && (stochastic2[1] <= 20) ) {
            orderCommand = OrderCommand.BUY;
            closeOppositeIfExistB(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
             console.getOut().println( 2 + " buy");
        }
        
        
    }
    
    private void createOrderOnStochastic_D(Instrument instrument, IBar bidBar, double[] stochastic4) throws JFException {
        OrderCommand orderCommand;
        
        //console.getOut().println( arrayToString( stochastic ) + " " + stochastic[0] + " " + stochastic[1] );
        
        //console.getOut().println( instrument );
        
        if ((stochastic4[0] >= 80) && (stochastic4[1] >= 80)) {
            orderCommand = OrderCommand.SELL;
            closeOppositeIfExistD(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
            console.getOut().println( 3 + " sell");
        } else if ((stochastic4[0] <= 20) && (stochastic4[1] <= 20) ) {
            orderCommand = OrderCommand.BUY;
            closeOppositeIfExistD(orderCommand);
            createOrder(instrument, bidBar, orderCommand);
             console.getOut().println( 3 + " buy");
        }
        
        
    }

    private void closeOppositeIfExistA(OrderCommand command) throws JFException {
        if (engine.getOrders().size() == 0) {
            return;
        }
        for (IOrder order: engine.getOrders(selectedInstrument_A)) {
            if (!order.getOrderCommand().equals(command)) {
                order.close();
            }
        }
        
    }
    
    private void closeOppositeIfExistB(OrderCommand command) throws JFException {
        if (engine.getOrders().size() == 0) {
            return;
        }
        for (IOrder order: engine.getOrders(selectedInstrument_B)) {
            if (!order.getOrderCommand().equals(command)) {
                order.close();
            }
        }
        
    }

    private void closeOppositeIfExistD(OrderCommand command) throws JFException {
        if (engine.getOrders().size() == 0) {
            return;
        }
        for (IOrder order: engine.getOrders(selectedInstrument_A)) {
            if (!order.getOrderCommand().equals(command)) {
                order.close();
            }
        }
        
    }

    private void createOrder(Instrument instrument, IBar bidBar, OrderCommand orderCommand) throws JFException {
        if (engine.getOrders().size() > 0) {
            return;
        }
        engine.submitOrder(getLabel(instrument), instrument, orderCommand, amount);
    }
    
    

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {

    }

    public void onStop() throws JFException {
        for (IOrder order : engine.getOrders(selectedInstrument_A)) {
            order.close();
        }
        for (IOrder order : engine.getOrders(selectedInstrument_B)) {
            order.close();
        }
        for (IOrder order : engine.getOrders(selectedInstrument_C)) {
            order.close();
        }
    }
    
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        
        
        
    }

    public void print(String string) {
        console.getOut().println(string);
    }
    
    protected String getLabel(Instrument instrument) {
        return (instrument.name() + (counter ++)).toUpperCase();
    }
    
    private String arrayToString(double[] arr) {
        StringBuilder str = new StringBuilder();
        for (int r = 0; r < arr.length; r++) {
            str.append( String.format("%.5f", arr[r]) );            
        }
        return str.toString();
    }
}
-- Dodano: 23 wrz 2017, 10:25 --

A ten counter cykli stocha to też dopiero trzeba ogarnąć.

https://images81.fotosik.pl/818/c93fc0e71b098887.png

Kod: Zaznacz cały

package jforex;

import java.awt.Color;
import javax.swing.JPanel;

import java.util.*;
import com.dukascopy.api.feed.IFeedDescriptor;

import com.dukascopy.api.*;
import com.dukascopy.api.drawings.ICustomWidgetChartObject;

import com.dukascopy.api.IIndicators.MaType;
import com.dukascopy.api.feed.util.TimePeriodAggregationFeedDescriptor;

public class Strategy_jpanel_test implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IChart chart;
    
    // default instrument
    private Instrument instrument = Instrument.EURUSD;
    
     public IFeedDescriptor feedDescriptor =
            new TimePeriodAggregationFeedDescriptor(
                        Instrument.EURUSD, 
                    Period.TEN_SECS, 
                    OfferSide.ASK, 
                    Filter.NO_FILTER
            );
    
    private OfferSide side = OfferSide.BID;
    private int fastKPeriod = 120;
    private MaType slowDMaType =  MaType.SMA;
    private int slowKPeriod = 5;
    private MaType slowKMaType =  MaType.SMA;
    private int slowDPeriod = 5;
    private int shift = 0;
    private int counter = 0;
    
    // count stoch cycle
    private int a = 0;
    private int b = 0;
    private int a_cycle = 0;
    private int b_cycle = 0;
    private int prev_20 = 0;
    private int current_20 = 0;
    private int curr_sett = 0;
    private double _priceA;
    private double _priceB;

    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.chart = context.getChart(instrument);
        
        ICustomWidgetChartObject widget = chart.getChartObjectFactory().createChartWidget();
        
        JPanel panel = widget.getContentPanel();

        //panel.setBackground(new Color(123,244,23));
        //panel.setForeground(new Color(123,244,23));
       // widget.setColor(new Color(234,122,1));
                
        //chart.add( widget );
        
    }

    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 {
        
        long from = history.getTick(instrument, 2).getTime();
        long to = history.getLastTick(instrument).getTime();
        
       double[][] stochastic = indicators.stoch(instrument, Period.TICK, side, fastKPeriod, slowKPeriod, slowKMaType, slowDPeriod, slowDMaType, from, to);
        
        if ( stochastic[0][0] < 10 && stochastic[0][1] < 10 && stochastic[1][0] < 10 && stochastic[1][1] < 10 ){
            //console.getOut().println( stochastic[0][0] + " " + stochastic[0][1] + " " + stochastic[1][0] + " " + stochastic[1][1]);
            a = 1;
        } else {
            a = 0;
        }
        
        if ( stochastic[0][0] > 90 && stochastic[0][1] > 90 && stochastic[1][0] > 90 && stochastic[1][1] > 90 ) {
            //console.getInfo().println( stochastic[0][0] + " " + stochastic[0][1] + " " + stochastic[1][0] + " " + stochastic[1][1] );
            b = 1;
        } else {
            b =0;
        }
        
        //
        //
        //
        
        if ( a == 1 ) {
            //console.getOut().println( a + " " + b + " " + stochastic[0][0] + " " + stochastic[0][1] + " " + stochastic[1][0] + " " + stochastic[1][1] );
            a_cycle = 0;
        } else {
            a_cycle += 1;
        }
        
        if ( b == 1 ) {
            //console.getInfo().println( a + " " + b + " " + stochastic[0][0] + " " + stochastic[0][1] + " " + stochastic[1][0] + " " + stochastic[1][1] );
            b_cycle = 0;
        } else {
            b_cycle += 1;
        }
        
        //
        //
        //
        
        if ( a_cycle > 1 && b == 1 ) {
            prev_20 = 1;
        } 
        
        if ( prev_20 == 1 && a == 1 ) {
            current_20 = 1;
        }
        
        if ( prev_20 == 1 && current_20 == 1 && a == 1 ) {
            console.getWarn().println( "stop" );
            prev_20 = 0;
        }
        
        
         console.getOut().println( "[stoch na 20] " + a + " [stoch na 80] " + b + " [strat z 20] " + a_cycle + " [start z 80] " + b_cycle + " [prev20] " + prev_20 + " [current20] " + current_20 );
       
       //double[] stochastic = indicators.stoch(instrument, Period.TICK, side, fastKPeriod, slowKPeriod, slowKMaType, slowDPeriod, slowDMaType, shift);
       
       //console.getOut().println( stochastic[0] + " " + stochastic[1] );
        
    } 
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
    
}
-- Dodano: 23 wrz 2017, 11:51 --

Obrazek

To jest to co liczy ten skrypt wyżej. I na razie to tyle co chciało mi się zrobić. Trzeba zrobić licznik cyklu żeby mieć wartości do mierzenia niższych szczytów i wyższych dołków.

ODPOWIEDZ