import java.util.ArrayList;
import jp.tradesc.superkaburobo.sdk.driver.RobotDriver;
import jp.tradesc.superkaburobo.sdk.robot.AbstractRobot;
import jp.tradesc.superkaburobo.sdk.trade.AssetManager;
import jp.tradesc.superkaburobo.sdk.trade.InformationManager;
import jp.tradesc.superkaburobo.sdk.trade.OrderManager;
import jp.tradesc.superkaburobo.sdk.trade.PortfolioManager;
import jp.tradesc.superkaburobo.sdk.trade.RobotLogManager;
import jp.tradesc.superkaburobo.sdk.trade.TradeAgent;
import jp.tradesc.superkaburobo.sdk.trade.data.Category;
import jp.tradesc.superkaburobo.sdk.trade.data.Portfolio;
import jp.tradesc.superkaburobo.sdk.trade.data.Stock;
import jp.tradesc.superkaburobo.sdk.trade.data.StockData;
/**
* ETF を売買するだけのサンプルカブロボです。
* ポートフォリオに ETF がなければ買い、あれば売りをするだけの単純なカブロボです。
* @author (c) 2004-2007 kaburobo.jp and Trade Science Corp. All rights reserved.
*/
public class SampleEtfRobot extends AbstractRobot {
@Override
public void order(TradeAgent tradeAgent) {
// 総資産の40パーセントを1銘柄に投資する上限とします。
int orderMoney = (int) (AssetManager.getInstance().getTotalAssetValue().doubleValue() * 0.40);
// 各種マネージャを取得します。
InformationManager im = InformationManager.getInstance();
OrderManager om = OrderManager.getInstance();
PortfolioManager pm = PortfolioManager.getInstance();
RobotLogManager rlm = RobotLogManager.getInstance();
// ETF の銘柄リストをつくります。
ArrayList etfStockList = new ArrayList();
for(Category cat: im.getEtfList()){
etfStockList.addAll(cat.getStockList());
}
// 1銘柄ずつ保有していれば売り、保有していなければ買います。
for (Stock etf : etfStockList) {
if(pm.isHolding(etf)){
// 保有しているので全量を 即時 成行 で売却します。
for (Portfolio portfolio : pm.getPortfolio()) {
// このポートフォリオが ETF 銘柄か調べます。
if(etf.equals(portfolio.getStock())){
// ETF なので売却します。
portfolio.orderReverseNowMarketAll();
}
}
} else {
// 保有していない ETF なので、新規に買い注文を出します。
// 買い注文を出すために、前日終値を取得し、数量を計算します。
StockData lastSession = im.getStockSession(etf);
if(lastSession == null) continue; // 最後の場の情報を取得できなかったのでこの銘柄をスキップします。
Integer closingPrice = lastSession.getClosingPrice();
if(closingPrice== null) continue; // 最後の場の終値が取得できなかったのでこの銘柄をスキップします。
// 注文数 (総資産の40%) (前日の終値)
int qty = orderMoney / closingPrice.intValue();
// 注文を出します。
if (! om.orderActualNowMarket(etf, qty) ) {
// 失敗した場合ログに理由と共に出力します。
rlm.log(etf.getStockName()+" "+qty+"株(終値:"+closingPrice+" 注文額:"+(closingPrice*qty)+" )の注文に失敗しました: "+om.getLastOrderResult().toJapanese());
}
}
}
}
@Override
public void screening(TradeAgent tradeAgent) {
// このカブロボはサンプルなので、スクリーニングでは特に何も行いません。
}
}