#include "..\traders\Sbhave.h" // Constructor for Sbhave1 Sbhave1::Sbhave1( int TN ):Trader( TN ) { StockMarketInfo info; StockData sd; GetBroker()->GetStockMarketInfo( info ); //allocate memory for variables for value = number of stocks stock_prices = new double[info.NumberOfStocks]; trade_flag = new int[info.NumberOfStocks]; earn_share = new double[info.NumberOfStocks]; old_index = info.CPPIndex; // copy the initial price and earnings per share for all stocks for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); stock_prices[ii] = sd.CurrentPrice; earn_share[ii] = sd.EarningsPerShare; } }; //Destructor for Sbhave1 Sbhave1 ::~Sbhave1() { delete [] stock_prices; delete [] trade_flag; delete [] earn_share; }; // Think for Sbhave1 void Sbhave1::Think() { StockMarketInfo info; StockData sd; GetBroker()->GetStockMarketInfo( info ); for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); //Check old & new prices, CPP Indices and Earnings if( (stock_prices[ii] < 0.965 * sd.CurrentPrice) && (old_index < info.CPPIndex) && (sd.EarningsPerShare <= earn_share[ii])) //If market up trade_flag[ii] = SEL_STK; else if((stock_prices[ii] > 1.035 * sd.CurrentPrice) && (old_index > info.CPPIndex) && (sd.EarningsPerShare >= earn_share[ii])) //If market down trade_flag[ii] = BUY_STK; else //Market up & down or no change in market trade_flag[ii] = NO_DEAL; //Update prices, earnings and CPP Indices stock_prices[ii] = sd.CurrentPrice; earn_share[ii] = sd.EarningsPerShare; old_index = info.CPPIndex; } } // Trade for Sbhave1 int Sbhave1::Trade() { int num_shares; double my_bal; // gives My balance StockMarketInfo info; StockData sd; my_bal = GetBroker()->GetBalance(); GetBroker()->GetStockMarketInfo( info ); for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); //Calculate maximum no of shares you can buy num_shares = int(my_bal / sd.CurrentPrice); // no of shares you want to buy int no_stocks = 700; if (no_stocks > num_shares) no_stocks = num_shares; if( trade_flag[ii] == BUY_STK ) { GetBroker()->Buy( ii, no_stocks ); } else if( trade_flag[ii] == SEL_STK ) { GetBroker()->Sell( ii ); } } return 0; } // Constructor for Sbhave2 Sbhave2::Sbhave2( int TN ):Trader( TN ) { unit_time = 0; StockMarketInfo info; GetBroker()->GetStockMarketInfo( info ); stock_hist = new StockHistory[info.NumberOfStocks]; trade_flag = new int[info.NumberOfStocks]; curr_prize = new double[info.NumberOfStocks]; // sell_avg = new double[info.NumberOfStocks]; buy_factor = new int[info.NumberOfStocks]; old_index = info.CPPIndex; }; //Destructor for Sbhave2 Sbhave2 ::~Sbhave2() { delete [] stock_hist; delete [] trade_flag; delete [] curr_prize; // delete [] sell_avg; delete [] buy_factor; }; // Think for Sbhave2 void Sbhave2::Think() { int trend_type; double cent_change; StockMarketInfo info; StockData sd; //AssetData *(*ad)[]; unit_time ++; GetBroker()->GetStockMarketInfo( info ); //ad = new AssetData *[info.NumberOfStocks]; for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); // read values for calculating market trend stock_hist[ii].set_price(unit_time,sd.CurrentPrice); // read current prizes curr_prize[ii] = sd.CurrentPrice; // check percentage change cent_change = stock_hist[ii].percent_change(5); //check market trend trend_type = stock_hist[ii].get_trend(5); if (unit_time > 2) { if (trend_type == 1 && cent_change > 5.0 ) { trade_flag[ii] = SEL_STK; // tried to get data from Asset data, didn't work out /* GetBroker()->GetWorth(&ad,&bal); sell_avg[ii] =(*ad[ii]->PurchasePrice / *ad[ii]->NumShares); if (sell_avg[ii] > curr_prize[ii] ) trade_flag[ii] = SEL_STK; else { trade_flag[ii] = NO_DEAL; break; }*/ } else if (trend_type == 0 && cent_change < -5.0) { buy_factor[ii] = 1; if(cent_change <=-25.0 && cent_change >= -5.0 ) buy_factor[ii] = 3; else if(cent_change <= -35.0 && cent_change > -25.0) buy_factor[ii] = 10; else if(cent_change <= -45.0 && cent_change > -35.0) buy_factor[ii] = 30; else if(cent_change >= -45.0) buy_factor[ii] = 50; trade_flag[ii] = BUY_STK; } else { trade_flag[ii] = NO_DEAL; } old_index = info.CPPIndex; } } } // Trade for Sbhave2 int Sbhave2::Trade() { int num_shares;// max shares double my_bal; // gives My balance StockMarketInfo info; StockData sd; // get current balance my_bal = GetBroker()->GetBalance(); GetBroker()->GetStockMarketInfo( info ); for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); //maximum no of shares you can buy num_shares = int(my_bal / sd.CurrentPrice); // no of shares you want to buy int no_stocks = buy_factor[ii] * 10; if (no_stocks > num_shares) no_stocks = num_shares; if( trade_flag[ii] == BUY_STK ) { GetBroker()->Buy( ii, no_stocks ); } else if( trade_flag[ii] == SEL_STK ) { GetBroker()->Sell( ii ); } } //done trading return 0; } // Constructor for Sbhave3 Sbhave3::Sbhave3( int TN ):Trader( TN ) { unit_time = 0; StockMarketInfo info; GetBroker()->GetStockMarketInfo( info ); stock_hist = new StockHistory[info.NumberOfStocks]; trade_flag = new int[info.NumberOfStocks]; old_index = info.CPPIndex; }; //Destructor for Sbhave3 Sbhave3 ::~Sbhave3() { delete [] stock_hist; delete [] trade_flag; }; // Think for Sbhave3 void Sbhave3::Think() { int trend_type; StockMarketInfo info; StockData sd; unit_time ++; GetBroker()->GetStockMarketInfo( info ); for( int ii = 0; ii < info.NumberOfStocks; ii++ ) { GetBroker()->GetStockInfo( ii, sd ); stock_hist[ii].set_price(unit_time,sd.CurrentPrice); //checks trend for last 10 units trend_type = stock_hist[ii].get_trend(10); //if trend is up then sell, down then buy shares if (trend_type == 1 && old_index < info.CPPIndex ) { trade_flag[ii] = SEL_STK; } else if (trend_type == 0 && old_index > info.CPPIndex ) { trade_flag[ii] = BUY_STK; } else { trade_flag[ii] = NO_DEAL; } //update CPP Index old_index = info.CPPIndex; } } // Trade for Sbhave3 int Sbhave3::Trade() { StockMarketInfo info; GetBroker()->GetStockMarketInfo( info ); for( int ii = 0; ii < info.NumberOfStocks; ii++ ) {//if trend is steady for last 10 units then only buy or sell if( trade_flag[ii] == BUY_STK ) { GetBroker()->Buy( ii, 500 ); } else if( trade_flag[ii] == SEL_STK ) { GetBroker()->Sell( ii ); } } return 0; }