/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package onBarExample;
import com.dukascopy.api.*;
import java.util.HashSet;
import java.util.Set;
public class SMASampleTrade implements IStrategy {
private IEngine engine;
private IConsole console;
private IHistory history;
private IContext context;
private IIndicators indicators;
private IUserInterface userInterface;
private IBar previousBar;
private IOrder order;
private static final int PREV = 1;
private static final int SECOND_TO_LAST = 0;
@Configurable( value = "通貨ペア" )
public Instrument myInstrument = Instrument.EURGBP;
@Configurable( value = "オーダータイプ", obligatory = true )
public OfferSide myOfferSide = OfferSide.ASK;
@Configurable( value = "時間軸" )
public Period myPeriod = Period.TEN_MINS;
@Configurable( "SMA期間" )
public int smaTimePeriod = 30;
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();
Set<Instrument> instruments = new HashSet<Instrument>();
instruments.add(myInstrument);
context.setSubscribedInstruments(instruments, true);
}
public void onAccount(IAccount account) throws JFException {
}
public void onMessage(IMessage message) throws JFException {
if( message.getOrder() != null )
console.getOut().println("オーダーラベル: " + message.getOrder().getLabel() + " || メッセージログ: " + message.getContent());
}
public void onStop() throws JFException {
}
public void onTick(Instrument instrument, ITick tick) throws JFException {
}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
if (!instrument.equals(myInstrument) || !period.equals(myPeriod)) {
return;
}
IEngine.OrderCommand myCommand = null;
int candlesBefore = 2, candlesAfter = 0;
previousBar = myOfferSide == OfferSide.ASK ? askBar : bidBar;
long currBarTime = previousBar.getTime();
double sma[] = indicators.sma(instrument, period, myOfferSide, IIndicators.AppliedPrice.CLOSE,
smaTimePeriod, Filter.NO_FILTER, candlesBefore, currBarTime, candlesAfter);
printMe( String.format("SMAの値: 2つ前 = %.5f; 1つ前 = %.5f", sma[SECOND_TO_LAST], sma[PREV]));
if( sma[PREV] > sma[SECOND_TO_LAST]){
printMe("SMA上昇");
myCommand = IEngine.OrderCommand.BUY;
} else if ( sma[PREV] < sma[SECOND_TO_LAST]){
printMe("SMA下降");
myCommand = IEngine.OrderCommand.SELL;
} else {
return;
}
order = engine.getOrder("MyStrategyOrder");
if (order != null && engine.getOrders().contains(order) && order.getOrderCommand() != myCommand){
order.close();
order.waitForUpdate(IOrder.State.CLOSED);
console.getOut().println( order.getLabel() + " ラベルのポジションをクローズしました");
}
if ( order == null || !engine.getOrders().contains(order) ){
engine.submitOrder("MyStrategyOrder" , instrument, myCommand, 0.001);
}
}
private void printMe(String toPrint){
console.getOut().println(toPrint);
}
}