/*
 * 作成日: 2004/09/18
 *
 * この生成されたコメントの挿入されるテンプレートを変更するため
 * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
 */
package jp.ac.uec.cs.seman.kaburobo;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import jp.kaburobo.information.IndexInformation;
import jp.kaburobo.information.InformationManager;
import jp.kaburobo.investment.Holding;
import jp.kaburobo.investment.InvestmentAgent;
import jp.kaburobo.investment.Portfolio;
import jp.kaburobo.investment.SimpleStockOrder;
import jp.kaburobo.investment.Stock;
import jp.kaburobo.investment.StockOrder;
import jp.kaburobo.robot.Robot;
import jp.kaburobo.util.Time;

/**
 * @author shin
 *
 * この生成されたコメントの挿入されるテンプレートを変更するため
 * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
 */
public class KumarRobot implements Robot {

	/* (非 Javadoc)
	 * @see jp.kaburobo.robot.Robot#run(jp.kaburobo.investment.InvestmentAgent)
	 */
	public void run(InvestmentAgent investmentAgent) {
		
		//
		//クマーがご挨拶
		//
		System.out.println("" + 
"　　 ∩＿＿＿∩\n" +
"　　 | ノ　　　　　 ヽ \n" +
"　　/　　●　　　● |　　＜くまだけど株式売買しちゃうぞ！ \n" +
"　 |　　　　( _●_)　 ミ \n" +
"　彡､　　　|∪|　　､｀＼ \n" +
"/　＿＿　 ヽノ　/´>　 ) \n" +
"(＿＿＿）　　　/　(_／ \n" +
"　|　　　　　　 / \n" +
"　|　　／＼　＼ \n" +
"　|　/　　　 )　 ) \n" + 
"　∪　　　 （　 ＼ \n" +
"　　　　　　 ＼＿) ");


		//
		//ここから株式売買アルゴリズム
		//
		
		//銘柄リストの取得
		Stock current;
		Stock[] stocks = investmentAgent.getStocks(); 
		
		//銘柄データを取得
		InformationManager infoManager = investmentAgent.getInformationManager();
		Calendar date = Time.getTime();
		
		//現在のポートレートを取得
		Portfolio portfolio = investmentAgent.getPortfolio();
		
		
		//どれを買うか決める
		int buy=-1;
		long need = 0;
		double score=0.0;
		for ( int i=0; i<stocks.length; i++ )
		{
			List list = infoManager.getIndexInformation(stocks[i], date, -7);
			IndexInformation ago = (IndexInformation)list.get(0); 
			IndexInformation now = (IndexInformation)list.get(6);

			if ( ((double)now.getClosingPrice() / (double)ago.getClosingPrice()) > score )
			{
				buy = i;
				need = (long)now.getClosingPrice() * (long)now.getTradingLotSize();
				score = (double)now.getClosingPrice() / (double)ago.getClosingPrice();
			}
		}
		
		//残高が足りなければ、持ち株を売り払う
		if ( need > portfolio.getAvailableMoney() )
		{
			Map holdingMap = portfolio.getHoldings();

			for( int i=0; i<stocks.length; i++ )
			{
				 Holding holding = (Holding)holdingMap.get(stocks[i]);
				 if(holding != null)
				 {
					 SimpleStockOrder stockOrder = new SimpleStockOrder();
					 stockOrder.setStock(holding.getStock());     // 注文に持株の銘柄を設定
					 stockOrder.setTradeType(StockOrder.SELL);    // 売り注文に設定
					 stockOrder.setQuantity(holding.getNumber()); // その銘柄の持株の数だけ設定
					 investmentAgent.order(stockOrder);           // 注文の発行
				 }
			 }
		}
		
		//注文を出す
		if (buy != -1)
		{
			SimpleStockOrder stockOrder = new SimpleStockOrder();
			stockOrder.setStock(stocks[buy]);          // 注文の銘柄を設定
			stockOrder.setTradeType(StockOrder.BUY); // 買い注文に設定
			stockOrder.setQuantity(1);               // 注文を１単位株に設定
			investmentAgent.order(stockOrder);       // 注文の発行
		}

	}

}
