Duda JForex Programación

Foro dedicado a la plataforma de trading de divisas de Dukascopy en la que la programación de estrategias se realiza mediante Java.
Responder
Xavi
Mensajes: 27
Registrado: 04 May 2006 14:53

Duda JForex Programación

Mensaje por Xavi » 07 Nov 2016 15:48

Buenas chicos.

Una consulta para aquellos que hayan programado en JForex.

Estaba migrando una estrategia a JForex y pensaba que el metodo onBar se ejecutaba al inicio de cada vela pero por lo que entiendo ahora se ve que no, que el onBar se ejecutada al FINAL de cada vela.

Es asi realmente?
Como controlais el inicio de una nueva vela, con el onTick y gestionando eso? algo parecido a como se hace en MT4 para controlar el inicio de velas?

Muchas gracias.
Saludos.




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

Re: Duda JForex Programación

Mensaje por X-Trader » 07 Nov 2016 16:14

Lo muevo aquí, que para algo tenemos un foro de JForex ;)

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: 319
Registrado: 18 Oct 2007 23:15

Re: Duda JForex Programación

Mensaje por mascara » 07 Nov 2016 22:30

Hola,

El onBar se ejecuta al cerrarse la vela, pero al cerrarse una vela empieza una nueva del mismo periodo... Así que quizás igual te podría servir el onBar... Si lo que quieres son los datos de la nueva vela, el método history.getBar te da la vela que quieras. Pasándole 0 en el último parametro te da la actual, 1 la anterior, etc... si lo ejecutas en el onBar la 0 sería la recién abierta y la 1 la misma con la que ha entrado en el onBar...
Si lo que quieres es esperar al primer tick de la vela, inicializando una variable en el onBar podrías controlarlo en el onTick:

Código: Seleccionar todo

package jforex;

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

public class strBarras implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    
    private Period _Period = Period.TEN_SECS;
    private Instrument _Instrument = Instrument.EURUSD;
    private boolean _onBarClosed = false;
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();
    }

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
       if(_onBarClosed == true && instrument.equals(_Instrument)){
           _onBarClosed = false;  
           console.getOut().println("Primer tick: "+ sdf.format(tick.getTime()));
       }
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        if(period.equals(_Period) && instrument.equals(_Instrument)){
           _onBarClosed = true;
           console.getOut().println("Se cierra: "+ askBar.getClose()+"  "+sdf.format(askBar.getTime()));
           IBar b = history.getBar(instrument, period, OfferSide.ASK, 0);
           console.getOut().println("Se abre: "+ b.getClose()+"  "+sdf.format(b.getTime())); 
           console.getOut().println("Apertura barra actual: "+sdf.format(history.getStartTimeOfCurrentBar(instrument, period)));
        }
    }
}


Imagen

Xavi
Mensajes: 27
Registrado: 04 May 2006 14:53

Re: Duda JForex Programación

Mensaje por Xavi » 08 Nov 2016 10:55

Buenas.

Si tienes razon ni sabia que existia este subforo ;)
Y este subforo no tiene como los otros la parte de indicadores y demas?

Gracias Mascara por la explicación al final utilice el metodo onTick para validar el inicio de vela.
Por otra parte otra pregunta:
Como haces para sacar el valor de apertura de una vela diaria? por lo que puedo ver el getBar no funciona para una barra que esta en funcionamiento no?

Si en el tester le pongo que analice de el dia 2016-08-16 (2016-08-16 al 2016-08-17) la siguiente intruccción me devuelve el valor de apertura del dia 15 y no del 16 que fue de 10.698,78 para el DAX

IBar dayCurr = history.getBar(Instrument.DEUIDXEUR, Period.DAILY, OfferSide.BID, 0);
print("dayCurr " + dayCurr);
Devuelve 10.724,98 que es el del dia 15.
09:49:35 dayCurr 1471219200000[2016-08-15 00:00:00.000+0000] O: 10724.981 C: 10730.021 H: 10806.039 L: 10713.317 V: 3.9920000000000004

A ver dandole vueltas me invente una rutina que lo saca pero no deberia haver alguna funcion mas simple?
Lo que hago es recoger multiples velas anteriores de un timefrime pequeño y la primera que coincide en dia con el actual ahi recojo el valor de apertura:

Código: Seleccionar todo

	    double APERTURA = 0;
	    SimpleDateFormat FORMATO_DIA = new SimpleDateFormat("yyyy-MM-dd");
	    
            long prevBarTime = history.getPreviousBarStart(Period.FIVE_MINS, history.getLastTick(myInstrument).getTime());
            List<IBar> bars = history.getBars(myInstrument, Period.FIVE_MINS, OfferSide.BID, Filter.ALL_FLATS, 500, prevBarTime, 0);
             
            for(IBar bar : bars){
                
                if(FORMATO_DIA.format(tick.getTime()).equals(FORMATO_DIA.format(bar.getTime())) ) {
                    Mensaje("SIIIIIIIIIIIIIIIIIIIIIIIIIIIIII EMPIEZA EL DIA   " + bar.getOpen());
                    APERTURA = bar.getOpen();
                    break;
                }
                
            }  



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

Re: Duda JForex Programación

Mensaje por X-Trader » 08 Nov 2016 10:57

Xavi escribió:Buenas.

Si tienes razon ni sabia que existia este subforo ;)
Y este subforo no tiene como los otros la parte de indicadores y demas?

(...)
Por el momento no tengo un volumen suficiente como para abrir la sección, si tienes por ahí una recopilación o una web desde la que descargarlos la abro y empiezo a subirlo todo.

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: 319
Registrado: 18 Oct 2007 23:15

Re: Duda JForex Programación

Mensaje por mascara » 08 Nov 2016 13:35

[quote="Xavi"]
Como haces para sacar el valor de apertura de una vela diaria? por lo que puedo ver el getBar no funciona para una barra que esta en funcionamiento no?
[/quote="Xavi"]

El valor de apertura deberías poder obtenerlo siempre con el getOpen()...
El getBar te da la vela en curso tal como lo pones en el mensaje, eso tiene que estar bien:
IBar dayCurr = history.getBar(Instrument.DEUIDXEUR, Period.DAILY, OfferSide.BID, 0);

El asunto es, el onBar se ejecuta en el cierre de la vela, por tanto la vela ya está cerrada, no es que se esté cerrando en ese momento, y siempre que se cierra una vela se abre otra, así que cuando te llega un onBar la vela que te viene como parámetro ya está cerrada y con la línea de código anterior obtendrías la que justo se acaba de abrir (por el 0)... si sobre esa, aplicas el getOpen tendrías el precio de apertura de la nueva vela, supongo, no sé si para eso habría que esperar mejor al primer tick despues del cierre de la vela...

Creo que el código que pasé en el anterior post, te sirve para lo que quieres ¿no?. Si lo que quieres es hacer algo con la vela que justo se ha abierto, lo puedes hacer en el onBar usando
IBar dayCurr = history.getBar(Instrument.DEUIDXEUR, Period.DAILY, OfferSide.BID, 0);
o esperar al primer tick que se ejecute después del onBar, tal como hago en el ejemplo con la variable _onBarClosed... creo que funciona y me parece más simple...

NOTA: te diría que el formato de imprimir la fecha/hora fuera algo así:
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
porque en tu código estas usando periodos de cinco minutos pero imprimiendo sólo yyyy-MM-dd, te saldrán a cero los minutos y segundos ¿no? y quizás te lleve a confusión...
NOTA 2: Se me iolvidaba otra cosa sobre las fechas, que además tampoco puse en mi ejemplo, y es tener en cuenta la zona horaria:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
GMT, CET o lo que sea... porque igual estás viendo las fechas con -1h o algo así...


Espero que te sirva!


Imagen

Xavi
Mensajes: 27
Registrado: 04 May 2006 14:53

Re: Duda JForex Programación

Mensaje por Xavi » 08 Nov 2016 17:41

Buenas Mascara.

Pues o yo me estoy volviendo loco o el tester tiene algun bug.
Fijate en la imagen.
El codigo es basico

Código: Seleccionar todo

    @Override
    public void onStart(IContext context) throws JFException {
        console = context.getConsole();
        history = context.getHistory();
        context.setSubscribedInstruments(java.util.Collections.singleton(Instrument.EURUSD), true);
   
        SimpleDateFormat FORMATO_XX = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        
        IBar dayCurr = history.getBar(Instrument.DEUIDXEUR, Period.DAILY, OfferSide.BID, 0);
        print("ONSTART      dayCurr.getOpen():   " + dayCurr.getOpen() + "   dayCurr.getTime():  " + FORMATO_XX.format(dayCurr.getTime())   );           
                     
Intento mirar el getbar del Period.DAILY y me devuelve el valor de getOpen: 10.730,021
Cuando si lo miro en un grafico fuera del tester el open del dia 16-08 es de 10-698,78.

Ummmmmmm pero ahora que miro bien veo algo raro, en el recuadro rojo que he marcado en la leyenda me pone dos horas time: (supongo que porque en la config de la plataforma tengo puesto que se vea en ETT(utc+1) )
Time EET 00:00 2016-08-15
Time CET 23:00 2016-08-15

Puede que tenga que ver con las zonas horarias y el history.getBar Period.DAILY coja el precio de apertura de las 23:00 del dia 15? con lo cual de ahi que me de otro valor que no la apertura a las 00:00 en nuestro horario.

Saludos.
Adjuntos
IMAGEN.jpg



jjesus
Mensajes: 1
Registrado: 22 Dic 2018 13:28

Re: Duda JForex Programación

Mensaje por jjesus » 22 Dic 2018 13:31

¿Habéis indicado el período correcto dentro de onBar?




Responder

Volver a “JForex”