JForex

Sprawy techniczne dotyczące poszczególnych platform handlowych.
Online
Awatar użytkownika
raposo
Moderator
Moderator
Posty: 9995
Rejestracja: 22 wrz 2006, 22:10

Re: JForex

Nieprzeczytany post autor: raposo »

To tylko doprecyzuję... ;)
W Dukascopy pobierają opłaty oddzielnie za otwarcie i zamknięcie gdzie w MT4 chyba większość pobiera od razu całą prowizje przy otwarciu pozycji tzn jak otworzysz L potem S to masz na razie prowizje za otwarcie, potem jak zamkniesz doliczy za zamknięcie pozycji. Jest jeszcze opcja MERGE i chyba tutaj można zaoszczędzić na prowizji ale nie mam pewności.
W MT4 nie ma technicznej możliwości, aby prowizja była naliczana osobno za otwarcie i zamknięcie ale ogólnie rzecz ujmując tak powinien robić każdy broker. Czyli kasuje nam prowizję najpierw za samo otwarcie, a potem za drugie otwarcie pozycji przeciwstawnej (czyli zamknięcie). Opcja Merge, czyli łączenie pozycji powoduje, że otwarte dwie pozycje przeciwstawne są ze sobą bilansowane, co nie podlega dodatkowym opłatom. Jest to odpowiednik "wielokrotnie zamknij przez" w MT4.

Jeśli chodzi o depozyt zabezpieczający to przy hedge spotyka się dwa podejścia:
1) pobierane jest 50% depozytu za każdą z nich (czyli otwieramy 1.0 lota L i 1.0 lota S -> zamraża nam depozyt łącznie tylko za 1.0 lota)
2) bilansowanie się depozytu w całości (czyli przy powyższej konfiguracji nie wykorzystujemy wcale depozytu -> wynosi on 0).

W Dukascopy z tego co pamiętam mamy do czynienia z drugą opcją.
ForexClub.pl
- Forex Club Tools
- Program Podatek 7.0
- RABATY PROWIZJI
| IC Markets (-21%) | Tickmill (-10%) | XTB (Pakiet książek) | Dukascopy (narzędzia do JForex) | LMAX (-20%) | FxPro (do -15%)

Zapraszamy do kontaktu

FXpleyer

Re: JForex

Nieprzeczytany post autor: FXpleyer »

Pisałem ten post z pytaniami 31.12 wieczorem zaglądam następnego dnia posta nie ma a że byłem po kilku głębszych stwierdziłem że pewnie nie kliknąłem "wyślij" :shock: dziś zaglądam i wszystko jest , dzięki za pomoc panowie :564:To żeta "opcja zamyka wszystko" mi nie przeszkadza otwieram pojedyncze zlecenia. Nawet lepiej że jest to 2.(bilansowanie depozytu), mam zamiar zrezygnować z tradycyjnego SL na hedge i to będzie celem testów :568:

daktyl
Uczestnik
Uczestnik
Posty: 2
Rejestracja: 17 sty 2018, 16:02

Re: JForex

Nieprzeczytany post autor: daktyl »

a.jpg
b.jpg
Witam,

Mam problem z kompilacją strategii w JForex (jakiejkolwiek, nawet najprostszej, świeżo utworzonej).
Pojawiają mi się takie dwa podkreślenia:
1: class name -"The hierarchy of the type Strategy1 is inconsistent" - i have named the class the same as java file.
2: throws JFException - "No exception of type JFException can be thrown; an exception type must be a subclass of Throwable".
Mam wrażenie, że to jest banalny problem, może jest ktoś wstanie mi pomóc?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

daktyl
Uczestnik
Uczestnik
Posty: 2
Rejestracja: 17 sty 2018, 16:02

Re: JForex

Nieprzeczytany post autor: daktyl »

Problem rozwiązany. Wystarczyło odinstalować Jave 9 a konkretnie samo środowisko uruchomieniowe jre.

Pozdrawiam

Online
Awatar użytkownika
raposo
Moderator
Moderator
Posty: 9995
Rejestracja: 22 wrz 2006, 22:10

Re: JForex

Nieprzeczytany post autor: raposo »

JForex przeszło kolejny szereg aktualizacji. Pojawiły się m.in.:
  • - Szybkie dodawanie SL/TP z wykresu,
    - Automatyczne dodawanie SL/TP/Slippage do wszystkich rodzajów zleceń,
    - upgrade alertów cenowych,
    + szereg mniejszych modyfikacji.
Szczegóły:
https://forexclub.pl/nowosci-platforma- ... dukascopy/
ForexClub.pl
- Forex Club Tools
- Program Podatek 7.0
- RABATY PROWIZJI
| IC Markets (-21%) | Tickmill (-10%) | XTB (Pakiet książek) | Dukascopy (narzędzia do JForex) | LMAX (-20%) | FxPro (do -15%)

Zapraszamy do kontaktu

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

Re: JForex

Nieprzeczytany post autor: -rookie- »

Jeśli chodzi o coś w stylu myfxbook to może dałoby rade zrobić wersje offline.
1. Jest kilka klas i funkcji jak IReportPosition, history.getOrdersHistory, engine.getOrders z których można wygenerować własne raporty. Włączałoby się strategie, która zrzucałaby automatycznie informacje o pozycjach, co tam się będzie pobierało. Skrypt wygląda tak https://www.dukascopy.com/wiki/en/devel ... rs-in-file i zapisuje dane które chcemy do pliku na naszym dysku. Tutaj niżej kod który wstawiłem to moja modyfikacja która zapisuje dane do pliku test.js, zapisuje id pozycji i wolumen. To jest przykład dla pokazania że się da coś takiego zrobić.

Kod: Zaznacz cały

package jforex;

import com.dukascopy.api.*;
import java.io.*;
import java.util.*;
import com.dukascopy.api.IEngine.OrderCommand;

import javax.swing.filechooser.*;

public class TestBarsSaving implements IStrategy {
   private IContext context;
   private IConsole console;
   private IHistory history;
   private IEngine engine;
   private IOrder order;

   public void onStart(IContext context) throws JFException {
      this.context = context;
      console = context.getConsole();
      history = context.getHistory();
      engine = context.getEngine();
      
      order = engine.submitOrder("MyMaketBuyOrder1", Instrument.EURUSD, OrderCommand.BUY, 0.005);
      order = engine.submitOrder("MyMaketBuyOrder2", Instrument.EURUSD, OrderCommand.SELL, 0.001);
      order = engine.submitOrder("MyMaketBuyOrder3", Instrument.EURUSD, OrderCommand.BUY, 0.002);
   }

   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 {
   
      // test
      order.close();
       
      long prevBarTime = history.getPreviousBarStart(Period.TEN_SECS, tick.getTime());
      //List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9L, prevBarTime);
      List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9, prevBarTime);
      File dirFile = new File(getMyStrategiesDir(), "files");
      if (!dirFile.exists()) {
         console.getErr().println("Please create files directory in My Strategies");
         context.stop();
      }
      File file = new File(dirFile, "test.js");
      console.getOut().println("Writing file " + file);
      
      // history orders
      IBar bar10 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.ASK, 10);
      IBar bar1 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.ASK, 0);
      List<IOrder> previousOrders = engine.getOrders(); // .getOrdersHistory(instrument, bar10.getTime(), bar1.getTime());
      
      try {
         PrintWriter pw = new PrintWriter(file);
         for (IBar bar : bars) {
            //pw.println("[" + bar.getTime() + "," + bar.getOpen() + "," + bar.getClose() + "," + bar.getHigh() + "," + bar.getLow() + "," + bar.getVolume() + "]");
         }
         
         for (IOrder order : previousOrders) {
             pw.println( "{" + "id:" + order.getId() + "," + "amount:"+ order.getAmount() + "}," );
         }
         
         pw.close();
         
      } catch (IOException e) {
         e.printStackTrace(console.getErr());
      }
      console.getOut().println("File saved, exiting");
      context.stop();
   }

   public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}

   public static File getMyStrategiesDir() {
      File myDocs = FileSystemView.getFileSystemView().getDefaultDirectory();
      File dir = new File(myDocs.getPath() + File.separator + "My Strategies");
      return dir;
   }
}
Następnie można zrobić plik w folderze "My Strategies" plik html, czyli w lokalizacji gdzie zapisuje strategia jforex nasz plik

Kod: Zaznacz cały

<html>
  <head>
    <style>
      #myChart {
        width: 100%;
        height: 100%;
      }
      #canvasId1 {
        width: 500px;
        height: 250px;
      } 
    </style>
  </head>
  <body>
  
    <div id="canvasId1">
      <canvas id="myChart"></canvas>
    </div>
    
    <script src="files/require.js"></script>
    <script src="files/test.js"></script>
    
    
    <script>
    var ctx = document.getElementById("myChart");
    
    function getID() {
      var ar = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       ar.push( arr[ i ].id );
      }
      return ar;
    }
    
    function getAmount() {
      var am = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       am.push( arr[ i ].amount );
      }
      return am;
    }

    function makeBorder() {
      var bor = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       bor.push( 'rgba(0,0,0,1)' );
      }
      return bor;
    }
    
    function borderColor() {
      var borc = [];
      var a = 0;
      var b = 0;
      var c = 0;
      for ( var i = 0; i < arr.length; i ++ ) {
        a = Math.floor(Math.random() * 255);
        b = Math.floor(Math.random() * 255);
        c = Math.floor(Math.random() * 255);
        borc.push( 'rgba(' + a + ',' + b + ',' +  c + ',' + 0.2 + ')' );
      }
      return borc;
    }
  
    require(['files/Chart.js'], function(Chart){
        var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: getID(),
            datasets: [{
                label: '# test chart',
                data: getAmount(),
                backgroundColor: borderColor(),
                borderColor: makeBorder(),
                borderWidth: 0.5
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    });
    });
    </script>

  </body>
</html>
Potrzebne będą biblioteki js chart.js (http://www.chartjs.org/samples/latest/) oraz require.js

Plik test.js wygląda tak ale tutaj jest lekko zmodyfikowany do testu, dodany jest fragment var arr = , reszta jest wygenrowanać przez strategie. Trzeba by do po prostu ogarnąć. Ale tak jak pisze, na razie chciałem sprawdzić czy jest jakiś sposób żeby wygenerować takie statystyki.

Kod: Zaznacz cały

var arr = [{"id":1,"amount":0.005},{"id":2,"amount":0.001},{"id":3,"amount":0.002}];
Efekt końcowy jest następujący !!!
Można wygenerować takie wykresy jak na tych przykładach http://www.chartjs.org/samples/latest/ używając tej biblioteki. Tylko trzeba by rozpracować moduły tzn napisać kod js dla tych modułów

Obrazek

Działałoby to w ten sposób, że w tle była by włączona strategia która wysyłałaby dane o naszych pozycjach itd do pliku js na dysku a potem kod obrabiałby to wszystko, tworzył takie wykresy itp i my byśmy to oglądali OFFLINE, tylko na własnym komputerze w przeglądarce, odpalając plik index.html czy jak to będzie nazwane. Jest to jakiś pomysł żeby zrobić nowe raporty i coś w rodzaju myfxbook ale w takiej formie nie byłoby to dostępne publicznie. Ale to potem można by coś pomyśleć jak już powstanie cokolwiek na podobieństwo myfxbook z tego.

Dlaczego offline, a nie przez rejestracje na stronie jak to jest zrobione na myfxbook? Bo wtedy trzeba by podawać jakieś informacje, może wygenerować jakiś UUID albo coś w tym stylu, żeby komunikować się między strategią odpaloną na jforex a tymi skryptami. A to się wiąże ze zbieraniem danych przy rejestracji użytkowników, rejestracją domeny, i tak dalej... DLATEGO OFFLINE NA RAZIE LEPIEJ TO ROZKMINIAĆ.

Wrzucam to tutaj, może ktoś jeszcze się tym zainteresuje... coś potrafił będzie z tym zrobić...

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

Re: JForex

Nieprzeczytany post autor: -rookie- »

Wrzuce jeszcze przykład jak zrobić wykres zysków i strat. Może komuś się przyda. Jest kilka zmian w kodzie strategii którą wrzuciłem wyżej, pobrane są jeszcze informacje P/L, kierunek, instrument

Kod: Zaznacz cały

package jforex;

import com.dukascopy.api.*;
import java.io.*;
import java.util.*;
import com.dukascopy.api.IEngine.OrderCommand;

import javax.swing.filechooser.*;

public class TestBarsSaving implements IStrategy {
   private IContext context;
   private IConsole console;
   private IHistory history;
   private IEngine engine;
   private IOrder order;

   public void onStart(IContext context) throws JFException {
      this.context = context;
      console = context.getConsole();
      history = context.getHistory();
      engine = context.getEngine();
      
      //order = engine.submitOrder("MyMaketBuyOrder1", Instrument.EURUSD, OrderCommand.BUY, 0.005);
      //order = engine.submitOrder("MyMaketBuyOrder2", Instrument.EURUSD, OrderCommand.SELL, 0.001);
      //order = engine.submitOrder("MyMaketBuyOrder3", Instrument.EURUSD, OrderCommand.BUY, 0.002);
   }

   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 {
   
      // test
      //order.close();
       
      long prevBarTime = history.getPreviousBarStart(Period.TEN_SECS, tick.getTime());
      //List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9L, prevBarTime);
      List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9, prevBarTime);
      File dirFile = new File(getMyStrategiesDir(), "files");
      if (!dirFile.exists()) {
         console.getErr().println("Please create files directory in My Strategies");
         context.stop();
      }
      File file = new File(dirFile, "test.js");
      console.getOut().println("Writing file " + file);
      
      // history orders
      long time = System.currentTimeMillis();
      IBar bar10 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.BID, 100);
      IBar bar1 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.BID, 0);
      List<IOrder> previousOrders =  history.getOrdersHistory(Instrument.EURUSD, time - Period.MONTHLY.getInterval(), time);
      
      //console.getOut().println( previousOrders );
      
      try {
         PrintWriter pw = new PrintWriter(file);
         //for (IBar bar : bars) {
            //pw.println("[" + bar.getTime() + "," + bar.getOpen() + "," + bar.getClose() + "," + bar.getHigh() + "," + bar.getLow() + "," + bar.getVolume() + "]");
         //}
         pw.println("var arr=[");
         for (IOrder order : previousOrders) {
             pw.println( "{" + 
                 "instrument:" + '"' + order.getInstrument() + '"' + "," + 
                 "id:" + order.getId() + "," + 
                 "cmd:" + '"' + order.getOrderCommand() + '"' + "," +
                 "amount:" + order.getAmount() + "," + 
                 "PLaccCurrency:" + order.getProfitLossInAccountCurrency() +
                 "}," );
         }
         pw.println("];");
         pw.close();
         
      } catch (IOException e) {
         e.printStackTrace(console.getErr());
      }
      console.getOut().println("File saved, exiting");
      context.stop();
   }

   public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}

   public static File getMyStrategiesDir() {
      File myDocs = FileSystemView.getFileSystemView().getDefaultDirectory();
      File dir = new File(myDocs.getPath() + File.separator + "My Strategies");
      return dir;
   }
}
Plik html, tak samo kilka zmian w stosunku do tego co jest post wyżej

Kod: Zaznacz cały

<html>
  <head>
    <style>
      #myChart {
        width: 100%;
        height: 100%;
      }
      #canvasId1 {
        width: 800px;
        height: 350px;
      } 
    </style>
  </head>
  <body>
  
    <div id="canvasId1">
      <canvas id="myChart"></canvas>
    </div>
    
    <script src="files/require.js"></script>
    <script src="files/test.js"></script>
    
    
    <script>
    var ctx = document.getElementById("myChart");

    function itemsID() {
      var it = [];
      for ( var i = 0; i < arr.length; i ++ ) {
        it.push( i );
      }
      return it;
    }
    
    console.log( itemsID() );
    
    function getID() {
      var ar = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       ar.push( arr[ i ].id );
      }
      return ar;
    }
    
    function getAmount() {
      var am = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       am.push( arr[ i ].PLaccCurrency );
      }
      return am;
    }

    function makeBorder() {
      var bor = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       bor.push( 'rgba(0,0,0,1)' );
      }
      return bor;
    }
    
    function borderColor() {
      var borc = [];
      var a = 0;
      var b = 0;
      var c = 0;
      for ( var i = 0; i < arr.length; i ++ ) {
        a = Math.floor(Math.random() * 255);
        b = Math.floor(Math.random() * 255);
        c = Math.floor(Math.random() * 255);
        borc.push( 'rgba(' + a + ',' + b + ',' +  c + ',' + 0.2 + ')' );
      }
      return borc;
    }
  
    require(['files/Chart.js'], function(Chart){
        var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: itemsID(),
            datasets: [{
                label: 'Profit & Loss EUR/USD',
                data: getAmount(),
                backgroundColor: borderColor(),
                borderColor: makeBorder(),
                borderWidth: 0.5
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    });
    });
    
    </script>

  </body>
</html>
Wygenerowany plik test.js ze zrzutem pozycji

Kod: Zaznacz cały

var arr=[
{instrument:"EUR/USD",id:97249371,cmd:"SELL",amount:0.001,PLaccCurrency:1.06},
{instrument:"EUR/USD",id:97402915,cmd:"BUY",amount:0.01,PLaccCurrency:-212.07},
{instrument:"EUR/USD",id:97425779,cmd:"BUY",amount:0.01,PLaccCurrency:-145.71},
{instrument:"EUR/USD",id:97426810,cmd:"BUY",amount:0.01,PLaccCurrency:13.68},
{instrument:"EUR/USD",id:97429654,cmd:"BUY",amount:0.01,PLaccCurrency:-83.8},
{instrument:"EUR/USD",id:97431151,cmd:"BUY",amount:0.01,PLaccCurrency:-29.07},
{instrument:"EUR/USD",id:97527101,cmd:"SELL",amount:0.003327,PLaccCurrency:13.88},
{instrument:"EUR/USD",id:97529327,cmd:"SELL",amount:0.002594,PLaccCurrency:3.9},
{instrument:"EUR/USD",id:97518833,cmd:"SELL",amount:0.005,PLaccCurrency:10.95},
{instrument:"EUR/USD",id:97519679,cmd:"SELL",amount:0.005,PLaccCurrency:8.04},
{instrument:"EUR/USD",id:97519711,cmd:"SELL",amount:0.003917,PLaccCurrency:6.03},
{instrument:"EUR/USD",id:97539156,cmd:"SELL",amount:0.005,PLaccCurrency:4.28},
{instrument:"EUR/USD",id:97559814,cmd:"SELL",amount:0.005,PLaccCurrency:-105.52},
{instrument:"EUR/USD",id:97554326,cmd:"SELL",amount:0.0025,PLaccCurrency:-59.34},
{instrument:"EUR/USD",id:97555220,cmd:"SELL",amount:0.001,PLaccCurrency:-23.84},
{instrument:"EUR/USD",id:97609681,cmd:"SELL",amount:0.00284,PLaccCurrency:8.26},
{instrument:"EUR/USD",id:97609755,cmd:"SELL",amount:0.001,PLaccCurrency:2.46},
{instrument:"EUR/USD",id:97612284,cmd:"SELL",amount:0.002234,PLaccCurrency:11.31},
{instrument:"EUR/USD",id:97609862,cmd:"SELL",amount:0.002,PLaccCurrency:16.49},
{instrument:"EUR/USD",id:97613300,cmd:"SELL",amount:0.00181,PLaccCurrency:5.76},
{instrument:"EUR/USD",id:97679753,cmd:"SELL",amount:0.004197,PLaccCurrency:0.86},
{instrument:"EUR/USD",id:97676366,cmd:"SELL",amount:0.004181,PLaccCurrency:2.0},
{instrument:"EUR/USD",id:97688981,cmd:"SELL",amount:0.001,PLaccCurrency:2.53},
{instrument:"EUR/USD",id:97689598,cmd:"SELL",amount:0.00172,PLaccCurrency:8.18},
{instrument:"EUR/USD",id:97694258,cmd:"SELL",amount:0.001743,PLaccCurrency:3.16},
{instrument:"EUR/USD",id:97695469,cmd:"SELL",amount:0.001774,PLaccCurrency:-1.52},
{instrument:"EUR/USD",id:97695601,cmd:"SELL",amount:0.003541,PLaccCurrency:-2.3},
{instrument:"EUR/USD",id:97695968,cmd:"SELL",amount:0.003446,PLaccCurrency:2.95},
{instrument:"EUR/USD",id:97696207,cmd:"SELL",amount:0.004072,PLaccCurrency:11.28},
{instrument:"EUR/USD",id:97696543,cmd:"SELL",amount:0.0021,PLaccCurrency:9.05},
{instrument:"EUR/USD",id:97735198,cmd:"BUY",amount:0.003628,PLaccCurrency:7.07},
{instrument:"EUR/USD",id:97743251,cmd:"BUY",amount:0.005922,PLaccCurrency:20.46},
{instrument:"EUR/USD",id:97748331,cmd:"BUY",amount:0.006055,PLaccCurrency:12.43},
{instrument:"EUR/USD",id:97746972,cmd:"BUY",amount:0.003943,PLaccCurrency:-3.37},
{instrument:"EUR/USD",id:97747121,cmd:"BUY",amount:0.001,PLaccCurrency:1.33},
{instrument:"EUR/USD",id:97747170,cmd:"BUY",amount:0.001,PLaccCurrency:0.89},
{instrument:"EUR/USD",id:97751152,cmd:"BUY",amount:0.002,PLaccCurrency:-4.24},
{instrument:"EUR/USD",id:97768907,cmd:"BUY",amount:0.0025,PLaccCurrency:3.93},
{instrument:"EUR/USD",id:97769494,cmd:"SELL",amount:0.005,PLaccCurrency:10.43},
{instrument:"EUR/USD",id:97769718,cmd:"BUY",amount:0.0025,PLaccCurrency:2.99},
{instrument:"EUR/USD",id:97975468,cmd:"BUY",amount:0.005,PLaccCurrency:2.74},
{instrument:"EUR/USD",id:97975469,cmd:"SELL",amount:0.001,PLaccCurrency:-0.75},
{instrument:"EUR/USD",id:97975470,cmd:"BUY",amount:0.002,PLaccCurrency:1.09},
];
Wykres zysków i strat

Obrazek

Tutaj już więcej nie będę śmiecił. Sam dla siebie i tak będę coś takiego robił ale nie teraz, na razie zostawiam to tutaj bo może ktoś z tego będzie potrafił skorzystać. btw. to były moje ostatnie trejdy na EURUSD konto live heh

-- Dodano: 28 lut 2018, 13:58 --

Dobra, jeszcze tylko to. Wersja wykresu horyzontalnego z datą transakcji, te same transakcje tylko dodany czas zamkniecia pozycji oraz zmieniony kod w pliku html.

Kod: Zaznacz cały

package jforex;

import com.dukascopy.api.*;
import java.io.*;
import java.util.*;
import com.dukascopy.api.IEngine.OrderCommand;

import javax.swing.filechooser.*;

import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class TestBarsSaving implements IStrategy {
   private IContext context;
   private IConsole console;
   private IHistory history;
   private IEngine engine;
   private IOrder order;
   
   private SimpleDateFormat sdf;

   public void onStart(IContext context) throws JFException {
      this.context = context;
      console = context.getConsole();
      history = context.getHistory();
      engine = context.getEngine();
      
      Date date = new Date();
      sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      
      //print( sdf.format(date) );
      
      //order = engine.submitOrder("MyMaketBuyOrder1", Instrument.EURUSD, OrderCommand.BUY, 0.005);
      //order = engine.submitOrder("MyMaketBuyOrder2", Instrument.EURUSD, OrderCommand.SELL, 0.001);
      //order = engine.submitOrder("MyMaketBuyOrder3", Instrument.EURUSD, OrderCommand.BUY, 0.002);
   }

   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 {
   
      // test
      //order.close();
       
      long prevBarTime = history.getPreviousBarStart(Period.TEN_SECS, tick.getTime());
      //List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9L, prevBarTime);
      List<IBar> bars = history.getBars(instrument, Period.TEN_SECS, OfferSide.BID, prevBarTime - 1000L * 10L * 9, prevBarTime);
      File dirFile = new File(getMyStrategiesDir(), "files");
      if (!dirFile.exists()) {
         console.getErr().println("Please create files directory in My Strategies");
         context.stop();
      }
      File file = new File(dirFile, "test.js");
      console.getOut().println("Writing file " + file);
      
      // history orders
      long time = System.currentTimeMillis();
      IBar bar10 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.BID, 100);
      IBar bar1 = history.getBar(Instrument.EURUSD, Period.ONE_HOUR, OfferSide.BID, 0);
      List<IOrder> previousOrders =  history.getOrdersHistory(Instrument.EURUSD, time - Period.MONTHLY.getInterval(), time);
      
      //console.getOut().println( previousOrders );
      
      try {
         PrintWriter pw = new PrintWriter(file);
         //for (IBar bar : bars) {
            //pw.println("[" + bar.getTime() + "," + bar.getOpen() + "," + bar.getClose() + "," + bar.getHigh() + "," + bar.getLow() + "," + bar.getVolume() + "]");
         //}
         pw.println("var arr=[");
         for (IOrder order : previousOrders) {
             pw.println( "{" + 
                 "instrument:" + '"' + order.getInstrument() + '"' + "," + 
                 "id:" + order.getId() + "," + 
                 "cmd:" + '"' + order.getOrderCommand() + '"' + "," +
                 "amount:" + order.getAmount() + "," + 
                 "PLaccCurrency:" + order.getProfitLossInAccountCurrency() + "," +
                 "dateClose:" + '"' +  sdf.format(order.getCloseTime()) + '"' + 
                 "}," );
         }
         pw.println("];");
         pw.close();
         
      } catch (IOException e) {
         e.printStackTrace(console.getErr());
      }
      console.getOut().println("File saved, exiting");
      context.stop();
   }

   public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}

   public static File getMyStrategiesDir() {
      File myDocs = FileSystemView.getFileSystemView().getDefaultDirectory();
      File dir = new File(myDocs.getPath() + File.separator + "My Strategies");
      return dir;
   }
   
   public void print( Object obj ) {
       console.getOut().println( obj );
   }
}
kod html, wersja horyzontalna wykresu słupkowego

Kod: Zaznacz cały

<html>
  <head>
    <style>
      #myChart {
        width: 100%;
        height: 100%;
      }
      #canvasId1 {
        width: 1000px;
        height: 650px;
      } 
    </style>
  </head>
  <body>
  
    <div id="canvasId1">
      <canvas id="myChart"></canvas>
    </div>
    
    <script src="files/require.js"></script>
    <script src="files/test.js"></script>
    
    
    <script>
    var ctx = document.getElementById("myChart");

    function itemsID() {
      var it = [];
      for ( var i = 0; i < arr.length; i ++ ) {
        it.push( i  );
      }
      return it;
    }
    
    function dateclose() {
      var ity = [];
      for ( var i = 0; i < arr.length; i ++ ) {
        var txt = arr[ i ].dateClose;
        //txt = txt.substring(0,10);
        ity.push( txt );
      }
      return ity;
    }

    console.log( dateclose() );
    
    function getID() {
      var ar = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       ar.push( arr[ i ].id );
      }
      return ar;
    }
    
    function getAmount() {
      var am = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       am.push( arr[ i ].PLaccCurrency );
      }
      return am;
    }

    function makeBorder() {
      var bor = [];
      for ( var i = 0; i < arr.length; i ++ ) {
       bor.push( 'rgba(0,0,0,1)' );
      }
      return bor;
    }
    
    function borderColor() {
      var borc = [];
      var a = 0;
      var b = 0;
      var c = 0;
      for ( var i = 0; i < arr.length; i ++ ) {
        a = Math.floor(Math.random() * 255);
        b = Math.floor(Math.random() * 255);
        c = Math.floor(Math.random() * 255);
        borc.push( 'rgba(' + a + ',' + b + ',' +  c + ',' + 0.2 + ')' );
      }
      return borc;
    }
  
    require(['files/Chart.js'], function(Chart){
        var myChart = new Chart(ctx, {
        type: 'horizontalBar',
        data: {
            labels: dateclose(),
            datasets: [{
                label: 'Profit & Loss EUR/USD',
                data: getAmount(),
                backgroundColor: borderColor(),
                borderColor: makeBorder(),
                borderWidth: 0.5
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true,
                        fontSize: 9
                    }
                }],
                xAxes: [{
                    ticks: {
                        fontSize: 12,
                        maxRotation: 90
                    }
                }]
            }
        }
    });
    });
    
    </script>

  </body>
</html>
Efekt, obrazek jest za duży żeby umieszczać go bezpośrednio w poście, dlatego wstawiam link do obrazka

https://images82.fotosik.pl/1007/a1ffde53a18b0f23.png

Myśle że troche nakierowałem kogoś kto się tym zainteresuje...

FreeWay

Re: JForex

Nieprzeczytany post autor: FreeWay »

Hej , Szukam jakiegoś programu którym można by EA na MT4 przekonwenterować na jave by działały w jforex3 dobrze by było gdyby byl darmowy lub nawet wersja próbna

Online
Awatar użytkownika
raposo
Moderator
Moderator
Posty: 9995
Rejestracja: 22 wrz 2006, 22:10

Re: JForex

Nieprzeczytany post autor: raposo »

Konwerter kodu z MQL na Javę dostępny jest na samej JForex. Problem jest jednak taki, że prawie nigdy nie działa on w 100% dobrze (zresztą jak każdy konwerter), co ostatecznie sprowadza się do wprowadzenia poprawek ręcznie lub napisania kodu od nowa (co podobno czasem jest prostsze).
ForexClub.pl
- Forex Club Tools
- Program Podatek 7.0
- RABATY PROWIZJI
| IC Markets (-21%) | Tickmill (-10%) | XTB (Pakiet książek) | Dukascopy (narzędzia do JForex) | LMAX (-20%) | FxPro (do -15%)

Zapraszamy do kontaktu

FreeWay

Re: JForex

Nieprzeczytany post autor: FreeWay »

Tego programu już nie ma , pytałem na czacie supportu , a orientujesz się może ile kosztje przepisanie np 1 strategi ? i czy tym programem jest sens kombinować? http://old.forexclub.pl/brokerzy/dukasc ... -mql-java/

ODPOWIEDZ