package jforex;

import java.util.*;
import com.dukascopy.api.*;
/** 
 * This is simple strategy example. Strategy places several 
 * orders for different instruments. After orders are filled,
 * it places on current instruments chart new chart object (IChart.Type.TEXT) 
 * with message.    
 */
public class OrdersForFourInstruments implements IStrategy{
    
    private IContext context;
    private IEngine engine;
    private List<IOrder> orders;
    
    public void onStart(IContext context) throws JFException {
        this.context = context;
        this.engine = context.getEngine();
        this.orders = new ArrayList<IOrder>();
    }

    public void onAccount(IAccount account) throws JFException {
    }

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

    public void onMessage(IMessage message) throws JFException {
        
        if (message.getType().equals(IMessage.Type.ORDER_FILL_OK)){
            if (message.getOrder().getInstrument().equals(Instrument.EURUSD)||
                    message.getOrder().getInstrument().equals(Instrument.EURJPY)||
                    message.getOrder().getInstrument().equals(Instrument.EURGBP)||
                    message.getOrder().getInstrument().equals(Instrument.EURAUD)) {
                
                IChart chart = context.getChart(message.getOrder().getInstrument());
                if (chart != null) {
                   // use chart object to create and manipulate drawings
                    
                    long creationTime = message.getOrder().getCreationTime();
                    double openPrice = message.getOrder().getOpenPrice();
                    
                    chart.draw("chart", IChart.Type.TEXT, creationTime, openPrice);
                    IChartObject chartObject = chart.get("chart");
                    chartObject.setText("Order Filled");                    
                    
                }
            }
        }        
    }

    public void onStop() throws JFException {
        
        // closing our orders
        for (IOrder order : orders) {
            if (order.getState() == IOrder.State.FILLED
                || order.getState() == IOrder.State.OPENED){
                order.close();                
            }
        }       
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
        
        // placing orders once on first tick (one for each instrument)
        if (orders != null && orders.isEmpty()){
            orders.add(engine.submitOrder("order_EURUSD", Instrument.EURUSD, IEngine.OrderCommand.BUY, 5));
            orders.add(engine.submitOrder("order_EURJPY", Instrument.EURJPY, IEngine.OrderCommand.BUY, 5));
            orders.add(engine.submitOrder("order_EURGBP", Instrument.EURGBP, IEngine.OrderCommand.BUY, 5));
            orders.add(engine.submitOrder("order_EURAUD", Instrument.EURAUD, IEngine.OrderCommand.BUY, 5));
        }        
    }
}
