注意
- 1日1売買しか行えない!
- 取引対象となる銘柄は、東証日経平均株価指数225銘柄中40銘柄(プレ・本大会で変わる)
- 売り注文・買い注文いずれも成行と指値が可能
- 手数料はかからない
- 空売り可能!
- コンテスト期間(1ヶ月)中は、2銘柄以上の購入が必要条件
成行・指値
- 成行注文の場合はすべて終値の価格で売買が必ず成立する
- 指値が一日の高値と安値の中に収まっていれば、売買が成立したことになる
| 例) ○月△日 始値:100円 高値:110円 安値:95円 終値:103円の場合 |
- 成行 → 103円で売買成立
- 指値(105円) → 105円で売買成立
- 指値(115円) → 売買不成立
売買枚数・金額
- 売買量は金額か株式枚数で指定することが可能
- 最低取引金額以下の注文は受け付けない
- 金額指定の場合は最大取引枚数を購入し、端数は戻さる
- 取引可能残高以上の注文の場合、残高内で購入可能な株式枚数を購入する
| 例) ○月△日 A株(売買単位:1000株)終値:103円 売買可能残高200000円の場合 |
- 成行 A株1,000株 → 1,000株103,000円で売買成立
- 成行 A株500株 → 売買単位以下で売買不成立
- 成行 A株1,500株 → 1,000株103,000円で売買成立
- 成行 A株200,000円 → 1,000株103,000円で売買成立
売り注文
- 売り注文には「現物売り」と「空売り(信用取引)」の2種類がある
- 現物売りは保有している株を売ること
- 空売りでは株式を保有していなくても取引可能残高内で株式を売ることができる
- 空売りをすると証券売却分だけ手持ち金は増えますが、手持ち金がロックされるので実質的に取引可能な取引可能残高は減少する
- 空売りした分の証券を返済すれば、ロックは解除される
銘柄リスト表示
|
//銘柄リストの表示
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
System.out.println("証券コード:銘柄:業種");
for(int i=0;i<stocks.length;i++){
StringTokenizer st = new StringTokenizer(stocks[i].getName()," ");
String brand = st.nextToken();
String typeOfIndustry = st.nextToken();
System.out.print(stocks[i].getCode()); //証券コードの表示
System.out.print(":");
System.out.print(brand); //銘柄の表示
System.out.print(":");
System.out.println(typeOfIndustry); //業種の表示
}
|
StockクラスのtoStringメソッドによる表示は
Stock[銘柄コード,銘柄 業種]
(例)Stock[9766,コナミ 情報・通信業]
注文
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
SimpleStockOrder stockOrder = new SimpleStockOrder();
//買い注文(成行)
stockOrder.setStock(stocks[0]); // 注文の銘柄を設定
stockOrder.setTradeType(StockOrder.BUY); //買い注文
stockOrder.setLimitType(StockOrder.MARKET); //成行
// //売り注文(指値)
// stockOrder.setTradeType(StockOrder.SELL); //売り注文
// stockOrder.setLimitType(StockOrder.LIMIT); //指値
// stockOrder.setLimit(305); //指値を305円に設定
stockOrder.setQuantity(1); // 注文を1単位株に設定
investmentAgent.order(stockOrder); // 注文の発行
|
javadocを見る限り、SimpleStockOrderクラスでは数量だけでなく金額による注文も出来るはずなんだけど、
setUnitTypeメソッドやsetQuantityByNumberメソッドなどが使えない。
なんで??
銘柄指標データ
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
InformationManager infoManager = investmentAgent.getInformationManager();
Calendar date = Time.getTime(); // 直近の日付を取得
// 直近の日付から1日分の銘柄指標データを取得
List list = infoManager.getIndexInformation(stocks[0], date, -1);
IndexInformation index = (IndexInformation) list.get(0); // 一つ前のデータ
System.out.println(stocks[0]); //銘柄表示
System.out.println("売買単位の枚数:" + index.getTradingLotSize());
System.out.println("日付:" + index.getDate().getTime());
System.out.println("始値:" + index.getOpeningPrice());
System.out.println("終値:" + index.getClosingPrice());
System.out.println("高値:" + index.getHighPrice());
System.out.println("安値:" + index.getLowPrice());
System.out.println("出来高の枚数:" + index.getTurnover());
System.out.println("一株株主資本:" + index.getBps());
System.out.println("一株配当:" + index.getDividend());
System.out.println("配当利回り:" + index.getDividendYield());
System.out.println("EPS(一株利益):" + index.getEps());
System.out.println("PBR(株価純資産倍率):" + index.getPbr());
System.out.println("PER(株価収益率):" + index.getPer());
System.out.println("ROA(株価純資産倍率):" + index.getRoa());
System.out.println("ROE(株主資本利益率):" + index.getRoe());
System.out.println("年初来高値の日付:" + index.getYearsNewHighDate().getTime());
System.out.println("年初来高値:" + index.getYearsNewHighPrice());
System.out.println("年初来安値の日付:" + index.getYearsNewLowDate().getTime());
System.out.println("年初来安値:" + index.getYearsNewLowPrice());
|
IndexInformationクラスのgetDate()メソッドを使うとNullPointerExceptionが発生。
なんで!?
国内外証券市場データ
|
InformationManager infoManager = investmentAgent.getInformationManager();
// 直近の国内外証券市場データを取得
StockMarketInformation marketInfo = infoManager.getStockMarketInformation();
// System.out.println(marketInfo.getKabuRobo().getClosingPrice());//株ロボ40株価指数
// System.out.println(marketInfo.getKapix().getClosingPrice());//株ロボ平均株価
System.out.println(marketInfo.getNikkei225().getClosingPrice());//日経平均225
System.out.println(marketInfo.getTopix().getClosingPrice());//東証株価指数
|
カブロボ40株価指数とカブロボ平均株価(KAPIX?)が取得できない
うむぅ~
空売り(信用取引)
持ち株がない(足りない)状態で売り注文を出すだけ。
普通の売り注文と同じ。
移動平均乖離率
|
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager();
InformationManager info = investmentAgent.getInformationManager();
// 25日分の銘柄指標データを取得
List indexList = info.getIndexInformation(stocks[0], Time.getTime(), -25);
// 配列に変換
IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]);
// 25日移動平均乖離率を取得
List cpList = technical.getConversionPremium(index, null, 25);
// 直近の移動平均乖離率を取得
ConversionPremium cp = (ConversionPremium)cpList.get(cpList.size()-1);
System.out.println("日付:" + cp.getDate().getTime());
System.out.println("移動平均乖離率:" + cp.getConversionPremium());
System.out.println("移動平均値:" + cp.getMovingAverage().getMovingAverage());
System.out.println("集計日数:" + cp.getMovingAverage().getDays()); |
3点チャージ
3点チャージ法による「買いシグナル」「売りシグナル」検出。
|
public void run(InvestmentAgent investmentAgent){
//分析日数
final int cpDma = 26; //移動平均乖離率
final int rsiDma = 14; //RSI
final int vrDma = 25; //ボリュームレシオ
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
for(int i=0; i<stocks.length;i++){
boolean cpBuySignal = false;
boolean rsiBuySignal = false;
boolean vrBuySignal = false;
boolean cpSellSignal = false;
boolean rsiSellSignal = false;
boolean vrSellSignal = false;
System.out.println(stocks[i]);
double cp = getCP(investmentAgent,stocks[i],cpDma).getConversionPremium();
double rsi = getRSI(investmentAgent,stocks[i],rsiDma).getRsi();
double vr = getVR(investmentAgent,stocks[i],vrDma).getVR1();
System.out.print("移動平均乖離率 :" + cp);
if(cp < (-15) ){
System.out.println("\t\t○");
cpBuySignal = true;
}else if(cp >= 15){
System.out.println("\t\t☆");
cpSellSignal = true;
}else{
System.out.println();
}
System.out.print("相対力指数(RSI) :" + rsi);
if(rsi < 25 ){
System.out.println("\t\t○");
rsiBuySignal = true;
}else if(rsi >= 70){
System.out.println("\t\t☆");
rsiSellSignal = true;
}else{
System.out.println();
}
System.out.print("ボリュームレシオ:" + vr);
if(vr < 70 ){
System.out.println("\t\t○");
vrBuySignal = true;
}else if(vr >= 250){
System.out.println("\t\t☆");
vrSellSignal = true;
}else{
System.out.println();
}
// すべてに買いフラグが立ったら、買いシグナル
if(cpBuySignal && rsiBuySignal && vrBuySignal){
System.out.println("\t\t\t\t***** 買いシグナル *****");
}
// すべてに売りフラグが立ったら、売りシグナル
if(cpSellSignal && rsiSellSignal && vrSellSignal){
System.out.println("\t\t\t\t***** 売りシグナル *****");
}
}
}
public ConversionPremium getCP(InvestmentAgent investmentAgent,Stock stock, int dma){
TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager();
InformationManager info = investmentAgent.getInformationManager();
List indexList = info.getIndexInformation(stock, Time.getTime(), -dma);
IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]);
List cpList = technical.getConversionPremium(index, null, dma);
return (ConversionPremium)cpList.get(cpList.size()-1);
}
public RSI getRSI(InvestmentAgent investmentAgent,Stock stock, int dma){
TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager();
InformationManager info = investmentAgent.getInformationManager();
List indexList = info.getIndexInformation(stock, Time.getTime(), -(dma+1));
IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]);
List rsiList = technical.getRSI(index, null, dma);
return (RSI)rsiList.get(rsiList.size()-1);
}
public VolumeRatio getVR(InvestmentAgent investmentAgent,Stock stock, int dma){
TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager();
InformationManager info = investmentAgent.getInformationManager();
List indexList = info.getIndexInformation(stock, Time.getTime(), -(dma+1));
IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]);
List vrList = technical.getVolumeRatio(index, null, dma);
return (VolumeRatio)vrList.get(vrList.size()-1);
}
|
あってるのかどうかはわからない。
つーか、移動平均乖離率がめったに±10%超えないよ。
シグナルなかなかでない・・・・。
参考にしたページ 「3点チャージ投資法」
最近のコメント