//================================================================C // RSI(相対力指数)による株価売買シミュレーション // Input File: T-xxxx.txt : プログラムと同じフォルダー // Output File: RSI-xxxx.txt : プログラムと同じフォルダー // xxxxは4桁の株価コードで画面から与える //----------------------------------------------------------------C // javac BollBand.java : classファイルの作成 // java BollBand : 実行 // <画面から入力> // code : 株価コード // kabu : 一口単位の株数(1000, 100, 10 or 1) // <プログラム中で与える> // ido = 15(日); RSI計算の日数 // rsi = 25(%); 買いRSI指数(売り:100-RSI) // hi = 0.0; 始値+-基準値*hi // maxn = 5; 投資可能な最大口数 //----------------------------------------------------------------C // Written by Yasunori Ushiro (後 保範), 2011/11/22 //  訂正(kochi[]): 2012/01/08 // ( Waseda University, 早稲田大学 ) //================================================================C import java.io.*; import java.util.*; public class RSI //================================================================C // 呼値変換関数 //================================================================C { public static int valset(int x) { int kochi[] = { 3000,5000,30000,50000,300000,500000,3000000 }; int kizami[] = { 1, 5, 10, 50, 100, 500, 1000, 10000 }; int i, y, z; // set kizami for (i=0; i<7; i++) { if(x < kochi[i]) break; } z = kizami[i]; // set return value y = (x + z/2) / z; y = y * z; return y; } //================================================================C // main program //================================================================C public static void main (String[] args) throws Exception { int ido = 15; //RSIの計算日数 int maxn = 5; //投資可能な最大口数 int rsi = 25; //買いRSI指数(売り:100-rsi) double hi = 0.0; //始値+-基準値*hi int output = 0; //途中経過出力(1) String s, code; String idate[] = new String[2000]; int istock[][] = new int[2000][4]; //始値,高値,安値,終値 String date[] = new String[2000]; int stock[][] = new int[2000][6]; //同上,RSI指数,指値 int urikai[][] = new int[2000][3]; //売買数,価格,保有数 int kabu, k, j, n, hoyu, NO, wk; int Tkai, Turi, rieki, kosu, ave, nedan; double s1, s2; // 画面から株価コード及び一口単位の株数を入力 InputStreamReader gin = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(gin); System.out.println("株価コード(4桁の数字)を入力"); code = br.readLine(); System.out.println("一口単位の株数(1000,100,10,1)を入力"); s = br.readLine(); kabu = Integer.parseInt(s); //株数を整数化 // 入力ファイルの定義 FileInputStream fi = new FileInputStream("T-"+code+".txt"); InputStreamReader in = new InputStreamReader(fi); BufferedReader b = new BufferedReader(in); // 出力ファイルの定義 FileOutputStream fo = new FileOutputStream("RSI-"+code+".txt"); PrintWriter q = new PrintWriter(fo,true); // データの入力及び格納 n=0; while ( (s = b.readLine()) != null) { StringTokenizer st = new StringTokenizer(s); NO=0; while (st.hasMoreTokens()) { String std = st.nextToken(); if(NO==0) { idate[n] = std; } else { istock[n][NO-1] = Integer.parseInt(std); } NO++; } n++; } // 入力データを昇順に for (k=0; k 0) s1 += wk; } ave = (int)(s1*100.0 / s2 + 0.5); //RSI値(%) stock[k][4] = ave; //RSI値(%) stock[k][5] = 0; //指値のクリア } // 売買シミュレーション hoyu = 0; for (k=ido+1; k= (100-rsi) ) //RSI >= 売り基準 // 売り処理 { nedan = stock[k][0] + (int)(hi*(stock[k-1][1]-stock[k-1][0])); //始値+hi*前日(高値-始値) nedan = valset(nedan); //指値を呼値に変更 if(hoyu >=1) stock[k][5] = nedan; //指値を入れる if( (hoyu >= 1) && (stock[k][1] >= nedan) ) //株を保有し高値 >= 指値 { urikai[k][0] = -1; hoyu--; //1口売却 if(stock[k][0] >= nedan) //始値 >= 指値 { urikai[k][1] = stock[k][0]; } //始値売却 else { urikai[k][1] = nedan; } //指値売却 } } urikai[k][2] = hoyu; } // 最終日処理(保有株を終値で売却) k = n - 1; urikai[k][0] = -hoyu; if (hoyu !=0 ) { urikai[k][1] = stock[n-1][3]; } else { urikai[k][1] = 0; } urikai[k][2] = 0; // 途中経過出力(output=1なら出力) if (output == 1) { for (k=ido+1; k 0) { kosu++; Tkai += urikai[k][1]; } else if (urikai[k][0] < 0) { Turi -= urikai[k][0]*urikai[k][1];;} } Tkai *= kabu; Turi *= kabu; rieki = Turi - Tkai; // 結果出力 q.println("RSI(相対力指数)による株価シミュレーション"); q.println(" 株価コード:"+code+", RSIの計算日数="+ido); q.println(" RSI買基準値="+rsi+"(%)"+", 保有最大口数="+maxn); q.println(" 指値の変更比"+hi+", 一口当たりの株数="+kabu); q.println(" 買いの回数="+kosu+", 買い金額計="+Tkai+"円"); q.println(" 最終日売却="+hoyu+", 売り金額計="+Turi+"円"); q.println(" 損益="+rieki+"円"); } }