Publi

Publi

Página 3 de 3 PrimerPrimer 123
Resultados 21 al 25 de 25


  1. #21




    Reputación:
    Poder de reputación: 4

    Mensajes: 5
    Créditos: 50

    Re: Programar en JForex mi estrategia supersimple


    Publi
    Cita Iniciado por zitrux Ver mensaje
    Lo que tiene de bueno las renko es que te eliminan el ruido de mercado y marcan buenos puntos de soportes y resistencias..., pero aún estoy intentando pillarle el rollo, a ver si consigo algo consistente con ellas.

    Un saludo.
    Ahhhh, muchas gracias zitrux ahora si que me queda claro que sirven para ver mejor los soportes y resistencias.
    Reputacion para usted
    Foro de Forex Trading United

     

  2.                         
    Publi
  3. #22
    Avatar de pilsener
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 167
    Créditos: 732

    Re: Programar en JForex mi estrategia supersimple

    Cita Iniciado por alfreo Ver mensaje
    gracias pilsener pero no veo el indicador de fractal en esa pagina
    Pues como dicen en mi tierra si es un perro te muerde
    oro/attachment.php?s=759850588ae2bfc880bce92265d18de4&attachmentid=9932&d=1362432958" id="attachment9932" rel="Lightbox_42526" >Programar en JForex mi estrategia supersimple-titulo.jpg
    Foro de Forex Trading United



  4. #23
    Avatar de drakko



    Reputación:
    Poder de reputación: 5

    Mensajes: 18
    Créditos: 52

    Re: Programar en JForex mi estrategia supersimple

    muy interesante y es bueno saber que alguien más usa Jforex :-), voy a estar probando lo dicho, ojala no me salgan mas dudas
    Foro de Forex Trading United

     

  5. #24




    Reputación:
    Poder de reputación: 4

    Mensajes: 1
    Créditos: 50

    Re: Programar en JForex mi estrategia supersimple

    Cita Iniciado por Angel_88 Ver mensaje
    Hola chi@s!! He estado haciendo backtest manual de una estrategia muy sencilla basada en roturas de swings en gráficos Renko y da muy buenos resultados, pero claro, si se puede automatizar mejor que mejor.
    La plataforma que uso es JForex del broker Dukaskopy, la idea es programar la estrategia y hacerle el backtest automático en el mismo programa y si sale positiva pues compartirla.
    Paso a detallar la estrategia:
    Para la receta de hoy chicos necesitaremos:
    1. Un par: Cualquiera
    2. Gráfico: Tipo Renko de 5 pips
    3. Indicador: Fractal (7)

    El gráfico tendrá una pinta tal que así:Archivo adjunto 5331

    Operativa: Rotura del último fractal, es decir, entramos largos cuando se supera por 1 pip el fractal superior y entramos cortos cuando se supera por 1 pip el fractal inferior. Recalco lo del último fractal porque si se ha superado un fractal, por ejemplo el superior, no volveremos a entrar largos hasta que se forme un nuevo fractal superior y se supere por 1 pip, no vale mirar los que se han formado en el pasado. Es decir, siempre hay que fijarse en la última onda formada por un fractal superior e inferior y tener colocadas las órdenes de venta y compra correspondientes en cada uno, ya que tarde o temprano alguna de las dos se activará.

    Luego; Señales de entrada:

    • Compra: Rotura por 1pip del último fractal superior.
    • Venta: Rotura por 1pip del último fractal inferior.

    Límites de pérdida/ganancia y gestión de la operación.
    Dependerá del tamaño del gráfico Renko (en este caso 5 pips). El stoploss se pondrá a (tamaño del Renko + 1 pip), es decir en este caso 6 pips, y el Take profit a (tamaño del Renko - 1 pip), es decir 5 pips. Como vemos el riesgo beneficio es negativo, arriesgamos mas de lo que queremos ganar, por lo tanto la gestión de la posición es vital. Cuando la operación vaya 5 pips a nuestro favor, en vez de cerrar la posición con el TP, cerraremos el 50% de la misma y moveremos el stop a Breakeven y pondremos un Trailing Stop de 10 pips para dejar correr la posición.

    Luego; Gestión de entrada:

    • Stoploss: Tamaño Renko + 1pip
    • Takeprofit: Tamaño Renko - 1pip

    Gestión de posición:

    • Si la posición avanza el tamaño del TP a favor, cerramos 50% y ponemos un TrailinStop = 2*Tamaño Renko


    Voy a poner las velas donde entraríamos del gráfico anterior, que es la libra/dollar de hoy mismo:
    Perdon por la parrafada, espero que haya quedado todo claro y si alguien puede compilar la estrategia para JForex pues que la postee para aplicarle un Backtest a ver como se comporta ].

    Un saludo y si hay cualquier duda aquí estoy!!

    Buenas, tras leer tu post me estuve interesando por los gráficos Renko, buscando informacion y posibles sistemas para aplicar a Renko, estuve revisando el código de varios scripts y finalmente en la nueva jstore the Dukascopy encontré este codigo de un sistema muy parecido al que tu planteas. Te podria servir practicamente el 90% del código ya que las únicas diferencias que hay entre el sistema que tu planteas y este son las siguientes:

    1º) El script en vez de usar el indicador "Fractal" (que solo te dibuja flecha) usa el indicador "Fractallines" (dibuja las lineas enteras en vez de solo el indicador).

    2º) El script abre orden directamente al superar la última barra sobre la fractal en vez de poner una pending order +1 según tu sistema.

    Por lo demas el script se ajusta a lo que andas buscando, SL/TP/TSTOP/BE todo configurable al lanzar el script.

    Así pues dejo aquí el código para el que le pueda interesar.

    Saludos.

    Código:
    package jforex.strategies.renko;
    
    
    import java.math.BigDecimal;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.TimeZone;
    
    
    import com.dukascopy.api.Configurable;
    import com.dukascopy.api.DataType;
    import com.dukascopy.api.IAccount;
    import com.dukascopy.api.IBar;
    import com.dukascopy.api.IConsole;
    import com.dukascopy.api.IContext;
    import com.dukascopy.api.IEngine;
    import com.dukascopy.api.IEngine.OrderCommand;
    import com.dukascopy.api.IHistory;
    import com.dukascopy.api.IIndicators;
    import com.dukascopy.api.IIndicators.AppliedPrice;
    import com.dukascopy.api.IChart;
    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.PriceRange;
    import com.dukascopy.api.feed.FeedDescriptor;
    import com.dukascopy.api.feed.IFeedDescriptor;
    import com.dukascopy.api.feed.IRenkoBar;
    import com.dukascopy.api.feed.IRenkoBarFeedListener;
    import com.dukascopy.api.indicators.IIndicator;
    
    
    public class FractalinesRenko implements IStrategy, IRenkoBarFeedListener {
    
    
        private IEngine engine;
        private IConsole console;
        private IHistory history;
        private IIndicators indicators;
        private int counter = 0;
        private IOrder order;
        @Configurable("Instrument")
        public Instrument selectedInstrument = Instrument.EURUSD;
        @Configurable("Slippage")
        public double slippage = 3;
        @Configurable("Amount")
        public double amount = 0.02;
        @Configurable("Selected period")
        public Period selectedPeriod = Period.TWENTY_SECS;
        @Configurable("Take profit pips")
        public double takeProfitPips = 0;
        @Configurable("Stop loss in pips")
        public double stopLossPips = 10;
        @Configurable("Break even trigger - profit in pips")
        public int beTrigger = 10;
        @Configurable("Break even lock-in pips")
        public int beLockin = 1;
        @Configurable("OfferSide")
        public OfferSide selectedOfferSide = OfferSide.BID;
        @Configurable("Renko bar size (in pips)")
        public int selectedRenkoBarSizeInPips = 5;
        private PriceRange renkoPriceRange;
        @Configurable("Trailing stop loss trigger in pips")
        public int trailingTrigger = 15;
        @Configurable("Number of bars on sides (FRACTAL)")
        public int barCount = 2;
        private IFeedDescriptor feedDescriptor;
        private PriceRange selectedPriceRange;
        private boolean wasSignal; // set to true if there is a signal on this
        // renko, and reset back to false when new
        // candle is drawn
        private IContext context;
        private Double blue;
        private Double green;
    
    
        @Override
        public void onStart(IContext context) throws JFException {
            this.console = context.getConsole();
            this.indicators = context.getIndicators();
            this.history = context.getHistory();
            this.engine = context.getEngine();
            this.context = context;
    
    
            this.selectedPriceRange = PriceRange.valueOf(selectedRenkoBarSizeInPips);
            this.context.subscribeToRenkoBarFeed(selectedInstrument,
                    selectedOfferSide, selectedPriceRange, this);
    
    
            this.feedDescriptor = new FeedDescriptor();
            feedDescriptor.setDataType(DataType.RENKO);
            // feedDescriptor.setFilter(selectedFilter);
            feedDescriptor.setInstrument(selectedInstrument);
            feedDescriptor.setOfferSide(selectedOfferSide);
            feedDescriptor.setPriceRange(selectedPriceRange);
    
    
            renkoPriceRange = PriceRange.valueOf(selectedRenkoBarSizeInPips);
            if (renkoPriceRange == null) {
                throw new JFException(
                        "selectedRenkoBarSizeInPips must be between one and six");
            }
    
    
            IChart chart = context.getChart(selectedInstrument);
            if (chart != null) {
                chart.addIndicator(indicators.getIndicator("FractalLines"), new Object[]{barCount});
            }
    
    
        }
    
    
        @Override
        public void onBar(Instrument instrument, Period period, IBar askBar,
                IBar bidBar) throws JFException {
        }
        
        
        @Override
        public void onBar(Instrument instrument, OfferSide offerSide,
                PriceRange brickSize, IRenkoBar renkoBar) {
            if (instrument != this.selectedInstrument) {
                return;
            }
    
    
            wasSignal = false;
    
    
            try {
                if (instrument.equals(selectedInstrument)
                        && offerSide.equals(selectedOfferSide)
                        && brickSize.getPipCount() == selectedRenkoBarSizeInPips) {
                    
                    Object[] askFact1 = indicators.calculateIndicator(feedDescriptor, new OfferSide[]{OfferSide.ASK}, "FractalLines", new AppliedPrice[]{AppliedPrice.CLOSE},  new Object[]{barCount}, 1);                
                    Object[] bidFact1 = indicators.calculateIndicator(feedDescriptor, new OfferSide[]{OfferSide.BID}, "FractalLines", new AppliedPrice[]{AppliedPrice.CLOSE},  new Object[]{barCount}, 1);
    
    
                    blue = (Double) askFact1[0];
                    green = (Double) bidFact1[1];
                }
            } catch (Exception ex) {
                console.getErr().println(ex.getMessage());
            }
    
    
        }
    
    
        public void onTick(Instrument instrument, ITick tick) throws JFException {
            if (instrument != this.selectedInstrument) {
                return;
            }
            // this mean that we still haven't renko bars
            if (blue == null) {
                return;
            }
    
    
            IBar askBar2 = history.getRenkoBar(instrument, OfferSide.ASK, renkoPriceRange, 2);
            IBar bidBar2 = history.getRenkoBar(instrument, OfferSide.BID, renkoPriceRange, 2);
            IBar askBar1 = history.getRenkoBar(instrument, OfferSide.ASK, renkoPriceRange, 1);
            IBar bidBar1 = history.getRenkoBar(instrument, OfferSide.BID, renkoPriceRange, 1);
    
    
            if (!isActive(order)) {
                // discard the order if is closed on stop loss or take profit
                order = null;
            }
            
            //print(dateToStr(askBar2.getTime()));
            //print("askBar2.getHigh()", askBar2.getHigh(), "askBar1.getHigh()", askBar1.getHigh(), "blue", blue);
    
    
            if (!wasSignal && askBar2.getHigh() <= blue && askBar1.getHigh() > blue) {
                //console.getInfo().print("!wasSignal && askBar1.getHigh() <= red1 && tick.getAsk() > red0");
                // long signal when current bar pirces upper red fractal line
                if (order != null && !order.isLong()) {
                    closeOrder(order);
                    order = null;
                }
                if (order == null) {
                    order = submitOrder(OrderCommand.BUY);
                }
                wasSignal = true;
            }
    
    
            if (!wasSignal && bidBar2.getLow() >= green && bidBar1.getLow() < green) {
                //console.getInfo().print("!wasSignal && bidBar1.getLow() >= blue1 && tick.getBid() < blue0");
                // short signal when current bar pirces lower blue fractal line
                if (order != null && order.isLong()) {
                    closeOrder(order);
                    order = null;
                }
                if (order == null) {
                    order = submitOrder(OrderCommand.SELL);
                }
                wasSignal = true;
            }
    
    
            if (order != null && order.getState() == IOrder.State.FILLED) {
                double newStop;
                //console.getInfo().println("order != null && order.getState() == IOrder.State.FILLED");
                double openPrice = order.getOpenPrice();
                double currentStopLoss = order.getStopLossPrice();
    
    
                if (order.isLong()) { // long side order
                    if (trailingTrigger > 0
                            && tick.getBid() > currentStopLoss + pipToPrice(stopLossPips)
                            && tick.getBid() > openPrice + pipToPrice(trailingTrigger)) {
                        // trailing stop loss
                        newStop = tick.getBid() - pipToPrice(stopLossPips);
                        newStop = (new BigDecimal(newStop)).setScale(
                                instrument.getPipScale(), BigDecimal.ROUND_HALF_UP).doubleValue();
    
    
                        if (currentStopLoss < newStop) {
                            order.setStopLossPrice(newStop);
                        }
                    } else if (beTrigger > 0
                            && tick.getBid() >= (openPrice + pipToPrice(beTrigger))) {
                        // break even
                        newStop = openPrice + pipToPrice(beLockin);
                        newStop = (new BigDecimal(newStop)).setScale(
                                instrument.getPipScale(), BigDecimal.ROUND_HALF_UP).doubleValue();
    
    
                        if (currentStopLoss < newStop) {
                            order.setStopLossPrice(newStop);
                        }
                    }
    
    
                } else { // short side order
                    if (trailingTrigger > 0
                            && tick.getAsk() < currentStopLoss - pipToPrice(stopLossPips)
                            && tick.getAsk() < openPrice - pipToPrice(trailingTrigger)) {
                        // trailing stop loss
                        newStop = tick.getAsk() + pipToPrice(stopLossPips);
                        newStop = (new BigDecimal(newStop)).setScale(
                                instrument.getPipScale(), BigDecimal.ROUND_HALF_UP).doubleValue();
    
    
                        if (currentStopLoss > newStop) {
                            order.setStopLossPrice(newStop);
                        }
                    } else if (beTrigger > 0
                            && tick.getAsk() <= (openPrice - pipToPrice(beTrigger))) {
                        // break even
                        newStop = openPrice - pipToPrice(beLockin);
                        newStop = (new BigDecimal(newStop)).setScale(
                                instrument.getPipScale(), BigDecimal.ROUND_HALF_UP).doubleValue();
    
    
                        if (currentStopLoss > newStop) {
                            order.setStopLossPrice(newStop);
                        }
                    }
                }
            }
        }
    
    
        private double pipToPrice(double pips) {
            return selectedInstrument.getPipValue() * pips;
        }
    
    
        public void onMessage(IMessage message) throws JFException {
            // println(message);
        }
    
    
        public void onAccount(IAccount account) throws JFException {
        }
    
    
        public void onStop() throws JFException {
        }
    
    
        private IOrder submitOrder(OrderCommand orderCmd) throws JFException {
    
    
            double stopLossPrice = 0.0, takeProfitPrice = 0.0;
    
    
            // Calculating order price, stop loss and take profit prices
            if (orderCmd == OrderCommand.BUY) {
                if (stopLossPips > 0) {
                    stopLossPrice = history.getLastTick(selectedInstrument).getBid()
                            - pipToPrice(stopLossPips);
                }
                if (takeProfitPips > 0) {
                    takeProfitPrice = history.getLastTick(selectedInstrument).getBid()
                            + pipToPrice(takeProfitPips);
                }
            } else {
                if (stopLossPips > 0) {
                    stopLossPrice = history.getLastTick(selectedInstrument).getBid()
                            + pipToPrice(stopLossPips);
                }
                if (takeProfitPips > 0) {
                    takeProfitPrice = history.getLastTick(selectedInstrument).getBid()
                            - pipToPrice(takeProfitPips);
                }
            }
            //println("submit order ---------------------------------");
            String label = getLabel(selectedInstrument);
            /* println("label:" + label + ",selectedInstrument:" + selectedInstrument + ",orderCmd:"
            + orderCmd + ",amount:" + amount + ",slippage:" + slippage
            + ",stopLossPrice:" + stopLossPrice + ",takeProfitPrice:"
            + takeProfitPrice);*/
            return engine.submitOrder(getLabel(selectedInstrument), selectedInstrument, orderCmd,
                    amount, 0, slippage, stopLossPrice, takeProfitPrice);
        }
    
    
        private void closeOrder(IOrder order) throws JFException {
            if (isActive(order)) {
                order.close();
            }
        }
    
    
        private boolean isActive(IOrder order) throws JFException {
            if (order != null && order.getState() != IOrder.State.CLOSED
                    && order.getState() != IOrder.State.CREATED
                    && order.getState() != IOrder.State.CANCELED) {
                return true;
            }
            return false;
        }
    
    
        private String getLabel(Instrument instrument) {
            counter++;
            String label = instrument.name();
            label = label + counter;
            label = label.toUpperCase();
            return label;
        }
    
    
        private void print(Object... o) {
            for (Object ob : o) {
                // console.getOut().print(ob + "  ");
                if (ob instanceof double[]) {
                    print((double[]) ob);
                } else if (ob instanceof double[]) {
                    print((double[][]) ob);
                } else if (ob instanceof Long) {
                    print(dateToStr((Long) ob));
                } else {
                    print(ob);
                }
                print(" ");
            }
            console.getOut().println();
        }
    
    
        private void print(Object o) {
            console.getOut().print(o);
        }
    
    
        private void println(Object o) {
            console.getOut().println(o);
        }
    
    
        private void print(double[] arr) {
            println(arrayToString(arr));
        }
    
    
        private void print(double[][] arr) {
            println(arrayToString(arr));
        }
    
    
        private void printIndicatorInfos(IIndicator ind) {
            for (int i = 0; i < ind.getIndicatorInfo().getNumberOfInputs(); i++) {
                print(ind.getIndicatorInfo().getName() + " Input "
                        + ind.getInputParameterInfo(i).getName() + " "
                        + ind.getInputParameterInfo(i).getType());
            }
            for (int i = 0; i < ind.getIndicatorInfo().getNumberOfOptionalInputs(); i++) {
                print(ind.getIndicatorInfo().getName() + " Opt Input "
                        + ind.getOptInputParameterInfo(i).getName() + " "
                        + ind.getOptInputParameterInfo(i).getType());
            }
            for (int i = 0; i < ind.getIndicatorInfo().getNumberOfOutputs(); i++) {
                print(ind.getIndicatorInfo().getName() + " Output "
                        + ind.getOutputParameterInfo(i).getName() + " "
                        + ind.getOutputParameterInfo(i).getType());
            }
            console.getOut().println();
        }
    
    
        public static String arrayToString(double[] arr) {
            String str = "";
            for (int r = 0; r < arr.length; r++) {
                str += "[" + r + "] "
                        + (new DecimalFormat("#.#######")).format(arr[r]) + "; ";
            }
            return str;
        }
    
    
        public static String arrayToString(double[][] arr) {
            String str = "";
            if (arr == null) {
                return "null";
            }
            for (int r = 0; r < arr.length; r++) {
                for (int c = 0; c < arr[r].length; c++) {
                    str += "[" + r + "][" + c + "] "
                            + (new DecimalFormat("#.#######")).format(arr[r][c]);
                }
                str += "; ";
            }
            return str;
        }
    
    
        public String toDecimalToStr(double d) {
            return (new DecimalFormat("#.#######")).format(d);
        }
    
    
        public String dateToStr(Long time) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") {
    
    
                {
                    setTimeZone(TimeZone.getTimeZone("GMT"));
                }
            };
            return sdf.format(time);
        }
    }
    Foro de Forex Trading United

     

  6. #25




    Reputación:
    Poder de reputación: 4

    Mensajes: 8
    Créditos: 50

    Re: Programar en JForex mi estrategia supersimple


    Publi
    Parece interesante

    Como funcionaria con MT4 de Forexyard,alguien lo sabe

    Gracias
    Foro de Forex Trading United

     

Página 3 de 3 PrimerPrimer 123
Publi
Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal