Ejecutar en Remote Run

Foro dedicado a la plataforma de trading de divisas de Dukascopy en la que la programación de estrategias se realiza mediante Java.
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Ejecutar en Remote Run

Mensaje por eurer »

Hola máscara, sube lo que tengas, que seguro que a alguien le puede ser útil, nunca se sabe.
Aquí pongo el enlace directo a la jstore de Dukascopy Bank.
https://www.dukascopy.com/jstore/
Si escriben la palabra Dukascopy en el hueco que está en la parte superior derecha, saldrán las estrategias oficiales de Dukascopy(logotipo de color rojo) en su versión .java(código fuente).Cualquiera las puede modificar a su gusto.
Lástima que las hicieran sólo para Local Run.
Si alguien sabe que hay que modificar para hacerlas Remote Run , por favor, que lo explique, si no es muy complicado.
Aquí pongo un ejemplo de Dukascopy: buscar en el hueco el nombre Struddle , es la que dice Struddle Distance
A strategy opens 2 pending stop orders with a distance (in pips) from current market price (not stop limit orders) 1 buy and 1 sell, with ability to chose trigger method (either bid or ask price for both of them) + OCO + slippage control + auto breakeven function half a pip higher to compensate for commission + take profit and stop loss.
No puedo subir la estrategia, me dice la web que la extensión no está permitida.
X-Trader, podrías habilitar esa opción?
Gracias,
un saludo.
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Ejecutar en Remote Run

Mensaje por mascara »

En principio, para que puedas ejecutarla en remoto en los servidores de dukas:
1.- No puedes usar archivos, si la estrategia escribe o lee de algún archivo tendrías que quitarlo...
2.- No puedes usar el objeto "chart", es el objeto que represanta una ventana de gráficos, y en remoto no está disponible porque no tienes entorno gráfico...
3.- En general no puedes hacer nada que sea gráfico, por ejemplo si la estrategiaabre una pestaña de las de la parte inferior de la pantalla de jforex, también tendrías que quitarlo...
no se me ocurre nada más ahora...
de todas formas he mirado la que mencionas y me parece que no tiene nada de eso... ¿Esa casca en remoto?... Si eso mira a ver en el log de la estrategia a ver si dice algo...

Hace unos días me fije que había unos métodos nuevos en la clase instrument: getPrimaryJFCurrency y getSecondaryJFCurrency, que deben reemplazar a los anteriores: getPrimaryCurrency y getSecondaryCurrency ( el propio editor te los marca como obsoletos a estos dos...). Pues usé los nuevos, y en local ni un problema, en remoto no iba ni a tiros, ni un mensaje de error ni nada, simplemente se paraba... total dos horas hasta que descubrí que era por usar los nuevos... los cambie, y ni un problema... para mear y no echar gota :-D
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

La acabó de probar en Remote Run y se para:
Reason: Stopped by Engine

No tengo ni idea de programación, cómo se que 1,2,3 no forman parte de la estrategia?
Te pongo el código fuente:

Código: Seleccionar todo

package jforex.strategies.indicators;

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

import com.dukascopy.api.*;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.indicators.IIndicator;
import java.math.BigDecimal;
import java.util.Calendar;

public class StruddleDistance implements IStrategy {

    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IIndicators indicators;
    private int counter = 0;
    
    @Configurable("Instrument")
    public Instrument instrument = Instrument.EURUSD;
    @Configurable("Long order Offer side")
    public OfferSide longOfferSide = OfferSide.BID;
    @Configurable("Short order Offer side")
    public OfferSide shortOfferSide = OfferSide.BID;
    
    @Configurable("Amount")
    public double amount = 0.02;
    @Configurable("Slippage")
    public double slippage = 10;
    @Configurable("Take profit pips")
    public int takeProfitPips = 20;
    @Configurable("Stop loss in pips")
    public int stopLossPips = 20;
    
    
    @Configurable("Order open distance")
    public double openDistance = 10;
    
    
    @Configurable("Long Stop order open side")
    public OfferSide offerSideLongOrd = OfferSide.ASK;
    @Configurable("Short Stop order open side")
    public OfferSide offerSideShortOrd = OfferSide.BID;
    
    @Configurable("Break even (pips)")
    public double breakEven = 0.5;
    @Configurable("Break even trigger (pips)")
    public double beTrig = 3;
    @Configurable("Trailing stop trigger (pips)")
    public double trailingStopTrigPips = 4;
    @Configurable("Trailing stop (pips) - i.e. (buystop - sellstop) / 2")
    public double trailingStopPips = 1;
    @Configurable("Order expiration time - minutes")
    public int expireTimeMin = 30;
    @Configurable("Order expiration time - seconds")
    public int expireTimeSec = 0;
    
//    @Configurable("Sart time - hours (24 hour clock)")
//    public int hour = Calendar.getInstance(TimeZone.getDefault()).get(Calendar.HOUR_OF_DAY);
//    @Configurable("Sart time - minutes")
//    public int minute = Calendar.getInstance(TimeZone.getDefault()).get(Calendar.MINUTE);
//    @Configurable("Sart time - seconds")
//    public int second = Calendar.getInstance(TimeZone.getDefault()).get(Calendar.SECOND);
//    @Configurable("Reopen orders")
//    public boolean reopen = true;
    
    public boolean opened = false;
    private long expireTime = 0;
    private boolean isStarted = false;
    @SuppressWarnings("serial")
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") {
        {
            setTimeZone(TimeZone.getTimeZone("GMT"));
        }
    };
    
    private IOrder buyOrder;
    private IOrder sellOrder;
    private Calendar startTime;

    @Override
    public void onStart(IContext context) throws JFException {
        this.console = context.getConsole();
        this.indicators = context.getIndicators();
        this.history = context.getHistory();
        this.engine = context.getEngine();
        
        ITick tick = history.getLastTick(instrument);
        // submit
        //if (buyOrder == null && sellOrder == null && (reopen || !opened)) {
        if (buyOrder == null && sellOrder == null && !opened) {
            opened = true;
            buyOrder = submitBuyStop(tick);
            sellOrder = submitSellStop(tick);
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(tick.getTime());
            
            cal.add(Calendar.MINUTE, expireTimeMin);
            cal.add(Calendar.SECOND, expireTimeSec);
            expireTime = cal.getTimeInMillis();
            
        }

        // buy when longOfferSide drops by trailingPips
        //ITick tick = history.getLastTick(instrument);

//        startTime = Calendar.getInstance(TimeZone.getDefault());
//        startTime.setTimeInMillis(tick.getTime());
//
//        startTime.set(Calendar.HOUR_OF_DAY, hour);
//        startTime.set(Calendar.MINUTE, minute);
//        startTime.set(Calendar.SECOND, second);
//
//        if (startTime.compareTo(Calendar.getInstance()) < 0) {
//            startTime.add(Calendar.DATE, 1);
//        }
    }

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

    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if (instrument != this.instrument) {
            return;
        }

//        if (!isStarted) {
//            if (startTime.getTimeInMillis() < tick.getTime()) {
//                isStarted = true;
//            } else {
//                return;
//            }
//        }
        
        IOrder order = null;

        // orders expired
        if (0 != expireTime && expireTime < tick.getTime()) {
                        
            if (buyOrder != null
                    && (buyOrder.getState().equals(IOrder.State.CREATED) || buyOrder.getState().equals(IOrder.State.OPENED))) {
                buyOrder.close();
                buyOrder = null;
                expireTime = 0;
            }
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Ejecutar en Remote Run

Mensaje por mascara »

El código que has puesto se ha cortado :-D , pero de todas formas, me lo he bajado de dukas. En remoto no va porque no suscribe el par que usa... En local funciona porque usaras un par que ya está activo en la plataforma, es decir que ya estás recibiendo datos de ese par... Pero en remoto hay que suscribirse a él... Total, para apañarlo...
en el onStart, entre las líneas

this.engine = context.getEngine(); ( línea 88 aprox)
y
ITick tick = history.getLastTick(instrument);

añade esto:
java.util.Set<Instrument> instruments = new java.util.HashSet<Instrument>();
instruments.add(instrument);
context.setSubscribedInstruments(instruments, true);

Ten cuidado porque en remoto significa que estas en cuenta real, a ver si por probar lo vas a ejecutar y te abre algo que no querías...
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: NUEVA SECCIÓN: SOFTWARE

Mensaje por eurer »

Muchas gracias por la respuesta!
Pero lo último si para la demo pides slots, te los dan, con lo cual lo puedes ejecutar en Remote Run utilizando demo.
Yo les pedí 5 slots para la demo ilimitada, y me los dieron.
Un saludo.

Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Ejecutar en Remote Run

Mensaje por X-Trader »

eurer escribió: (...) No puedo subir la estrategia, me dice la web que la extensión no está permitida.
X-Trader, podrías habilitar esa opción?
Gracias,
un saludo.
Hola eurer, lo siento pero por seguridad no se permite subir código Java directamente, lo mejor es subirlo con extensión txt o en su defecto pegarlo en el mensaje dentro de las etiquetas [ code] [ /code]

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Ejecutar en Remote Run

Mensaje por mascara »

eurer escribió: Pero lo último si para la demo pides slots, te los dan, con lo cual lo puedes ejecutar en Remote Run utilizando demo.
Yo les pedí 5 slots para la demo ilimitada, y me los dieron.
Un saludo.
joer, ahora me entero! Con lo que me molestaba a mi justo hace dos o tres semanas no poder dejar una prueba en remoto!... Pues ya les estoy escribiendo un mensaje ahora mismo! Gracias jeje
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

De nada, yo se lo pedí a Support.
Lo de los slots, que puedas tener una Estrategia o más, o como se llama en MT4, un EA sin tener que contratar un VPS es uno de los puntos fuertes en el tema de automatización de Estrategias que tiene Dukascopy.
En un año que llevo utilizando los Remote Servers no han fallado nunca, y espero que sigan así. :D
Para una cuenta real por defecto te dan 200 slots, pero vamos, si necesitas más, te los dan, ya que es síntoma de que estarías operando mucho, y es lo que quieren que hagas.
Un saludo.
Última edición por eurer el 28 Jul 2014 23:36, editado 1 vez en total.
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

Hola máscara, he probado con otras Estrategias y consigo ponerlo en Remote Run, pero para una que se llama Stop Manager, que es de Dukascopy, me da fallo al compilarla, copié lo que me dijiste debajo de ...
this.engine = context.getEngine();

pero no funciona.Me puedes ayudar?
Ya si la puedes hacer para que pueda coger el par de divisas que quiera pues mucho mejor, quiero tener varios pares en una misma cuenta, y tal como está programada la Estrategia no podría.

Código: Seleccionar todo


    StopManager.java
    version 1.0
    Copyright 2010 Quantisan.com

    Move stops to breakeven when equidistance to original stop loss

*/

package jforex;

import com.dukascopy.api.*;

public class StopManager implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IContext context;
    
    @Configurable("Lock-in Pips for Breakeven")
    public int lockPip = 3;
    
    @Configurable("Move stop to breakeven?")
    public boolean moveBE = true;
    
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        java.util.Set<Instrument> instruments = new java.util.HashSet<Instrument>();
        instruments.add(instrument); 
        context.setSubscribedInstruments(instruments, true);
        this.console = context.getConsole();
        this.context = context;
    }

    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 {
        for (IOrder order : engine.getOrders(instrument)) {
            if (order.getState() == IOrder.State.FILLED) {
                boolean isLong;
                double open, stop, diff, newStop;
                String label = order.getLabel();
                IChart chart;
                
                isLong = order.isLong();
                open = order.getOpenPrice();
                stop = order.getStopLossPrice(); 
                diff = open - stop;        // stop loss distance
                
                if (isLong) {            // long side order        
                    if (moveBE && diff > 0 && tick.getBid() > (open + diff)) {
                        // make it breakeven trade + lock in a few pips
                        newStop = open + instrument.getPipValue() * lockPip;
                        order.setStopLossPrice(newStop);                        
                        console.getOut().println(label + ": Moved stop to breakeven");
                        
                        chart = this.context.getChart(instrument);
                        chart.draw(label + "_BE", IChart.Type.SIGNAL_UP, tick.getTime(), newStop);
                    }    
                }
                else {                    // short side order            
                    // Move to breakeven
                    if (moveBE && diff < 0 && tick.getAsk() < (open + diff)) {    // diff is negative                        
                        // make it breakeven trade + lock in a few pips
                        newStop = open - (instrument.getPipValue() * lockPip);
                        order.setStopLossPrice(newStop);
                        console.getOut().println(label + ": Moved stop to breakeven");
                        
                        chart = this.context.getChart(instrument);
                        chart.draw(label + "_BE", IChart.Type.SIGNAL_DOWN, tick.getTime(), newStop);
                    }                
                }
            }
        }    
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }
} 
Adjuntos
Variables
Variables
Jstore
Jstore
Última edición por eurer el 28 Jul 2014 23:54, editado 6 veces en total.
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

X-Trader escribió:
eurer escribió: (...) No puedo subir la estrategia, me dice la web que la extensión no está permitida.
X-Trader, podrías habilitar esa opción?
Gracias,
un saludo.
Hola eurer, lo siento pero por seguridad no se permite subir código Java directamente, lo mejor es subirlo con extensión txt o en su defecto pegarlo en el mensaje dentro de las etiquetas [ code] [ /code]

Saludos,
X-Trader
Hola X-Tarder,
Cómo hago lo de las etiquetas?
Lo probé pero no me salió. :oops:
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Ejecutar en Remote Run

Mensaje por X-Trader »

eurer escribió:
Hola X-Trader,
Cómo hago lo de las etiquetas?
Lo probé pero no me salió. :oops:
Te lo acabo de arreglar, se te había colado un espacio dentro del primer code ;)

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Ejecutar en Remote Run

Mensaje por mascara »

Hola Eurer,

Prueba esta versión, a ver que tal te va... La he llamado StopManagerInstruments...

Código: Seleccionar todo

/*

    StopManager.java
    version 1.0
    Copyright 2010 Quantisan.com

    Move stops to breakeven when equidistance to original stop loss

*/

package jforex;

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

public class StopManagerInstruments implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IContext context;
    
    @Configurable("Instruments") public Set<Instrument> eInstruments = new HashSet<Instrument>( Arrays.asList(new Instrument[] {
                                                                                                    Instrument.EURUSD, Instrument.EURGBP
                                                                                               })) ;  
    @Configurable("Lock-in Pips for Breakeven")
    public int lockPip = 3;
    
    @Configurable("Move stop to breakeven?")
    public boolean moveBE = true;
    
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.context = context;
        
        context.setSubscribedInstruments(eInstruments);  // nos subscribimos a los pares seleccionados...
    }

    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 {

        if(eInstruments.contains(instrument)){//El bloque for solo  cuando el par está entre los seleccionados...
          for (IOrder order : engine.getOrders(instrument)) {
            if (order.getState() == IOrder.State.FILLED) {
                boolean isLong;
                double open, stop, diff, newStop;
                String label = order.getLabel();
                IChart chart;
                
                isLong = order.isLong();
                open = order.getOpenPrice();
                stop = order.getStopLossPrice(); 
                diff = open - stop;        // stop loss distance
                
                if (isLong) {            // long side order        
                    if (moveBE && diff > 0 && tick.getBid() > (open + diff)) {
                        // make it breakeven trade + lock in a few pips
                        newStop = open + instrument.getPipValue() * lockPip;
                        order.setStopLossPrice(newStop);                        
                        console.getOut().println(label + ": Moved stop to breakeven");
                        
                        chart = this.context.getChart(instrument);
                        chart.draw(label + "_BE", IChart.Type.SIGNAL_UP, tick.getTime(), newStop);
                    }    
                }
                else {                    // short side order            
                    // Move to breakeven
                    if (moveBE && diff < 0 && tick.getAsk() < (open + diff)) {    // diff is negative                        
                        // make it breakeven trade + lock in a few pips
                        newStop = open - (instrument.getPipValue() * lockPip);
                        order.setStopLossPrice(newStop);
                        console.getOut().println(label + ": Moved stop to breakeven");
                        
                        chart = this.context.getChart(instrument);
                        chart.draw(label + "_BE", IChart.Type.SIGNAL_DOWN, tick.getTime(), newStop);
                    }                
                }
            }
        }    
        }//fin if(eInstruments.contains(instrument))
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }
}
Saludos,
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

Mil Gracias! :D
Lo he compilado y puesto en Remote y todo bien.
Estoy esperando a que haga el trailing stop hasta el breakeven para asegurarme y luego utilizarlo en la cuenta real.
Este tipo de estrategias son las que se podrían poner en la sección de software de la web, ideas sencillas y que seguro que muchos usuarios alguna vez se habrán planteado utilizar pero por no saber programar no han llevado las ideas a la realidad.
Un saludo.
Avatar de Usuario
eurer
Mensajes: 789
Registrado: 09 May 2005 16:05
Ubicación: Tenerife

Re: Ejecutar en Remote Run

Mensaje por eurer »

Hola,
pues no se ha modificado el precio como yo esperaba, debería de estar el stop loss ahora en el breakeven, y no ha sido modificado por la estrategia.
Puse 10 pips de breakeven, entonces como el precio ha avanzado más de 10 pips, el nuevo stop loss debería de ser 102,09 , justo en el precio de entrada de la posición larga abierta.
Sin embargo en la captura se ve que no lo ha hecho.
Adjuntos
Captura2.JPG
Captura.JPG
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Ejecutar en Remote Run

Mensaje por mascara »

¿En el log no sale nada escrito?. No sé por qué no lo habrá hecho pero creo que de todas formas no lo habría hecho como esperas. Si no me equivoco leyendo el programa ( no he probado porque no tengo activado lo de remoto en la cuenta demo...). Lo que hace es lo siguiente ( para longs, que es el caso ).

Calcula la diferencia entre en precio de Open y el StopLoss, en este caso, suponiendo que 101,99 es el StopLoss original que le pusiste a la orden sería

(1) diff = 102,09 - 101,99 = 0,1

Si esta diferencia es positiva (por ser longs, supongo que es solo para que se haga una sola vez, ya que una vez colocado en breakevent esa resta será negativa en el caso longs ( el stop estará ya por encima del open...) ) y el Bid es mayor que el Open + los 0,1 anteriores, modifica el StopLoss. En este caso sería Suponiendo que el Bid sea el precio actual ( por poner uno aproximado... )

(2) ¿102,208 > (102,09 + 0,1) ? Sí (aunque por los pelos, con el Bid real no sé si se habría cumplido...).

Ahora calcula, el nuevo StopLoss tal que sea el Open + los pips que le indicaste. En este caso sería
(3) StopLoss = 102,09 + 10Pips = 102,19.

Así que el pto (2) no sé porque no habrá cumplido la condición pero de todas formas, el pto (3) te habría puesto el StopLoss 10 pips por encima del precio, no es que haya que esperar a que gane 10 pips para moverlo y ponerlo a 0 de breakevent...

Para resumirlo con otras palabras, a ver si me explico... Parece que te va a poner en breakevent cuando el Bid esté por encima del Open más el Stop que pusiste original (2)... Es decir si cuando creaste la orden pusiste 30 pips de Stop, te colocará el nuevo Stop a 10 pips (3) del Open cuando lleves ganados 30 pips (2)...
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “JForex”