Bonjour à tous,
Je vous propose d'ouvrir un topic sur la plateforme JForex, afin d'y partager nos connaissances sur le sujet.
JForex est plateforme de trading au meme titre que metatrader, d'apres ce que j'ai pu trouver elle est proposé par les broker suivant :
Dukascopy Bank SA , Dukascopy EU , FXDD , Alpari-US , Chemeximbank Russia , AVA Fx Japan , vPE Bank AG , Halifax , Min Bank Russia , Forex FS , EverestMarkets, KaKaKuFx Japan.
En ce qui me concerne je n'ai essayé que chez Dukascopy.
Pourquoi utiliser JForex plutot que Metatrader ?
Tout d'abord la plateforme est bien faite et complete, donc qu'on ai ou non l'intention de programmer elle est appreciable.
Mais pour moi qui suit developpeur JAVA, le gros avantage c'est justement l'API java qui permet de developper ses propres script,EA ou indicateurs.
L'autre gros avantage est de pouvoir programmer dans des editeurs fait pour ça, tel que Eclipse ou Netbeans qui sont deux plateforme extrêmement complète et entièrement gratuite, j'utilise d'ailleurs quotidiennement Eclipse de manière professionnel !
Il existe une autre plateforme dont la version pro (payante) a une excellente réputation , il s'agit IntelliJ Idea.
Vu qu'il ne s'agit pas du sujet de ce post, ceux qui voudrait apprendre le JAVA devrait pouvoir trouver enormement de resources sur le net, le site du zéro fait generalement de tres bon tutoriel, voici le lien vers celui sur JAVA :
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-java
Hormis les considération technique tel que la programmation orienté objets, JEE et la multitude de possibilité qu'offre JAVA, l'avantage non négligeable qui vient immédiatement a l'esprit concernant java c'est un langage qui tourne aussi bien sur Windows,Linux ou Mac .
Vous connaissez certainement ProRealtime qui est un logiciel fait en JAVA, ce qui vous montre bien l'etendu des possibilité qu'offre ce langage en plus d'etre multi plateforme !
Voici un lien vers la plateforme JForex de dukascopy :
http://www.dukascopy.com/swiss/french/forex/dealstation/?c1#JForex
Un compte démo se créé en 2 minutes et n'engage à rien, donc si vous etes curieux, y a pas de raisons de ne pas essayer.
Les liens indispenssable si on souhaite coder en java, sont le wiki de dukascopy qui est tres complet :
http://www.dukascopy.com/wiki/
Et la javadoc de l'api JForex :
http://www.dukascopy.com/client/javadoc/
Pour ceux qui aime avoir des exemples, il suffit de se rendre sur la page du concours de trading automatisé mensuel de dukascopy, par exemple voici le classement du mois dernier :
http://www.dukascopy.com/strategycontest/?action=contestResults
La on peut cliquer sur n'importe quel pseudo, par exemple le premier (tant qu'a faire) et télécharger sa strategy !!
Voila donc le code de l'expert Advisor qui a gagné le concours du mois d'octobre 2013 :
Je m'arrete la pour le moment, mais je reviendrais poster sur ce sujet, en attendant n'hésitez pas a participer d'une maniere ou d'une autre.
Je vous propose d'ouvrir un topic sur la plateforme JForex, afin d'y partager nos connaissances sur le sujet.
JForex est plateforme de trading au meme titre que metatrader, d'apres ce que j'ai pu trouver elle est proposé par les broker suivant :
Dukascopy Bank SA , Dukascopy EU , FXDD , Alpari-US , Chemeximbank Russia , AVA Fx Japan , vPE Bank AG , Halifax , Min Bank Russia , Forex FS , EverestMarkets, KaKaKuFx Japan.
En ce qui me concerne je n'ai essayé que chez Dukascopy.
Pourquoi utiliser JForex plutot que Metatrader ?
Tout d'abord la plateforme est bien faite et complete, donc qu'on ai ou non l'intention de programmer elle est appreciable.
Mais pour moi qui suit developpeur JAVA, le gros avantage c'est justement l'API java qui permet de developper ses propres script,EA ou indicateurs.
L'autre gros avantage est de pouvoir programmer dans des editeurs fait pour ça, tel que Eclipse ou Netbeans qui sont deux plateforme extrêmement complète et entièrement gratuite, j'utilise d'ailleurs quotidiennement Eclipse de manière professionnel !
Il existe une autre plateforme dont la version pro (payante) a une excellente réputation , il s'agit IntelliJ Idea.
Vu qu'il ne s'agit pas du sujet de ce post, ceux qui voudrait apprendre le JAVA devrait pouvoir trouver enormement de resources sur le net, le site du zéro fait generalement de tres bon tutoriel, voici le lien vers celui sur JAVA :
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-java
Hormis les considération technique tel que la programmation orienté objets, JEE et la multitude de possibilité qu'offre JAVA, l'avantage non négligeable qui vient immédiatement a l'esprit concernant java c'est un langage qui tourne aussi bien sur Windows,Linux ou Mac .
Vous connaissez certainement ProRealtime qui est un logiciel fait en JAVA, ce qui vous montre bien l'etendu des possibilité qu'offre ce langage en plus d'etre multi plateforme !
Voici un lien vers la plateforme JForex de dukascopy :
http://www.dukascopy.com/swiss/french/forex/dealstation/?c1#JForex
Un compte démo se créé en 2 minutes et n'engage à rien, donc si vous etes curieux, y a pas de raisons de ne pas essayer.
Les liens indispenssable si on souhaite coder en java, sont le wiki de dukascopy qui est tres complet :
http://www.dukascopy.com/wiki/
Et la javadoc de l'api JForex :
http://www.dukascopy.com/client/javadoc/
Pour ceux qui aime avoir des exemples, il suffit de se rendre sur la page du concours de trading automatisé mensuel de dukascopy, par exemple voici le classement du mois dernier :
http://www.dukascopy.com/strategycontest/?action=contestResults
La on peut cliquer sur n'importe quel pseudo, par exemple le premier (tant qu'a faire) et télécharger sa strategy !!
Voila donc le code de l'expert Advisor qui a gagné le concours du mois d'octobre 2013 :
Code
//*********************************************************************
//** STRATEGY OF HO NAM FOR STRATEGY CONTEST IN DUKASCOPY BANK **
//** NOVEMBER - 2013 **
//** PLEASE VOTE TO ME WHEN YOU DOWN LOAD MY STRATEGY ! **
//** THANK YOU VERU MUCH **
//*********************************************************************
package jforex;
import com.dukascopy.api.*;
import java.util.*;
import com.dukascopy.api.IIndicators.MaType;
import com.dukascopy.api.IIndicators;
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.IEngine.OrderCommand;
import com.dukascopy.api.IIndicators.MaType;
import com.dukascopy.api.IIndicators.AppliedPrice;
public class Rich_Dream_hn11b implements IStrategy {
private IContext context = null;
private IEngine engine = null;
private IChart chart = null;
private IHistory history = null;
private IIndicators indicators = null;
private IConsole console = null;
private double volume = 1;
private double lotshare = 30000;
private double clock1 = 290000;
private double clock2 = clock1 + 3000;
private double profitLimit;
private double lossLimit;
private double bidPrice;
private double askPrice;
private double accountEquity;
private Filter indicatorFilter = Filter.NO_FILTER;
public Period period ;
public Period period5 = Period.FIVE_MINS;
public Period period15 = Period.FIFTEEN_MINS;
public Period period1 = Period.ONE_HOUR;
private double buysell = 0;
private double arj = 25 ;
private double arj1 = 40 ;
private double are = 35 ;
private MaType MaSma = MaType.SMA;
public void onStart(IContext context) throws JFException
{
Set subscribedInstruments = new HashSet();
subscribedInstruments.add(Instrument.GBPJPY);
subscribedInstruments.add(Instrument.USDJPY);
subscribedInstruments.add(Instrument.EURUSD);
context.setSubscribedInstruments(subscribedInstruments);
this.context = context;
engine = context.getEngine();
indicators = context.getIndicators();
history = context.getHistory();
console = context.getConsole();
indicators = context.getIndicators();
}
public void onStop() throws JFException
{
}
public void onTick(Instrument instrument, ITick tick) throws JFException
{
if ((instrument != Instrument.USDJPY || instrument != Instrument.GBPJPY || instrument != Instrument.EURUSD)&& (period != Period.ONE_HOUR ||period != Period.FIFTEEN_MINS || period != Period.FIVE_MINS)) return;
}
protected int positionsTotal(Instrument instrument) throws JFException
{
int counter = 0;
for (IOrder order : engine.getOrders(instrument)) {
if (order.getState() == IOrder.State.FILLED)
{
counter++;
}
}
return counter;
}
protected String getLabel(Instrument instrument)
{
String label = instrument.name();
long time = new java.util.Date().getTime();
label = label.substring(0, 2) + label.substring(3, 5);
label = label + time;
label = label.toLowerCase();
return label;
}
public void onBar(Instrument instrument, Period period, IBar askbar, IBar bidbar) throws JFException
{
if(period == Period.ONE_HOUR||period == Period.FIFTEEN_MINS||period == Period.FIVE_MINS) { //-
if (askbar.getVolume() == 0) return;
double openPrice = bidbar.getOpen();
askPrice = askbar.getClose();
bidPrice = bidbar.getClose();
double adxr = indicators.adxr(instrument,period1,OfferSide.BID,14,0);
if (accountEquity < clock1)
{
if (instrument == Instrument.USDJPY)
{
profitLimit = 71;
lossLimit = 46;
}
else
if (instrument == Instrument.GBPJPY)
{
profitLimit = 110;
lossLimit = 42;
}
else
if (instrument == Instrument.EURUSD)
{
profitLimit = 9;
lossLimit = 31;
}
}
else
if (accountEquity > clock1)
{
if (instrument == Instrument.USDJPY)
{
profitLimit = 46;
lossLimit = 46;
}
else
if (instrument == Instrument.GBPJPY)
{
profitLimit = 55;
lossLimit = 40;
}
else
if (instrument == Instrument.EURUSD)
{
profitLimit = 6;
lossLimit = 31;
}
}
if ((engine.getOrders().isEmpty()) && (instrument == Instrument.USDJPY||instrument == Instrument.GBPJPY||instrument == Instrument.EURUSD))
{ //--------
if (instrument == Instrument.GBPJPY )
{
GBPJPYZONE(instrument,period,engine, profitLimit,lossLimit,volume,askbar,bidbar);
}
else
if (instrument == Instrument.USDJPY && adxr > arj1 )
{
USDJPYZONE(instrument,period,engine, profitLimit,lossLimit,volume,askbar,bidbar);
}
else
if (instrument == Instrument.EURUSD && adxr < are )
{
EURUSDZONE(instrument,period,engine, profitLimit,lossLimit,volume,askbar,bidbar);
}
else;
} //--------
}//-
}
public void onMessage(IMessage message) throws JFException
{
if (message != null && message.getType() == IMessage.Type.ORDER_CLOSE_OK)
{
IOrder lastOne = message.getOrder();
double profitsLoss = lastOne.getProfitLossInPips();
console.getOut().println("Order : "+lastOne.getLabel()+ " "+ lastOne.getOrderCommand()+ " Pips: "+profitsLoss);
}
}
public void onAccount(IAccount account) throws JFException
{
accountEquity = account.getEquity();
if (accountEquity < 110000)
volume = accountEquity/lotshare;
else
if (accountEquity < clock1 && accountEquity > 110000 || accountEquity == 110000)
volume = 5.5;
else
if (accountEquity > clock1 && accountEquity < clock2)
volume = 0.3;
else
if (accountEquity > clock2)
volume = 0.1;
}
public void sell(Instrument instrument, IEngine engine, double takeProfitPipLevel, double endLossPipLevel, double volumeParam) throws JFException
{
engine.submitOrder(getLabel(instrument), instrument, IEngine.OrderCommand.SELL, volumeParam,bidPrice,4, bidPrice
+ instrument.getPipValue() *endLossPipLevel, bidPrice - instrument.getPipValue() * takeProfitPipLevel);
}
public void buy(Instrument instrument, IEngine engine, double takeProfitPipLevel, double endLossPipLevel, double volumeParam) throws JFException
{
engine.submitOrder(getLabel(instrument), instrument, IEngine.OrderCommand.BUY, volumeParam,askPrice,4, askPrice
- instrument.getPipValue() * endLossPipLevel, askPrice + instrument.getPipValue() * takeProfitPipLevel);
}
public void closeOppositeIfExist(OrderCommand command) throws JFException {
if (engine.getOrders().size() == 0)
{
return;
}
for (IOrder order: engine.getOrders())
{
if (!order.getOrderCommand().equals(command))
{
order.close();
}
}
}
private void setStopLossPrice(double price,OfferSide side,double trailingStep) throws JFException
{
if (engine.getOrders().size() == 0)
{
return;
}
for (IOrder order: engine.getOrders())
{
order.setStopLossPrice(price,OfferSide.ASK,trailingStep);
}
}
public void GBPJPYZONE(Instrument instrument,Period period ,IEngine engine, double takeProfitPipLevel, double endLossPipLevel, double volumeParam,IBar askbar, IBar bidbar) throws JFException
{
if (askbar.getVolume() == 0) return;
double vFactor = 1;
int timePeriod = 21;
int timePeriod1 = 14;
int timePeriod2 = 14;
int shift = 0;
IBar prevBar = history.getBar(instrument, period, OfferSide.BID, 1);
double openPrice = bidbar.getOpen();
askPrice = askbar.getClose();
bidPrice = bidbar.getClose();
double PrevBarOpen = prevBar.getOpen();
double PrevBarClose = prevBar.getClose();
double maA = indicators.t3(instrument, period, OfferSide.BID, IIndicators.AppliedPrice.CLOSE, timePeriod, vFactor, shift);
if (PrevBarOpen < maA && PrevBarClose > maA )
{
sell(instrument, engine,endLossPipLevel,takeProfitPipLevel, volumeParam);
}
else
if (PrevBarOpen > maA && PrevBarClose < maA )
{
buy(instrument, engine,endLossPipLevel,takeProfitPipLevel, volumeParam);
}
}
public void USDJPYZONE(Instrument instrument,Period period ,IEngine engine, double takeProfitPipLevel, double endLossPipLevel, double volumeParam,IBar askbar, IBar bidbar) throws JFException
{
int shift=0;
double ratio=0.37;
if (askbar.getVolume() == 0) return;
double openPrice = bidbar.getOpen();
askPrice = askbar.getClose();
bidPrice = bidbar.getClose();
IBar prevBar = history.getBar(instrument, period, OfferSide.BID, 1);
double shortM = indicators.t3(instrument, period, OfferSide.BID, IIndicators.AppliedPrice.CLOSE, 16, 1, 0);
double cci = indicators.cci(instrument, period, OfferSide.BID, 16, 0);
double longM = indicators.t3(instrument, period, OfferSide.BID, IIndicators.AppliedPrice.CLOSE, 20, 1, 0);
if ((prevBar.getOpen() < longM && prevBar.getClose() > longM) && (prevBar.getClose() > shortM)) {
buy(instrument, engine,endLossPipLevel,takeProfitPipLevel, volumeParam);
}
else
if ((prevBar.getOpen() > longM && prevBar.getClose() < longM) && (prevBar.getClose() < shortM)){
sell(instrument, engine,endLossPipLevel,takeProfitPipLevel, volumeParam);
}
}
public void EURUSDZONE(Instrument instrument,Period period ,IEngine engine, double takeProfitPipLevel, double endLossPipLevel, double volumeParam,IBar askbar, IBar bidbar) throws JFException
{
int shift=0;
IBar prevBar = history.getBar(instrument, period, OfferSide.BID, 1);
OrderCommand orderCommand;
if (askbar.getVolume() == 0) return;
double openPrice = bidbar.getOpen();
askPrice = askbar.getClose();
bidPrice = bidbar.getClose();
double[] BB = indicators.bbands(instrument, period, OfferSide.BID, IIndicators.AppliedPrice.CLOSE,10,2,2,MaSma,shift);
double rsi9 = indicators.rsi(instrument, period, OfferSide.BID, IIndicators.AppliedPrice.CLOSE, 9, shift);
if ((prevBar.getOpen() > BB[1]) && (rsi9 > 70)){
sell(instrument, engine,takeProfitPipLevel,endLossPipLevel, volumeParam);
}
else
if ((prevBar.getOpen() < BB[2]) && (rsi9 < 30)){
buy(instrument, engine,takeProfitPipLevel,endLossPipLevel, volumeParam);
}
}
}
Je m'arrete la pour le moment, mais je reviendrais poster sur ce sujet, en attendant n'hésitez pas a participer d'une maniere ou d'une autre.