/* ===========================================================
* TradeManager : An application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.strategy;
import java.time.ZonedDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.trade.broker.BrokerModel;
import org.trade.dictionary.valuetype.OrderStatus;
import org.trade.strategy.data.CandleSeries;
import org.trade.strategy.data.StrategyData;
import org.trade.strategy.data.candle.CandleItem;
/**
* @author Simon Allen
*
* @version $Revision: 1.0 $
*/
public class StrategyRuleTemplate extends AbstractStrategyRule {
/**
*
*/
private static final long serialVersionUID = -2281013751087462982L;
private final static Logger _log = LoggerFactory.getLogger(StrategyRuleTemplate.class);
/**
* Default Constructor Note if you use class variables remember these will
* need to be initialized if the strategy is restarted i.e. if they are
* created on startup under a constraint you must find a way to populate
* that value if the strategy were to be restarted and the constraint is not
* met.
*
* @param brokerManagerModel
* BrokerModel
* @param strategyData
* StrategyData
* @param idTradestrategy
* Integer
*/
public StrategyRuleTemplate(BrokerModel brokerManagerModel, StrategyData strategyData, Integer idTradestrategy) {
super(brokerManagerModel, strategyData, idTradestrategy);
}
/**
* Method runStrategy. Note the current candle is just forming Enter a tier
* 1-3 gap in first 5min bar direction, with a 3R target and stop @ 5min
* high/low.
*
* TradeOrders create TradePositions that are associated to Contracts.
* TradeOrders are associated to TradePositions and the Tradestrategy that
* created them. A TradePosition may have TradeOrders from multiple
* Tradestrategies.
*
* TradePositions are created when there is no open TradePosition and a
* TradeOrder is either filled or partially filled.
*
* Note TradePositions are closed when the open quantity is zero. The new
* TradePosition is associated to the Contract with the 1 to 1 relationship
* from Contract to TradePosition. The TradeOrder that opened the
* TradePosition is marked as the open order @see
* org.trade.persistent.dao.TradeOrder.getIsOpenPosition()
*
* TradePosition will have the Side set to either BOT/SLD i.e. Long/Short.
* If an open position changes from Long to Short dues to an over Sell/Buy
* order the side will switch.
*
*
* @param candleSeries
* CandleSeries the series of candles that has been updated.
* @param newBar
* boolean has a new bar just started.
* @see org.trade.strategy.AbstractStrategyRule#runStrategy(CandleSeries,
* boolean)
*/
public void runStrategy(CandleSeries candleSeries, boolean newBar) {
try {
// Get the current candle
CandleItem currentCandleItem = this.getCurrentCandle();
ZonedDateTime startPeriod = currentCandleItem.getPeriod().getStart();
/*
* Position is open kill this Strategy as its job is done. In this
* example we would manage the position with a strategy manager.
* This strategy is just used to create the order that would open
* the position.
*/
if (this.isThereOpenPosition()) {
_log.info("Strategy complete open position filled symbol: " + getSymbol() + " startPeriod: "
+ startPeriod);
/*
* If the order is partial filled check if the risk goes beyond
* 1 risk unit. If it does cancel the openPositionOrder this
* will cause it to be marked as filled.
*/
if (OrderStatus.PARTIALFILLED.equals(this.getOpenPositionOrder().getStatus())) {
if (isRiskViolated(currentCandleItem.getClose(), this.getTradestrategy().getRiskAmount(),
this.getOpenPositionOrder().getQuantity(),
this.getOpenPositionOrder().getAverageFilledPrice())) {
this.cancelOrder(this.getOpenPositionOrder());
}
}
this.cancel();
return;
}
/*
* Create code here to create orders based on your conditions/rules.
*/
if (startPeriod.equals(this.getTradestrategy().getTradingday().getOpen()
.plusMinutes(this.getTradestrategy().getBarSize() / 60)) && newBar) {
/*
* Example On start of the second (9:35) candle check the 9:30
* candle and buy over under in the direction of the bar.
*/
}
/*
* Close any opened positions with a market order at day end minus
* one bar.
*/
if (!currentCandleItem.getLastUpdateDate().isBefore(this.getTradestrategy().getTradingday().getClose()
.minusMinutes(this.getTradestrategy().getBarSize() / 60))) {
cancelOrdersClosePosition(true);
_log.info("Rule 15:55:00 close all open positions: " + getSymbol() + " Time: " + startPeriod);
this.cancel();
}
} catch (StrategyRuleException ex) {
_log.error("Error runRule exception: " + ex.getMessage(), ex);
error(1, 10, "Error runRule exception: " + ex.getMessage());
}
}
}