package charts;
import com.dukascopy.api.*;
import java.util.HashSet;
import java.util.Set;
import com.dukascopy.api.drawings.IChartObjectFactory;
import com.dukascopy.api.drawings.IOhlcChartObject;
import com.dukascopy.api.indicators.OutputParameterInfo.DrawingStyle;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
public class ChartUsage 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 IChart openedChart;
private IChartObjectFactory factory;
private int signals;
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;
@Configurable("チャート上にOHLCインデックス表示")
public boolean addOHLC = true;
@Configurable("フィルター")
public Filter filter = Filter.WEEKENDS;
@Configurable("SMA描画")
public boolean drawSMA = true;
@Configurable("ストラテジー停止時にチャートを閉じる")
public boolean closeChart;
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();
this.openedChart = context.getChart(myInstrument);
this.factory = openedChart.getChartObjectFactory();
Set<Instrument> instruments = new HashSet<Instrument>();
instruments.add(myInstrument);
context.setSubscribedInstruments(instruments, true);
if( drawSMA )
if( !addToChart(openedChart) ){
printMeError("チャート上にインジケータをプロット出来ませんでした。チャートの設定値を確認して下さい。");
}
}
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 {
if( closeChart )
context.closeChart(openedChart);
}
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;
}
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);
IEngine.OrderCommand myCommand = null;
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);
long time = previousBar.getTime() + myPeriod.getInterval();
IChartObject signal = myCommand.isLong() ?
factory.createSignalUp("signalUpKey" + signals++, time, previousBar.getLow() - instrument.getPipValue()*2)
: factory.createSignalDown("signalDownKey" + signals++, time, previousBar.getHigh() + instrument.getPipValue()*2);
signal.setText(String.format("delta SMA %+.7f", sma[PREV] - sma[SECOND_TO_LAST]), new Font("Monospaced", Font.BOLD, 12));
openedChart.addToMainChart(signal);
}
}
private void printMe(Object toPrint){
console.getOut().println(toPrint);
}
private void printMeError(Object o){
console.getErr().println(o);
}
private boolean addToChart(IChart chart){
if (chart == null){
printMeError(myInstrument + " の通貨ペアチャートが開かれていません。");
return false;
}
if (chart.getSelectedOfferSide() != this.myOfferSide) {
printMeError("チャートのオーダータイプ(アスク/ビッド)と一致していません:" + this.myOfferSide);
return false;
}
if (chart.getSelectedPeriod() != this.myPeriod) {
printMeError(this.myPeriod + "の時間軸チャートが開かれていません。");
return false;
}
if (chart.getFilter() != this.filter){
printMeError("chart filter is not " + this.filter);
return false;
}
chart.addIndicator(indicators.getIndicator("SMA"), new Object[] {smaTimePeriod},
new Color[]{Color.GREEN}, new DrawingStyle[]{DrawingStyle.LINE}, new int[]{3});
if(addOHLC){
IOhlcChartObject ohlc = null;
for (IChartObject obj : chart.getAll()) {
if (obj instanceof IOhlcChartObject) {
ohlc = (IOhlcChartObject) obj;
}
}
if (ohlc == null) {
ohlc = chart.getChartObjectFactory().createOhlcInformer();
ohlc.setPreferredSize(new Dimension(100, 200));
chart.addToMainChart(ohlc);
}
ohlc.setShowIndicatorInfo(true);
}
return true;
}
}