diff --git a/AAPL.json b/AAPL.json new file mode 100644 index 0000000..cbf924a --- /dev/null +++ b/AAPL.json @@ -0,0 +1 @@ +{"query":{"count":252,"created":"2016-09-29T21:11:41Z","lang":"en-US","diagnostics":{"url":[{"execution-start-time":"1","execution-stop-time":"2","execution-time":"1","proxy":"DEFAULT","content":"http://www.datatables.org/yahoo/finance/yahoo.finance.historicaldata.xml"},{"execution-start-time":"6","execution-stop-time":"7","execution-time":"1","proxy":"DEFAULT","content":"http://ichart.finance.yahoo.com/table.csv?a=0&b=1&e=31&g=d&c=2014&d=11&f=2014&s=AAPL"},{"execution-start-time":"12","execution-stop-time":"12","execution-time":"0","proxy":"DEFAULT","content":"http://ichart.finance.yahoo.com/table.csv?a=0&b=1&e=31&g=d&c=2014&d=11&f=2014&s=AAPL"}],"publiclyCallable":"true","cache":[{"execution-start-time":"5","execution-stop-time":"6","execution-time":"1","method":"GET","type":"MEMCACHED","content":"f756d73c9b6c7b01a1d7f9c2ff5f9809"},{"execution-start-time":"10","execution-stop-time":"11","execution-time":"1","method":"GET","type":"MEMCACHED","content":"230584bed0cbcab0d8e6f863db02c098"}],"query":[{"execution-start-time":"6","execution-stop-time":"10","execution-time":"4","params":"{url=[http://ichart.finance.yahoo.com/table.csv?a=0&b=1&e=31&g=d&c=2014&d=11&f=2014&s=AAPL]}","content":"select * from csv(0,1) where url=@url"},{"execution-start-time":"11","execution-stop-time":"15","execution-time":"4","params":"{columnsNames=[Date,Open,High,Low,Close,Volume,Adj_Close], url=[http://ichart.finance.yahoo.com/table.csv?a=0&b=1&e=31&g=d&c=2014&d=11&f=2014&s=AAPL]}","content":"select * from csv(2,0) where url=@url and columns=@columnsNames"}],"javascript":{"execution-start-time":"3","execution-stop-time":"1030","execution-time":"1026","instructions-used":"24196224","table-name":"yahoo.finance.historicaldata"},"user-time":"1038","service-time":"4","build-version":"0.2.54"},"results":{"quote":[{"Symbol":"AAPL","Date":"2014-12-31","Open":"112.82","High":"113.129997","Low":"110.209999","Close":"110.379997","Volume":"41403400","Adj_Close":"106.71374"},{"Symbol":"AAPL","Date":"2014-12-30","Open":"113.639999","High":"113.919998","Low":"112.110001","Close":"112.519997","Volume":"29881500","Adj_Close":"108.78266"},{"Symbol":"AAPL","Date":"2014-12-29","Open":"113.790001","High":"114.769997","Low":"113.699997","Close":"113.910004","Volume":"27598900","Adj_Close":"110.126498"},{"Symbol":"AAPL","Date":"2014-12-26","Open":"112.099998","High":"114.519997","Low":"112.010002","Close":"113.989998","Volume":"33721000","Adj_Close":"110.203835"},{"Symbol":"AAPL","Date":"2014-12-24","Open":"112.580002","High":"112.709999","Low":"112.010002","Close":"112.010002","Volume":"14479600","Adj_Close":"108.289605"},{"Symbol":"AAPL","Date":"2014-12-23","Open":"113.230003","High":"113.330002","Low":"112.459999","Close":"112.540001","Volume":"26028400","Adj_Close":"108.802"},{"Symbol":"AAPL","Date":"2014-12-22","Open":"112.160004","High":"113.489998","Low":"111.970001","Close":"112.940002","Volume":"45167500","Adj_Close":"109.188715"},{"Symbol":"AAPL","Date":"2014-12-19","Open":"112.260002","High":"113.239998","Low":"111.660004","Close":"111.779999","Volume":"88429800","Adj_Close":"108.067241"},{"Symbol":"AAPL","Date":"2014-12-18","Open":"111.870003","High":"112.650002","Low":"110.660004","Close":"112.650002","Volume":"59006200","Adj_Close":"108.908347"},{"Symbol":"AAPL","Date":"2014-12-17","Open":"107.120003","High":"109.839996","Low":"106.82","Close":"109.410004","Volume":"53411800","Adj_Close":"105.775965"},{"Symbol":"AAPL","Date":"2014-12-16","Open":"106.370003","High":"110.160004","Low":"106.260002","Close":"106.75","Volume":"60790700","Adj_Close":"103.204313"},{"Symbol":"AAPL","Date":"2014-12-15","Open":"110.699997","High":"111.599998","Low":"106.349998","Close":"108.230003","Volume":"67218100","Adj_Close":"104.635158"},{"Symbol":"AAPL","Date":"2014-12-12","Open":"110.459999","High":"111.870003","Low":"109.580002","Close":"109.730003","Volume":"56028100","Adj_Close":"106.085336"},{"Symbol":"AAPL","Date":"2014-12-11","Open":"112.260002","High":"113.800003","Low":"111.339996","Close":"111.620003","Volume":"41401700","Adj_Close":"107.912559"},{"Symbol":"AAPL","Date":"2014-12-10","Open":"114.410004","High":"114.849998","Low":"111.540001","Close":"111.949997","Volume":"44565300","Adj_Close":"108.231593"},{"Symbol":"AAPL","Date":"2014-12-09","Open":"110.190002","High":"114.300003","Low":"109.349998","Close":"114.120003","Volume":"60208000","Adj_Close":"110.329522"},{"Symbol":"AAPL","Date":"2014-12-08","Open":"114.099998","High":"114.650002","Low":"111.620003","Close":"112.400002","Volume":"57664900","Adj_Close":"108.66665"},{"Symbol":"AAPL","Date":"2014-12-05","Open":"115.989998","High":"116.080002","Low":"114.639999","Close":"115.00","Volume":"38318900","Adj_Close":"111.18029"},{"Symbol":"AAPL","Date":"2014-12-04","Open":"115.769997","High":"117.199997","Low":"115.290001","Close":"115.489998","Volume":"42044500","Adj_Close":"111.654013"},{"Symbol":"AAPL","Date":"2014-12-03","Open":"115.75","High":"116.349998","Low":"115.110001","Close":"115.93","Volume":"43063400","Adj_Close":"112.079401"},{"Symbol":"AAPL","Date":"2014-12-02","Open":"113.50","High":"115.75","Low":"112.75","Close":"114.629997","Volume":"59348900","Adj_Close":"110.822577"},{"Symbol":"AAPL","Date":"2014-12-01","Open":"118.809998","High":"119.25","Low":"111.269997","Close":"115.07","Volume":"83814000","Adj_Close":"111.247965"},{"Symbol":"AAPL","Date":"2014-11-28","Open":"119.269997","High":"119.400002","Low":"118.050003","Close":"118.93","Volume":"24814400","Adj_Close":"114.979756"},{"Symbol":"AAPL","Date":"2014-11-26","Open":"117.940002","High":"119.099998","Low":"117.830002","Close":"119.00","Volume":"40768300","Adj_Close":"115.047431"},{"Symbol":"AAPL","Date":"2014-11-25","Open":"119.07","High":"119.75","Low":"117.449997","Close":"117.599998","Volume":"68840400","Adj_Close":"113.69393"},{"Symbol":"AAPL","Date":"2014-11-24","Open":"116.849998","High":"118.769997","Low":"116.620003","Close":"118.629997","Volume":"47450800","Adj_Close":"114.689718"},{"Symbol":"AAPL","Date":"2014-11-21","Open":"117.510002","High":"117.57","Low":"116.029999","Close":"116.470001","Volume":"57179300","Adj_Close":"112.601466"},{"Symbol":"AAPL","Date":"2014-11-20","Open":"114.910004","High":"116.860001","Low":"114.849998","Close":"116.309998","Volume":"43395500","Adj_Close":"112.446776"},{"Symbol":"AAPL","Date":"2014-11-19","Open":"115.440002","High":"115.739998","Low":"113.800003","Close":"114.669998","Volume":"41869200","Adj_Close":"110.861249"},{"Symbol":"AAPL","Date":"2014-11-18","Open":"113.940002","High":"115.690002","Low":"113.889999","Close":"115.470001","Volume":"44224000","Adj_Close":"111.63468"},{"Symbol":"AAPL","Date":"2014-11-17","Open":"114.269997","High":"117.279999","Low":"113.300003","Close":"113.989998","Volume":"46746700","Adj_Close":"110.203835"},{"Symbol":"AAPL","Date":"2014-11-14","Open":"113.150002","High":"114.190002","Low":"111.209999","Close":"114.18","Volume":"44063600","Adj_Close":"110.387527"},{"Symbol":"AAPL","Date":"2014-11-13","Open":"111.800003","High":"113.449997","Low":"111.599998","Close":"112.82","Volume":"59522900","Adj_Close":"109.072698"},{"Symbol":"AAPL","Date":"2014-11-12","Open":"109.379997","High":"111.43","Low":"109.370003","Close":"111.25","Volume":"46942400","Adj_Close":"107.554846"},{"Symbol":"AAPL","Date":"2014-11-11","Open":"108.699997","High":"109.75","Low":"108.400002","Close":"109.699997","Volume":"27442300","Adj_Close":"106.056326"},{"Symbol":"AAPL","Date":"2014-11-10","Open":"109.019997","High":"109.330002","Low":"108.669998","Close":"108.830002","Volume":"27195500","Adj_Close":"105.215228"},{"Symbol":"AAPL","Date":"2014-11-07","Open":"108.75","High":"109.32","Low":"108.550003","Close":"109.010002","Volume":"33691500","Adj_Close":"105.389249"},{"Symbol":"AAPL","Date":"2014-11-06","Open":"108.599998","High":"108.790001","Low":"107.800003","Close":"108.699997","Volume":"34968500","Adj_Close":"105.089541"},{"Symbol":"AAPL","Date":"2014-11-05","Open":"109.099998","High":"109.300003","Low":"108.129997","Close":"108.860001","Volume":"37435900","Adj_Close":"104.789843"},{"Symbol":"AAPL","Date":"2014-11-04","Open":"109.360001","High":"109.489998","Low":"107.720001","Close":"108.599998","Volume":"41574400","Adj_Close":"104.539562"},{"Symbol":"AAPL","Date":"2014-11-03","Open":"108.220001","High":"110.300003","Low":"108.010002","Close":"109.400002","Volume":"52282600","Adj_Close":"105.309654"},{"Symbol":"AAPL","Date":"2014-10-31","Open":"108.010002","High":"108.040001","Low":"107.209999","Close":"108.00","Volume":"44639300","Adj_Close":"103.961997"},{"Symbol":"AAPL","Date":"2014-10-30","Open":"106.959999","High":"107.349998","Low":"105.900002","Close":"106.980003","Volume":"40654800","Adj_Close":"102.980136"},{"Symbol":"AAPL","Date":"2014-10-29","Open":"106.650002","High":"107.370003","Low":"106.360001","Close":"107.339996","Volume":"52687900","Adj_Close":"103.32667"},{"Symbol":"AAPL","Date":"2014-10-28","Open":"105.400002","High":"106.739998","Low":"105.349998","Close":"106.739998","Volume":"48060900","Adj_Close":"102.749105"},{"Symbol":"AAPL","Date":"2014-10-27","Open":"104.849998","High":"105.480003","Low":"104.699997","Close":"105.110001","Volume":"34187700","Adj_Close":"101.180051"},{"Symbol":"AAPL","Date":"2014-10-24","Open":"105.18","High":"105.489998","Low":"104.529999","Close":"105.220001","Volume":"47053900","Adj_Close":"101.285939"},{"Symbol":"AAPL","Date":"2014-10-23","Open":"104.080002","High":"105.050003","Low":"103.629997","Close":"104.830002","Volume":"71074700","Adj_Close":"100.910521"},{"Symbol":"AAPL","Date":"2014-10-22","Open":"102.839996","High":"104.110001","Low":"102.599998","Close":"102.989998","Volume":"68263100","Adj_Close":"99.139313"},{"Symbol":"AAPL","Date":"2014-10-21","Open":"103.019997","High":"103.019997","Low":"101.269997","Close":"102.470001","Volume":"94623900","Adj_Close":"98.638758"},{"Symbol":"AAPL","Date":"2014-10-20","Open":"98.32","High":"99.959999","Low":"98.220001","Close":"99.760002","Volume":"77517300","Adj_Close":"96.030083"},{"Symbol":"AAPL","Date":"2014-10-17","Open":"97.50","High":"99.00","Low":"96.809998","Close":"97.669998","Volume":"68179700","Adj_Close":"94.018222"},{"Symbol":"AAPL","Date":"2014-10-16","Open":"95.550003","High":"97.720001","Low":"95.410004","Close":"96.260002","Volume":"72154500","Adj_Close":"92.660945"},{"Symbol":"AAPL","Date":"2014-10-15","Open":"97.970001","High":"99.150002","Low":"95.18","Close":"97.540001","Volume":"100933600","Adj_Close":"93.893086"},{"Symbol":"AAPL","Date":"2014-10-14","Open":"100.389999","High":"100.519997","Low":"98.57","Close":"98.75","Volume":"63688600","Adj_Close":"95.057844"},{"Symbol":"AAPL","Date":"2014-10-13","Open":"101.330002","High":"101.779999","Low":"99.809998","Close":"99.809998","Volume":"53583400","Adj_Close":"96.078209"},{"Symbol":"AAPL","Date":"2014-10-10","Open":"100.690002","High":"102.029999","Low":"100.300003","Close":"100.730003","Volume":"66331600","Adj_Close":"96.963817"},{"Symbol":"AAPL","Date":"2014-10-09","Open":"101.540001","High":"102.379997","Low":"100.610001","Close":"101.019997","Volume":"77376500","Adj_Close":"97.242968"},{"Symbol":"AAPL","Date":"2014-10-08","Open":"98.760002","High":"101.110001","Low":"98.309998","Close":"100.800003","Volume":"57404700","Adj_Close":"97.0312"},{"Symbol":"AAPL","Date":"2014-10-07","Open":"99.43","High":"100.120003","Low":"98.730003","Close":"98.75","Volume":"42094200","Adj_Close":"95.057844"},{"Symbol":"AAPL","Date":"2014-10-06","Open":"99.949997","High":"100.650002","Low":"99.419998","Close":"99.620003","Volume":"37051200","Adj_Close":"95.895318"},{"Symbol":"AAPL","Date":"2014-10-03","Open":"99.440002","High":"100.209999","Low":"99.040001","Close":"99.620003","Volume":"43469600","Adj_Close":"95.895318"},{"Symbol":"AAPL","Date":"2014-10-02","Open":"99.269997","High":"100.220001","Low":"98.040001","Close":"99.900002","Volume":"47757800","Adj_Close":"96.164848"},{"Symbol":"AAPL","Date":"2014-10-01","Open":"100.589996","High":"100.690002","Low":"98.699997","Close":"99.18","Volume":"51491300","Adj_Close":"95.471767"},{"Symbol":"AAPL","Date":"2014-09-30","Open":"100.809998","High":"101.540001","Low":"100.529999","Close":"100.75","Volume":"55264100","Adj_Close":"96.983066"},{"Symbol":"AAPL","Date":"2014-09-29","Open":"98.650002","High":"100.440002","Low":"98.629997","Close":"100.110001","Volume":"49766300","Adj_Close":"96.366996"},{"Symbol":"AAPL","Date":"2014-09-26","Open":"98.529999","High":"100.75","Low":"98.400002","Close":"100.75","Volume":"62370500","Adj_Close":"96.983066"},{"Symbol":"AAPL","Date":"2014-09-25","Open":"100.510002","High":"100.709999","Low":"97.720001","Close":"97.870003","Volume":"100092000","Adj_Close":"94.210749"},{"Symbol":"AAPL","Date":"2014-09-24","Open":"102.160004","High":"102.849998","Low":"101.199997","Close":"101.75","Volume":"60171800","Adj_Close":"97.945677"},{"Symbol":"AAPL","Date":"2014-09-23","Open":"100.599998","High":"102.940002","Low":"100.540001","Close":"102.639999","Volume":"63402200","Adj_Close":"98.802401"},{"Symbol":"AAPL","Date":"2014-09-22","Open":"101.800003","High":"102.139999","Low":"100.580002","Close":"101.059998","Volume":"52788400","Adj_Close":"97.281473"},{"Symbol":"AAPL","Date":"2014-09-19","Open":"102.290001","High":"102.349998","Low":"100.50","Close":"100.959999","Volume":"70902400","Adj_Close":"97.185214"},{"Symbol":"AAPL","Date":"2014-09-18","Open":"101.93","High":"102.349998","Low":"101.559998","Close":"101.790001","Volume":"37299400","Adj_Close":"97.984183"},{"Symbol":"AAPL","Date":"2014-09-17","Open":"101.269997","High":"101.800003","Low":"100.589996","Close":"101.580002","Volume":"60926500","Adj_Close":"97.782035"},{"Symbol":"AAPL","Date":"2014-09-16","Open":"99.800003","High":"101.260002","Low":"98.889999","Close":"100.860001","Volume":"66908100","Adj_Close":"97.088954"},{"Symbol":"AAPL","Date":"2014-09-15","Open":"102.809998","High":"103.050003","Low":"101.440002","Close":"101.629997","Volume":"61316500","Adj_Close":"97.830161"},{"Symbol":"AAPL","Date":"2014-09-12","Open":"101.209999","High":"102.190002","Low":"101.080002","Close":"101.660004","Volume":"62626100","Adj_Close":"97.859046"},{"Symbol":"AAPL","Date":"2014-09-11","Open":"100.410004","High":"101.440002","Low":"99.620003","Close":"101.43","Volume":"62353100","Adj_Close":"97.637642"},{"Symbol":"AAPL","Date":"2014-09-10","Open":"98.010002","High":"101.110001","Low":"97.760002","Close":"101.00","Volume":"100869600","Adj_Close":"97.223719"},{"Symbol":"AAPL","Date":"2014-09-09","Open":"99.080002","High":"103.080002","Low":"96.139999","Close":"97.989998","Volume":"189846300","Adj_Close":"94.326258"},{"Symbol":"AAPL","Date":"2014-09-08","Open":"99.300003","High":"99.309998","Low":"98.050003","Close":"98.360001","Volume":"46356700","Adj_Close":"94.682426"},{"Symbol":"AAPL","Date":"2014-09-05","Open":"98.800003","High":"99.389999","Low":"98.309998","Close":"98.970001","Volume":"58457000","Adj_Close":"95.26962"},{"Symbol":"AAPL","Date":"2014-09-04","Open":"98.849998","High":"100.089996","Low":"97.790001","Close":"98.120003","Volume":"85718000","Adj_Close":"94.451402"},{"Symbol":"AAPL","Date":"2014-09-03","Open":"103.099998","High":"103.199997","Low":"98.580002","Close":"98.940002","Volume":"125421000","Adj_Close":"95.240743"},{"Symbol":"AAPL","Date":"2014-09-02","Open":"103.059998","High":"103.739998","Low":"102.720001","Close":"103.300003","Volume":"53564000","Adj_Close":"99.437727"},{"Symbol":"AAPL","Date":"2014-08-29","Open":"102.860001","High":"102.900002","Low":"102.199997","Close":"102.50","Volume":"44595000","Adj_Close":"98.667636"},{"Symbol":"AAPL","Date":"2014-08-28","Open":"101.589996","High":"102.779999","Low":"101.559998","Close":"102.25","Volume":"68460000","Adj_Close":"98.426983"},{"Symbol":"AAPL","Date":"2014-08-27","Open":"101.019997","High":"102.57","Low":"100.699997","Close":"102.129997","Volume":"52369000","Adj_Close":"98.311467"},{"Symbol":"AAPL","Date":"2014-08-26","Open":"101.419998","High":"101.50","Low":"100.860001","Close":"100.889999","Volume":"33152000","Adj_Close":"97.117831"},{"Symbol":"AAPL","Date":"2014-08-25","Open":"101.790001","High":"102.169998","Low":"101.279999","Close":"101.540001","Volume":"40270000","Adj_Close":"97.74353"},{"Symbol":"AAPL","Date":"2014-08-22","Open":"100.290001","High":"101.470001","Low":"100.190002","Close":"101.32","Volume":"44184000","Adj_Close":"97.531754"},{"Symbol":"AAPL","Date":"2014-08-21","Open":"100.57","High":"100.940002","Low":"100.110001","Close":"100.580002","Volume":"33478000","Adj_Close":"96.819424"},{"Symbol":"AAPL","Date":"2014-08-20","Open":"100.440002","High":"101.089996","Low":"99.949997","Close":"100.57","Volume":"52699000","Adj_Close":"96.809796"},{"Symbol":"AAPL","Date":"2014-08-19","Open":"99.410004","High":"100.68","Low":"99.32","Close":"100.529999","Volume":"69399000","Adj_Close":"96.771291"},{"Symbol":"AAPL","Date":"2014-08-18","Open":"98.489998","High":"99.370003","Low":"97.980003","Close":"99.160004","Volume":"47572000","Adj_Close":"95.452518"},{"Symbol":"AAPL","Date":"2014-08-15","Open":"97.900002","High":"98.190002","Low":"96.860001","Close":"97.980003","Volume":"48951000","Adj_Close":"94.316637"},{"Symbol":"AAPL","Date":"2014-08-14","Open":"97.330002","High":"97.57","Low":"96.800003","Close":"97.50","Volume":"28116000","Adj_Close":"93.85458"},{"Symbol":"AAPL","Date":"2014-08-13","Open":"96.150002","High":"97.239998","Low":"96.040001","Close":"97.239998","Volume":"31916000","Adj_Close":"93.604299"},{"Symbol":"AAPL","Date":"2014-08-12","Open":"96.040001","High":"96.879997","Low":"95.610001","Close":"95.970001","Volume":"33795000","Adj_Close":"92.381786"},{"Symbol":"AAPL","Date":"2014-08-11","Open":"95.269997","High":"96.080002","Low":"94.839996","Close":"95.989998","Volume":"36585000","Adj_Close":"92.401035"},{"Symbol":"AAPL","Date":"2014-08-08","Open":"94.260002","High":"94.82","Low":"93.279999","Close":"94.739998","Volume":"41865000","Adj_Close":"91.197772"},{"Symbol":"AAPL","Date":"2014-08-07","Open":"94.93","High":"95.949997","Low":"94.099998","Close":"94.480003","Volume":"46711000","Adj_Close":"90.947498"},{"Symbol":"AAPL","Date":"2014-08-06","Open":"94.75","High":"95.480003","Low":"94.709999","Close":"94.959999","Volume":"38558000","Adj_Close":"90.957116"},{"Symbol":"AAPL","Date":"2014-08-05","Open":"95.360001","High":"95.68","Low":"94.360001","Close":"95.120003","Volume":"55933000","Adj_Close":"91.110375"},{"Symbol":"AAPL","Date":"2014-08-04","Open":"96.370003","High":"96.580002","Low":"95.169998","Close":"95.589996","Volume":"39958000","Adj_Close":"91.560557"},{"Symbol":"AAPL","Date":"2014-08-01","Open":"94.900002","High":"96.620003","Low":"94.809998","Close":"96.129997","Volume":"48511000","Adj_Close":"92.077795"},{"Symbol":"AAPL","Date":"2014-07-31","Open":"97.160004","High":"97.449997","Low":"95.330002","Close":"95.599998","Volume":"56843000","Adj_Close":"91.570137"},{"Symbol":"AAPL","Date":"2014-07-30","Open":"98.440002","High":"98.699997","Low":"97.669998","Close":"98.150002","Volume":"33010000","Adj_Close":"94.012649"},{"Symbol":"AAPL","Date":"2014-07-29","Open":"99.330002","High":"99.440002","Low":"98.25","Close":"98.379997","Volume":"43143000","Adj_Close":"94.23295"},{"Symbol":"AAPL","Date":"2014-07-28","Open":"97.82","High":"99.239998","Low":"97.550003","Close":"99.019997","Volume":"55318000","Adj_Close":"94.845971"},{"Symbol":"AAPL","Date":"2014-07-25","Open":"96.849998","High":"97.839996","Low":"96.639999","Close":"97.669998","Volume":"43469000","Adj_Close":"93.55288"},{"Symbol":"AAPL","Date":"2014-07-24","Open":"97.040001","High":"97.32","Low":"96.419998","Close":"97.029999","Volume":"45729000","Adj_Close":"92.939858"},{"Symbol":"AAPL","Date":"2014-07-23","Open":"95.419998","High":"97.879997","Low":"95.169998","Close":"97.190002","Volume":"92918000","Adj_Close":"93.093117"},{"Symbol":"AAPL","Date":"2014-07-22","Open":"94.68","High":"94.889999","Low":"94.120003","Close":"94.720001","Volume":"55197000","Adj_Close":"90.727235"},{"Symbol":"AAPL","Date":"2014-07-21","Open":"94.989998","High":"95.00","Low":"93.720001","Close":"93.940002","Volume":"39079000","Adj_Close":"89.980116"},{"Symbol":"AAPL","Date":"2014-07-18","Open":"93.620003","High":"94.739998","Low":"93.019997","Close":"94.43","Volume":"49988000","Adj_Close":"90.449459"},{"Symbol":"AAPL","Date":"2014-07-17","Open":"95.029999","High":"95.279999","Low":"92.57","Close":"93.089996","Volume":"57298000","Adj_Close":"89.16594"},{"Symbol":"AAPL","Date":"2014-07-16","Open":"96.970001","High":"97.099998","Low":"94.739998","Close":"94.779999","Volume":"53396300","Adj_Close":"90.784704"},{"Symbol":"AAPL","Date":"2014-07-15","Open":"96.800003","High":"96.849998","Low":"95.029999","Close":"95.32","Volume":"45477900","Adj_Close":"91.301942"},{"Symbol":"AAPL","Date":"2014-07-14","Open":"95.860001","High":"96.889999","Low":"95.650002","Close":"96.449997","Volume":"42810000","Adj_Close":"92.384306"},{"Symbol":"AAPL","Date":"2014-07-11","Open":"95.360001","High":"95.889999","Low":"94.860001","Close":"95.220001","Volume":"34018000","Adj_Close":"91.206158"},{"Symbol":"AAPL","Date":"2014-07-10","Open":"93.760002","High":"95.550003","Low":"93.519997","Close":"95.040001","Volume":"39686000","Adj_Close":"91.033746"},{"Symbol":"AAPL","Date":"2014-07-09","Open":"95.440002","High":"95.949997","Low":"94.760002","Close":"95.389999","Volume":"36436000","Adj_Close":"91.368991"},{"Symbol":"AAPL","Date":"2014-07-08","Open":"96.269997","High":"96.800003","Low":"93.919998","Close":"95.349998","Volume":"65222000","Adj_Close":"91.330676"},{"Symbol":"AAPL","Date":"2014-07-07","Open":"94.139999","High":"95.989998","Low":"94.099998","Close":"95.970001","Volume":"56468000","Adj_Close":"91.924543"},{"Symbol":"AAPL","Date":"2014-07-03","Open":"93.669998","High":"94.099998","Low":"93.199997","Close":"94.029999","Volume":"22891800","Adj_Close":"90.066319"},{"Symbol":"AAPL","Date":"2014-07-02","Open":"93.870003","High":"94.059998","Low":"93.089996","Close":"93.480003","Volume":"28465000","Adj_Close":"89.539507"},{"Symbol":"AAPL","Date":"2014-07-01","Open":"93.519997","High":"94.07","Low":"93.129997","Close":"93.519997","Volume":"38223000","Adj_Close":"89.577815"},{"Symbol":"AAPL","Date":"2014-06-30","Open":"92.099998","High":"93.730003","Low":"92.089996","Close":"92.93","Volume":"49482300","Adj_Close":"89.012689"},{"Symbol":"AAPL","Date":"2014-06-27","Open":"90.82","High":"92.00","Low":"90.769997","Close":"91.980003","Volume":"64029000","Adj_Close":"88.102737"},{"Symbol":"AAPL","Date":"2014-06-26","Open":"90.370003","High":"91.050003","Low":"89.800003","Close":"90.900002","Volume":"32629000","Adj_Close":"87.068261"},{"Symbol":"AAPL","Date":"2014-06-25","Open":"90.209999","High":"90.699997","Low":"89.650002","Close":"90.360001","Volume":"36869000","Adj_Close":"86.551023"},{"Symbol":"AAPL","Date":"2014-06-24","Open":"90.75","High":"91.739998","Low":"90.190002","Close":"90.279999","Volume":"39036000","Adj_Close":"86.474394"},{"Symbol":"AAPL","Date":"2014-06-23","Open":"91.32","High":"91.620003","Low":"90.599998","Close":"90.830002","Volume":"43694000","Adj_Close":"87.001212"},{"Symbol":"AAPL","Date":"2014-06-20","Open":"91.849998","High":"92.550003","Low":"90.900002","Close":"90.910004","Volume":"100898000","Adj_Close":"87.077842"},{"Symbol":"AAPL","Date":"2014-06-19","Open":"92.290001","High":"92.300003","Low":"91.339996","Close":"91.860001","Volume":"35528000","Adj_Close":"87.987793"},{"Symbol":"AAPL","Date":"2014-06-18","Open":"92.269997","High":"92.290001","Low":"91.349998","Close":"92.18","Volume":"33514000","Adj_Close":"88.294304"},{"Symbol":"AAPL","Date":"2014-06-17","Open":"92.309998","High":"92.699997","Low":"91.800003","Close":"92.080002","Volume":"29726000","Adj_Close":"88.198521"},{"Symbol":"AAPL","Date":"2014-06-16","Open":"91.510002","High":"92.75","Low":"91.449997","Close":"92.199997","Volume":"35561000","Adj_Close":"88.313457"},{"Symbol":"AAPL","Date":"2014-06-13","Open":"92.199997","High":"92.440002","Low":"90.879997","Close":"91.279999","Volume":"54525000","Adj_Close":"87.43224"},{"Symbol":"AAPL","Date":"2014-06-12","Open":"94.040001","High":"94.120003","Low":"91.900002","Close":"92.290001","Volume":"54749000","Adj_Close":"88.399667"},{"Symbol":"AAPL","Date":"2014-06-11","Open":"94.129997","High":"94.760002","Low":"93.470001","Close":"93.860001","Volume":"45681000","Adj_Close":"89.903486"},{"Symbol":"AAPL","Date":"2014-06-10","Open":"94.730003","High":"95.050003","Low":"93.57","Close":"94.25","Volume":"62777000","Adj_Close":"90.277046"},{"Symbol":"AAPL","Date":"2014-06-09","Open":"92.699997","High":"93.879997","Low":"91.75","Close":"93.699997","Volume":"75415000","Adj_Close":"89.750227"},{"Symbol":"AAPL","Date":"2014-06-06","Open":"649.900002","High":"651.259979","Low":"644.470024","Close":"645.570023","Volume":"87484600","Adj_Close":"88.336725"},{"Symbol":"AAPL","Date":"2014-06-05","Open":"646.199997","High":"649.370003","Low":"642.610008","Close":"647.349983","Volume":"75951400","Adj_Close":"88.580287"},{"Symbol":"AAPL","Date":"2014-06-04","Open":"637.44001","High":"647.890022","Low":"636.109993","Close":"644.819992","Volume":"83870500","Adj_Close":"88.234095"},{"Symbol":"AAPL","Date":"2014-06-03","Open":"628.459991","High":"638.740013","Low":"628.25","Close":"637.539986","Volume":"73177300","Adj_Close":"87.237933"},{"Symbol":"AAPL","Date":"2014-06-02","Open":"633.959984","High":"634.830017","Low":"622.500015","Close":"628.650009","Volume":"92337700","Adj_Close":"86.021471"},{"Symbol":"AAPL","Date":"2014-05-30","Open":"637.979996","High":"644.169991","Low":"628.900002","Close":"633.000015","Volume":"141005200","Adj_Close":"86.616706"},{"Symbol":"AAPL","Date":"2014-05-29","Open":"627.849991","High":"636.87001","Low":"627.769989","Close":"635.37999","Volume":"94118500","Adj_Close":"86.94237"},{"Symbol":"AAPL","Date":"2014-05-28","Open":"626.019989","High":"629.830009","Low":"623.779991","Close":"624.01001","Volume":"78870400","Adj_Close":"85.386556"},{"Symbol":"AAPL","Date":"2014-05-27","Open":"615.879997","High":"625.859985","Low":"615.630005","Close":"625.63002","Volume":"87216500","Adj_Close":"85.608231"},{"Symbol":"AAPL","Date":"2014-05-23","Open":"607.25","High":"614.730011","Low":"606.470009","Close":"614.129997","Volume":"58052400","Adj_Close":"84.034622"},{"Symbol":"AAPL","Date":"2014-05-22","Open":"606.599998","High":"609.850006","Low":"604.100021","Close":"607.269974","Volume":"50190000","Adj_Close":"83.095929"},{"Symbol":"AAPL","Date":"2014-05-21","Open":"603.830002","High":"606.699974","Low":"602.059975","Close":"606.310005","Volume":"49214900","Adj_Close":"82.964572"},{"Symbol":"AAPL","Date":"2014-05-20","Open":"604.510017","High":"606.399994","Low":"600.730011","Close":"604.710022","Volume":"58709000","Adj_Close":"82.745638"},{"Symbol":"AAPL","Date":"2014-05-19","Open":"597.849998","High":"607.330002","Low":"597.329987","Close":"604.590019","Volume":"79438800","Adj_Close":"82.729217"},{"Symbol":"AAPL","Date":"2014-05-16","Open":"588.629974","High":"597.529991","Low":"585.399994","Close":"597.510017","Volume":"69064100","Adj_Close":"81.760423"},{"Symbol":"AAPL","Date":"2014-05-15","Open":"594.70002","High":"596.599983","Low":"588.040001","Close":"588.819992","Volume":"57711500","Adj_Close":"80.571322"},{"Symbol":"AAPL","Date":"2014-05-14","Open":"592.430008","High":"597.400002","Low":"591.740005","Close":"593.869987","Volume":"41601000","Adj_Close":"81.262339"},{"Symbol":"AAPL","Date":"2014-05-13","Open":"591.999985","High":"594.540016","Low":"590.699982","Close":"593.760025","Volume":"39934300","Adj_Close":"81.247292"},{"Symbol":"AAPL","Date":"2014-05-12","Open":"587.489975","High":"593.659996","Low":"587.399986","Close":"592.830017","Volume":"53302200","Adj_Close":"81.120034"},{"Symbol":"AAPL","Date":"2014-05-09","Open":"584.540001","High":"586.25","Low":"580.330025","Close":"585.540024","Volume":"72899400","Adj_Close":"80.122506"},{"Symbol":"AAPL","Date":"2014-05-08","Open":"588.249992","High":"594.410027","Low":"586.400017","Close":"587.990013","Volume":"57574300","Adj_Close":"80.457751"},{"Symbol":"AAPL","Date":"2014-05-07","Open":"595.249992","High":"597.289986","Low":"587.72998","Close":"592.329979","Volume":"70716100","Adj_Close":"80.601425"},{"Symbol":"AAPL","Date":"2014-05-06","Open":"601.799995","High":"604.409988","Low":"594.410027","Close":"594.410027","Volume":"93641100","Adj_Close":"80.884468"},{"Symbol":"AAPL","Date":"2014-05-05","Open":"590.140022","High":"600.999977","Low":"589.999992","Close":"600.959976","Volume":"71766800","Adj_Close":"81.775753"},{"Symbol":"AAPL","Date":"2014-05-02","Open":"592.340019","High":"594.199982","Low":"589.709999","Close":"592.580025","Volume":"47878600","Adj_Close":"80.63545"},{"Symbol":"AAPL","Date":"2014-05-01","Open":"591.999985","High":"594.799995","Low":"586.360016","Close":"591.480026","Volume":"61012000","Adj_Close":"80.485767"},{"Symbol":"AAPL","Date":"2014-04-30","Open":"592.639999","High":"599.430008","Low":"589.799988","Close":"590.089981","Volume":"114160200","Adj_Close":"80.296616"},{"Symbol":"AAPL","Date":"2014-04-29","Open":"593.739998","High":"595.979996","Low":"589.509995","Close":"592.329979","Volume":"84344400","Adj_Close":"80.601425"},{"Symbol":"AAPL","Date":"2014-04-28","Open":"572.800026","High":"595.749977","Low":"572.54998","Close":"594.090019","Volume":"167371400","Adj_Close":"80.840922"},{"Symbol":"AAPL","Date":"2014-04-25","Open":"564.529984","High":"571.990021","Low":"563.959984","Close":"571.93998","Volume":"97568800","Adj_Close":"77.826851"},{"Symbol":"AAPL","Date":"2014-04-24","Open":"568.210014","High":"570.000015","Low":"560.730003","Close":"567.770004","Volume":"189977900","Adj_Close":"77.259421"},{"Symbol":"AAPL","Date":"2014-04-23","Open":"529.060013","High":"531.13002","Low":"524.449974","Close":"524.750008","Volume":"98735000","Adj_Close":"71.405466"},{"Symbol":"AAPL","Date":"2014-04-22","Open":"528.309982","High":"531.830009","Low":"526.500008","Close":"531.70002","Volume":"50640800","Adj_Close":"72.35119"},{"Symbol":"AAPL","Date":"2014-04-21","Open":"525.339981","High":"532.139977","Low":"523.959976","Close":"531.170021","Volume":"45637200","Adj_Close":"72.279071"},{"Symbol":"AAPL","Date":"2014-04-17","Open":"519.999992","High":"527.76001","Low":"519.199974","Close":"524.940025","Volume":"71083600","Adj_Close":"71.431323"},{"Symbol":"AAPL","Date":"2014-04-16","Open":"518.049988","High":"521.090004","Low":"514.139992","Close":"519.01001","Volume":"53691400","Adj_Close":"70.624395"},{"Symbol":"AAPL","Date":"2014-04-15","Open":"520.270012","High":"521.639977","Low":"511.329994","Close":"517.959999","Volume":"66622500","Adj_Close":"70.481514"},{"Symbol":"AAPL","Date":"2014-04-14","Open":"521.900009","High":"522.159988","Low":"517.210022","Close":"521.679977","Volume":"51418500","Adj_Close":"70.987711"},{"Symbol":"AAPL","Date":"2014-04-11","Open":"519.000023","High":"522.830017","Low":"517.140007","Close":"519.610023","Volume":"67929400","Adj_Close":"70.706042"},{"Symbol":"AAPL","Date":"2014-04-10","Open":"530.680023","High":"532.240005","Low":"523.169998","Close":"523.480019","Volume":"59913000","Adj_Close":"71.232652"},{"Symbol":"AAPL","Date":"2014-04-09","Open":"522.639999","High":"530.490005","Low":"522.020012","Close":"530.320015","Volume":"51542400","Adj_Close":"72.163406"},{"Symbol":"AAPL","Date":"2014-04-08","Open":"525.190018","High":"526.120026","Low":"518.699989","Close":"523.440018","Volume":"60972100","Adj_Close":"71.227209"},{"Symbol":"AAPL","Date":"2014-04-07","Open":"528.019989","High":"530.900002","Low":"521.890022","Close":"523.469978","Volume":"72462600","Adj_Close":"71.231286"},{"Symbol":"AAPL","Date":"2014-04-04","Open":"539.810005","High":"540.000023","Low":"530.579994","Close":"531.820023","Volume":"68812800","Adj_Close":"72.36752"},{"Symbol":"AAPL","Date":"2014-04-03","Open":"541.390015","High":"542.50","Low":"537.640022","Close":"538.790009","Volume":"40586000","Adj_Close":"73.315962"},{"Symbol":"AAPL","Date":"2014-04-02","Open":"542.379997","High":"543.479996","Low":"540.260002","Close":"542.549988","Volume":"45105200","Adj_Close":"73.827602"},{"Symbol":"AAPL","Date":"2014-04-01","Open":"537.760025","High":"541.870026","Low":"536.769989","Close":"541.649994","Volume":"50190000","Adj_Close":"73.705135"},{"Symbol":"AAPL","Date":"2014-03-31","Open":"539.230019","High":"540.809975","Low":"535.930023","Close":"536.739975","Volume":"42167300","Adj_Close":"73.037003"},{"Symbol":"AAPL","Date":"2014-03-28","Open":"538.319984","High":"538.940025","Low":"534.249985","Close":"536.859978","Volume":"50141000","Adj_Close":"73.053333"},{"Symbol":"AAPL","Date":"2014-03-27","Open":"540.019997","High":"541.499977","Low":"535.120018","Close":"537.459991","Volume":"55507900","Adj_Close":"73.13498"},{"Symbol":"AAPL","Date":"2014-03-26","Open":"546.520012","High":"549.000015","Low":"538.860023","Close":"539.779991","Volume":"74942000","Adj_Close":"73.450674"},{"Symbol":"AAPL","Date":"2014-03-25","Open":"541.499977","High":"545.750008","Low":"539.589973","Close":"544.98999","Volume":"70573300","Adj_Close":"74.159626"},{"Symbol":"AAPL","Date":"2014-03-24","Open":"538.420013","High":"540.500008","Low":"535.05999","Close":"539.190018","Volume":"88925200","Adj_Close":"73.370393"},{"Symbol":"AAPL","Date":"2014-03-21","Open":"531.929985","High":"533.75","Low":"526.330017","Close":"532.86998","Volume":"93511600","Adj_Close":"72.510393"},{"Symbol":"AAPL","Date":"2014-03-20","Open":"529.889992","High":"532.669975","Low":"527.350014","Close":"528.700005","Volume":"52099600","Adj_Close":"71.942963"},{"Symbol":"AAPL","Date":"2014-03-19","Open":"532.259979","High":"536.23999","Low":"528.999985","Close":"531.26001","Volume":"56189000","Adj_Close":"72.291316"},{"Symbol":"AAPL","Date":"2014-03-18","Open":"525.899994","High":"531.969986","Low":"525.200005","Close":"531.399986","Volume":"52411800","Adj_Close":"72.310363"},{"Symbol":"AAPL","Date":"2014-03-17","Open":"527.699982","High":"529.969994","Low":"525.850006","Close":"526.740013","Volume":"49886200","Adj_Close":"71.676256"},{"Symbol":"AAPL","Date":"2014-03-14","Open":"528.789993","High":"530.890015","Low":"523.000008","Close":"524.68998","Volume":"59299800","Adj_Close":"71.397298"},{"Symbol":"AAPL","Date":"2014-03-13","Open":"537.440018","High":"539.659988","Low":"529.159988","Close":"530.650009","Volume":"64435700","Adj_Close":"72.20831"},{"Symbol":"AAPL","Date":"2014-03-12","Open":"534.510017","High":"537.349976","Low":"532.00","Close":"536.609985","Volume":"49831600","Adj_Close":"73.019315"},{"Symbol":"AAPL","Date":"2014-03-11","Open":"535.450012","High":"538.740021","Low":"532.589973","Close":"536.089973","Volume":"69806100","Adj_Close":"72.948554"},{"Symbol":"AAPL","Date":"2014-03-10","Open":"528.360023","High":"533.330017","Low":"528.339996","Close":"530.919975","Volume":"44646000","Adj_Close":"72.245046"},{"Symbol":"AAPL","Date":"2014-03-07","Open":"531.090019","High":"531.980026","Low":"526.050011","Close":"530.440018","Volume":"55182400","Adj_Close":"72.179735"},{"Symbol":"AAPL","Date":"2014-03-06","Open":"532.789978","High":"534.440002","Low":"528.099991","Close":"530.749985","Volume":"46372200","Adj_Close":"72.221914"},{"Symbol":"AAPL","Date":"2014-03-05","Open":"530.919975","High":"534.750023","Low":"529.129974","Close":"532.360008","Volume":"50015700","Adj_Close":"72.440998"},{"Symbol":"AAPL","Date":"2014-03-04","Open":"530.999977","High":"532.640015","Low":"527.769997","Close":"531.239983","Volume":"64785000","Adj_Close":"72.288591"},{"Symbol":"AAPL","Date":"2014-03-03","Open":"523.419991","High":"530.650009","Low":"522.80999","Close":"527.76001","Volume":"59695300","Adj_Close":"71.815053"},{"Symbol":"AAPL","Date":"2014-02-28","Open":"529.079987","High":"532.749977","Low":"522.119987","Close":"526.239975","Volume":"92992200","Adj_Close":"71.608214"},{"Symbol":"AAPL","Date":"2014-02-27","Open":"517.140007","High":"528.780006","Low":"516.049995","Close":"527.670021","Volume":"75470500","Adj_Close":"71.802807"},{"Symbol":"AAPL","Date":"2014-02-26","Open":"523.610008","High":"525.00","Low":"515.599998","Close":"517.349998","Volume":"69054300","Adj_Close":"70.398508"},{"Symbol":"AAPL","Date":"2014-02-25","Open":"529.38002","High":"529.569984","Low":"521.000015","Close":"522.060013","Volume":"57988000","Adj_Close":"71.039424"},{"Symbol":"AAPL","Date":"2014-02-24","Open":"523.150024","High":"529.920006","Low":"522.420021","Close":"527.550018","Volume":"72227400","Adj_Close":"71.786478"},{"Symbol":"AAPL","Date":"2014-02-21","Open":"532.789978","High":"534.569992","Low":"524.599991","Close":"525.249992","Volume":"69696200","Adj_Close":"71.473502"},{"Symbol":"AAPL","Date":"2014-02-20","Open":"532.989983","High":"537.000008","Low":"528.999985","Close":"531.149994","Volume":"76464500","Adj_Close":"72.276345"},{"Symbol":"AAPL","Date":"2014-02-19","Open":"544.749985","High":"546.890007","Low":"534.350014","Close":"537.370003","Volume":"78442000","Adj_Close":"73.122734"},{"Symbol":"AAPL","Date":"2014-02-18","Open":"546.00","High":"551.190025","Low":"545.609978","Close":"545.990013","Volume":"65062900","Adj_Close":"74.295704"},{"Symbol":"AAPL","Date":"2014-02-14","Open":"542.469986","High":"545.980026","Low":"541.209984","Close":"543.990021","Volume":"68231100","Adj_Close":"74.023555"},{"Symbol":"AAPL","Date":"2014-02-13","Open":"534.659981","High":"544.850014","Low":"534.199997","Close":"544.429977","Volume":"76849500","Adj_Close":"74.083422"},{"Symbol":"AAPL","Date":"2014-02-12","Open":"536.95002","High":"539.560013","Low":"533.239975","Close":"535.919983","Volume":"77025200","Adj_Close":"72.925423"},{"Symbol":"AAPL","Date":"2014-02-11","Open":"530.610008","High":"537.749985","Low":"529.500023","Close":"535.959984","Volume":"70564200","Adj_Close":"72.930866"},{"Symbol":"AAPL","Date":"2014-02-10","Open":"518.659988","High":"531.990013","Low":"518.00","Close":"528.989998","Volume":"86389800","Adj_Close":"71.982424"},{"Symbol":"AAPL","Date":"2014-02-07","Open":"521.379997","High":"522.929993","Low":"517.380013","Close":"519.679985","Volume":"92570100","Adj_Close":"70.715562"},{"Symbol":"AAPL","Date":"2014-02-06","Open":"510.060005","High":"513.499977","Low":"507.81002","Close":"512.509995","Volume":"64441300","Adj_Close":"69.739904"},{"Symbol":"AAPL","Date":"2014-02-05","Open":"506.560005","High":"515.279991","Low":"506.249985","Close":"512.589996","Volume":"82086200","Adj_Close":"69.335766"},{"Symbol":"AAPL","Date":"2014-02-04","Open":"505.849976","High":"509.459991","Low":"502.760025","Close":"508.790016","Volume":"94170300","Adj_Close":"68.821759"},{"Symbol":"AAPL","Date":"2014-02-03","Open":"502.610008","High":"507.730019","Low":"499.300026","Close":"501.529984","Volume":"100366000","Adj_Close":"67.839727"},{"Symbol":"AAPL","Date":"2014-01-31","Open":"495.179985","High":"501.529984","Low":"493.549988","Close":"500.599976","Volume":"116199300","Adj_Close":"67.713929"},{"Symbol":"AAPL","Date":"2014-01-30","Open":"502.539993","High":"506.499977","Low":"496.70002","Close":"499.779984","Volume":"169625400","Adj_Close":"67.603012"},{"Symbol":"AAPL","Date":"2014-01-29","Open":"503.950012","High":"507.37001","Low":"498.62001","Close":"500.749992","Volume":"125702500","Adj_Close":"67.734221"},{"Symbol":"AAPL","Date":"2014-01-28","Open":"508.760002","High":"514.999985","Low":"502.070023","Close":"506.499977","Volume":"266380800","Adj_Close":"68.511996"},{"Symbol":"AAPL","Date":"2014-01-27","Open":"550.07","High":"554.799988","Low":"545.750008","Close":"550.500023","Volume":"138719700","Adj_Close":"74.463686"},{"Symbol":"AAPL","Date":"2014-01-24","Open":"554.000023","High":"555.61998","Low":"544.749985","Close":"546.070015","Volume":"107338700","Adj_Close":"73.864459"},{"Symbol":"AAPL","Date":"2014-01-23","Open":"549.94001","High":"556.50","Low":"544.810013","Close":"556.179993","Volume":"100809800","Adj_Close":"75.23199"},{"Symbol":"AAPL","Date":"2014-01-22","Open":"550.910019","High":"557.289978","Low":"547.809975","Close":"551.509979","Volume":"94996300","Adj_Close":"74.600299"},{"Symbol":"AAPL","Date":"2014-01-21","Open":"540.990005","High":"550.07","Low":"540.420006","Close":"549.069977","Volume":"82131700","Adj_Close":"74.27025"},{"Symbol":"AAPL","Date":"2014-01-17","Open":"551.480019","High":"552.069992","Low":"539.899994","Close":"540.669998","Volume":"106684900","Adj_Close":"73.134023"},{"Symbol":"AAPL","Date":"2014-01-16","Open":"554.900017","High":"556.850021","Low":"551.680023","Close":"554.250015","Volume":"57319500","Adj_Close":"74.970931"},{"Symbol":"AAPL","Date":"2014-01-15","Open":"553.520012","High":"560.200005","Low":"551.659996","Close":"557.359993","Volume":"97909700","Adj_Close":"75.391604"},{"Symbol":"AAPL","Date":"2014-01-14","Open":"538.220009","High":"546.730003","Low":"537.659996","Close":"546.390022","Volume":"83140400","Adj_Close":"73.907745"},{"Symbol":"AAPL","Date":"2014-01-13","Open":"529.910019","High":"542.50","Low":"529.880005","Close":"535.730019","Volume":"94623200","Adj_Close":"72.465814"},{"Symbol":"AAPL","Date":"2014-01-10","Open":"539.829979","High":"540.799988","Low":"531.109993","Close":"532.939995","Volume":"76244000","Adj_Close":"72.088419"},{"Symbol":"AAPL","Date":"2014-01-09","Open":"546.800018","High":"546.859993","Low":"535.349983","Close":"536.519997","Volume":"69787200","Adj_Close":"72.57267"},{"Symbol":"AAPL","Date":"2014-01-08","Open":"538.809982","High":"545.55999","Low":"538.68998","Close":"543.460022","Volume":"64632400","Adj_Close":"73.511417"},{"Symbol":"AAPL","Date":"2014-01-07","Open":"544.320015","High":"545.959999","Low":"537.919975","Close":"540.040024","Volume":"79302300","Adj_Close":"73.048809"},{"Symbol":"AAPL","Date":"2014-01-06","Open":"537.450005","High":"546.800018","Low":"533.599983","Close":"543.929993","Volume":"103152700","Adj_Close":"73.574988"},{"Symbol":"AAPL","Date":"2014-01-03","Open":"552.860023","High":"553.699989","Low":"540.429993","Close":"540.980019","Volume":"98116900","Adj_Close":"73.175958"},{"Symbol":"AAPL","Date":"2014-01-02","Open":"555.680008","High":"557.029999","Low":"552.020004","Close":"553.12999","Volume":"58671200","Adj_Close":"74.81943"}]}}} \ No newline at end of file diff --git a/Notes.txt b/Notes.txt new file mode 100644 index 0000000..850d127 --- /dev/null +++ b/Notes.txt @@ -0,0 +1,59 @@ +_stocks: +{ + AAPL: { + 2015-01-02: { + Close: + }, + 2015-01-05: { + Close: + } + ... + }, + + AREX: { + + } + ... +} + + +_dates: +{ + 2015-01-02: [AAPL, AREX, ...], + 2015-01-05: [], + ... +} + +_dateCollection: +["2015-01-02", "2015-01-05", ...] + +_stockDates: +{ + AAPL: { + 0: "2015-01-02", + 1: "2015-01-05", + ... + }, + AREX:{} + ... +} + +portfolio: +{ + AAPL: { + quantity: 1400, + moneySpent:, + moneyEarned: + + } +} + +transactions: +[{ + date: , + symbol: , + type: , + quantity: , + price: + +}] \ No newline at end of file diff --git a/README.md b/README.md index 39b83bf..c9b4e64 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# assignment_fideligard_spa -Buy low, sell high. +Deployed version [here](http://fideligard.surge.sh/) -[An AngularJS JavaScript single-page web application using services, directives, ui-router, and good modular code to create a stock portfolio simulator using Yahoo's finance trading data](http://www.vikingcodeschool.com) +Fideligard allows clients to test the historical performance of stock portfolios. Buy and sell stocks based on past performance and Fidelagard will keep track of your transactions and portfolio at any given date. Fideligard is an Angular JS Javascript single-page web application using services, direcrives, ui-router and multi-view states. Historical data comes from Yahoo Finance. + +Fideligard also includes a stock-trading game. Start on day 1 and make trades one day at a time. The goal is to have the best-performing portfolio at the end of the simulation. + +![Trading view](screenshots/trade_screen.png "Trading view. Choose from stocks on ticker on the left and change the date using the slider.") \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..9f8538f --- /dev/null +++ b/index.html @@ -0,0 +1,91 @@ + + + + Fideligard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..c6c5ddb --- /dev/null +++ b/js/app.js @@ -0,0 +1,77 @@ +"use strict"; +var app = angular.module('stocks', ['ui.router']); + +//lodash +app.factory('_', ['$window', function($window){ + return $window._; +}]); + +app.run(function($rootScope){ + $rootScope.$on("$stateChangeError", console.log.bind(console)); +}); + +//routes +app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider){ + + $urlRouterProvider.otherwise('/fideligard'); + + $stateProvider + .state('main', { + url: '/fideligard', + views: { + 'stocksTicker':{ + templateUrl: 'js/templates/stocksTicker.html', + controller: "StocksCtrl" + }, + 'dateSlider':{ + templateUrl: 'js/templates/introOptions.html', + controller: 'IntroCtrl' + }, + 'mainContent':{ + templateUrl: 'js/templates/portfolio.html', + controller: 'PortfolioCtrl' + } + }, + resolve: { + date: function(dateService) { + return dateService.getDate(); + }, + stocks: function(StocksService){ + return StocksService.all(); + }, + dates: ['stocks', 'StocksService', function(stocks, StocksService){ + return StocksService.getDateCollection(); + }] + } + }) + .state('main.portfolio', { + url: '/portfolio', + views:{ + 'dateSlider@': { + templateUrl: 'js/templates/dateSlider.html', + controller: "DateCtrl" + } + } + }) + .state('main.portfolio.trade', { + url: '/trade', + params: {symbol: ''}, + views: { + 'mainContent@':{ + templateUrl: 'js/templates/trade.html', + controller: 'TradeCtrl' + } + } + + }) + .state('main.portfolio.transactions', { + url: '/transactions', + views: { + 'mainContent@': { + templateUrl: 'js/templates/transactions.html', + controller: 'TransactionsCtrl' + } + } + }); + +}]); diff --git a/js/controllers/dateCtrl.js b/js/controllers/dateCtrl.js new file mode 100644 index 0000000..d96ae6b --- /dev/null +++ b/js/controllers/dateCtrl.js @@ -0,0 +1,36 @@ +"use strict"; +app.controller('DateCtrl', ["$scope", 'date', 'dateService', 'dates', 'mainService', function($scope, date, dateService, dates, mainService) { + + $scope.state = mainService.getState(); + $scope.selectedDate = date; + + $scope.editing = false; + + $scope.newDate = date.index; + $scope.dates = dates; + + $scope.setDate = function(day) { + dateService.setDay(day); + }; + + $scope.changeDate = function(date){ + var stringDate = date.toISOString().substring(0,10); + var dayOfYear = $scope.dates.indexOf(stringDate); + if(dayOfYear >= 0){ + dateService.setDay(dayOfYear); + $scope.newDate = dayOfYear; + } + $scope.editing = !$scope.editing; + }; + + $scope.nextDay = function(){ + dateService.nextDay(); + }; + + $scope.currentDate = function(){ + return dates[$scope.selectedDate.index]; + }; + + //make it more obvious that you can click on the date to change it + +}]); diff --git a/js/controllers/gameDateCtrl.js b/js/controllers/gameDateCtrl.js new file mode 100644 index 0000000..95437bb --- /dev/null +++ b/js/controllers/gameDateCtrl.js @@ -0,0 +1,32 @@ +"use strict"; +app.controller('GameDateCtrl', ["$scope", 'date', 'dateService', 'dates', function($scope, date, dateService, dates) { + + $scope.editing = false; + $scope.selectedDate = date; + $scope.newDate = date.index; + $scope.dates = dates; + + $scope.setDate = function(day) { + dateService.setDay(day); + }; + + $scope.changeDate = function(date){ + var stringDate = date.toISOString().substring(0,10); + var dayOfYear = $scope.dates.indexOf(stringDate); + if(dayOfYear >= 0){ + dateService.setDay(dayOfYear); + $scope.newDate = dayOfYear; + } + $scope.editing = !$scope.editing; + }; + + $scope.nextDay = function(){ + dateService.nextDay(); + }; + + $scope.currentDate = function(){ + return dates[$scope.selectedDate.index]; + }; + //make it more obvious that you can click on the date to change it + +}]); diff --git a/js/controllers/introCtrl.js b/js/controllers/introCtrl.js new file mode 100644 index 0000000..41ee54f --- /dev/null +++ b/js/controllers/introCtrl.js @@ -0,0 +1,6 @@ +"use strict"; +app.controller("IntroCtrl", ['$scope', 'mainService', function($scope, mainService){ + $scope.changeState = function(state){ + mainService.setState(state); + }; +}]); \ No newline at end of file diff --git a/js/controllers/portfolioCtrl.js b/js/controllers/portfolioCtrl.js new file mode 100644 index 0000000..0633cb8 --- /dev/null +++ b/js/controllers/portfolioCtrl.js @@ -0,0 +1,15 @@ +"use strict"; +app.controller('PortfolioCtrl', ['$scope', 'accountService', 'date', 'dates', 'dateService', function($scope, accountService, date, dates, dateService){ + $scope.account = accountService.getBalance(); + console.log($scope.account); + $scope.transactions = accountService.getTransactions(); + //set a watch on the date and build portfolio whenever it changes + //will need to pass in the new date.index + $scope.currentDate = dateService.getDate(); + accountService.buildPortfolio($scope.currentDate, dates); + $scope.portfolio = accountService.getPortfolio(); + $scope.statistics = accountService.getPortfolioStats(); + $scope.$watch('currentDate.index', function(){ + accountService.buildPortfolio($scope.currentDate, dates); + }); +}]); \ No newline at end of file diff --git a/js/controllers/stocksCtrl.js b/js/controllers/stocksCtrl.js new file mode 100644 index 0000000..05e0651 --- /dev/null +++ b/js/controllers/stocksCtrl.js @@ -0,0 +1,16 @@ +"use strict"; + +app.controller('StocksCtrl', ["$scope", 'date', 'stocks', 'dates', function($scope, date, stocks, dates){ + + $scope.selectedDate = date; + $scope.stocks = stocks; + $scope.dates = dates; + + $scope.sortBy = "symbol"; + $scope.sortTable = function(property){ + if(property == "symbol"){ + return "-symbol"; + } + }; + +}]); diff --git a/js/controllers/tradeCtrl.js b/js/controllers/tradeCtrl.js new file mode 100644 index 0000000..f7dd0a8 --- /dev/null +++ b/js/controllers/tradeCtrl.js @@ -0,0 +1,6 @@ +"use strict"; +app.controller('TradeCtrl', ['$scope', 'dates', '$stateParams', function($scope, dates, $stateParams){ + + $scope.symbol = $stateParams.symbol || "AAPL"; + $scope.dates = dates; +}]); \ No newline at end of file diff --git a/js/controllers/transactionsCtrl.js b/js/controllers/transactionsCtrl.js new file mode 100644 index 0000000..7d82706 --- /dev/null +++ b/js/controllers/transactionsCtrl.js @@ -0,0 +1,9 @@ +"use strict"; +app.controller('TransactionsCtrl', ['$scope', 'accountService', function($scope, accountService){ + + $scope.transactions = accountService.getTransactions(); + + $scope.sortType = 'date'; + $scope.sortReverse = false; + +}]); \ No newline at end of file diff --git a/js/directives/portfolioRow.js b/js/directives/portfolioRow.js new file mode 100644 index 0000000..0faff96 --- /dev/null +++ b/js/directives/portfolioRow.js @@ -0,0 +1,21 @@ +"use strict"; +app.directive('portfolioRow', ['StocksService', 'accountService', function(StocksService, accountService){ + return{ + restrict: "A", + templateUrl: "js/templates/portfolioRow.html", + scope: { + stock: "=", + symbol: "=" + }, + link: function(scope){ + scope.currentPrice = StocksService.currentPrice(scope.symbol); + scope.currentValue = scope.stock.quantity * scope.currentPrice; + scope.costBasis = scope.stock.moneySpent - scope.stock.moneyEarned; + scope.profitLoss = scope.currentValue - scope.costBasis; + scope.thirtyDay = StocksService.priceChange(scope.symbol, 30); + scope.sevenDay = StocksService.priceChange(scope.symbol, 7); + scope.oneDay = StocksService.priceChange(scope.symbol, 1); + } + }; + +}]); \ No newline at end of file diff --git a/js/directives/stockTicker.js b/js/directives/stockTicker.js new file mode 100644 index 0000000..a40c5ad --- /dev/null +++ b/js/directives/stockTicker.js @@ -0,0 +1,23 @@ +"use strict"; +app.directive('stockTicker', ['StocksService', 'dateService', function(StocksService, dateService) { + return{ + restrict: "A", + templateUrl: 'js/templates/stockTicker.html', + scope: { + symbol: "=" + }, + link: function(scope) { + scope.currentDate = dateService.getDate(); + scope.getData = function(){ + scope.currentPrice = StocksService.currentPrice(scope.symbol); + scope.thirtyDay = StocksService.priceChange(scope.symbol, 30); + scope.sevenDay = StocksService.priceChange(scope.symbol, 7); + scope.oneDay = StocksService.priceChange(scope.symbol, 1); + }; + scope.$watch('currentDate.index', function(){ + scope.getData(); + }); + scope.getData(); + } + }; +}]); diff --git a/js/directives/tradeForm.js b/js/directives/tradeForm.js new file mode 100644 index 0000000..a64ee2c --- /dev/null +++ b/js/directives/tradeForm.js @@ -0,0 +1,69 @@ +"use strict"; +app.directive('tradeForm', ['StocksService', 'dateService', 'accountService', function(StocksService, dateService, accountService){ + + return{ + restrict: "E", + templateUrl: "js/templates/tradeForm.html", + scope: { + symbol: "=", + dates: "=" + }, + link: function(scope){ + scope.updateForm = function(){ + scope.formData.date = scope.dates[dateService.getDate().index]; + scope.formData.price = StocksService.currentPrice(scope.symbol); + }; + + scope.currentDate = dateService.getDate(); + scope.$watch('currentDate.index', function(){ + scope.updateForm(); + //rebuild portfolio whenever date changes + accountService.buildPortfolio(scope.currentDate, StocksService.getDateCollection()); + }); + + scope.account = accountService.getBalance(); + scope.orderStatus = ""; + + scope.formData = {}; + scope.updateForm(); + scope.formData.action = "buy"; + scope.formData.symbol = scope.symbol; + scope.formData.quantity = 100; + + scope.resetAlerts = function(){ + scope.invalid = false; + scope.insufficientFunds = false; + scope.success= false; + }; + + scope.placeTrade = function(){ + scope.resetAlerts(); + if(scope.formData.action === "buy"){ + //check buy + if(accountService.checkValidBuy(scope.formData)){ + accountService.makeBuy(scope.formData); + scope.orderStatus = "Order Placed!"; + scope.success = true; + } + else{ + scope.orderStatus = "Not enough money!"; + scope.insufficientFunds = true; + } + } + else if(scope.formData.action === "sell"){ + //check sell + if(accountService.checkValidSell(scope.formData)){ + accountService.makeSell(scope.formData); + scope.orderStatus = "Sell confirmed!"; + scope.success = true; + } + else{ + scope.orderStatus = "Invalid"; + scope.invalid = true; + } + } + }; + + } + }; +}]); \ No newline at end of file diff --git a/js/filters/filters.js b/js/filters/filters.js new file mode 100644 index 0000000..7561bcf --- /dev/null +++ b/js/filters/filters.js @@ -0,0 +1,24 @@ +"use strict"; +app.filter('myCurrency', function(){ + return function(amount){ + var output = "$" + Math.abs(amount).toFixed(2); + if(amount < 0){ + output = "-" + output; + } + else if(amount > 0){ + output = "+" + output; + } + + return output; + }; +}); + +app.filter('objToArray', function(){ + return function(stocks){ + var result = []; + for (var symbol in stocks){ + result.push(symbol); + } + return result; + }; +}); \ No newline at end of file diff --git a/js/services/accountService.js b/js/services/accountService.js new file mode 100644 index 0000000..33937e1 --- /dev/null +++ b/js/services/accountService.js @@ -0,0 +1,160 @@ +"use strict"; +app.factory('accountService', ['StocksService', function(StocksService){ + var stub = {}; + + var _account = { cash: 100000 }; + + var _transactions = []; + + var _portfolio = {}; + + stub.reset = function(){ + angular.copy([], _transactions); + angular.copy({}, _portfolio); + angular.copy({cash:100000}, _account); + }; + + stub.makeTransaction = function(amount){ + _account.cash -= amount; + }; + + stub.getBalance = function(){ + return _account; + }; + + stub.getTransactions = function(){ + return _transactions; + }; + + stub.checkValidBuy = function(formData){ + return formData.price * formData.quantity <= _account.cash; + }; + + stub.checkValidSell = function(formData){ + //check if stock is owned and enough shares + return _portfolio[formData.symbol] && formData.quantity <= _portfolio[formData.symbol].quantity; + }; + + stub.makeSell = function(formData){ + //add to balance + stub.makeTransaction(-formData.quantity*formData.price); + //add to transactions + var newTransaction = { + date: formData.date, + symbol: formData.symbol, + quantity: formData.quantity, + type: "SELL", + price: formData.price + }; + _transactions.push(newTransaction); + //console.log("Transactions: ", _transactions); + //adjust porfolio + // _portfolio[formData.symbol].quantity -= formData.quantity; + // _portfolio[formData.symbol].moneyEarned += formData.quantity * formData.price; + //console.log("Portfolio: ", _portfolio); + }; + + stub.makeBuy = function(formData){ + //substract from balance + stub.makeTransaction(formData.quantity*formData.price); + //add to transactions + var newTransaction = { + date: formData.date, + symbol: formData.symbol, + quantity: formData.quantity, + type: "BUY", + price: formData.price + }; + _transactions.push(newTransaction); + //console.log("Transactions: ", _transactions); + //add to portfolio + // if(_portfolio[formData.symbol]){ + // _portfolio[formData.symbol].quantity += formData.quantity; + // _portfolio[formData.symbol].moneySpent += (formData.quantity*formData.price); + // } + // else{ + // _portfolio[formData.symbol] = { + // quantity: formData.quantity, + // moneySpent: formData.quantity*formData.price, + // moneyEarned: 0 + // }; + // } + //console.log("Portfolio: ", _portfolio); + }; + + stub.buildPortfolio = function(date, dateCollection){ + //clear portolio + angular.copy({}, _portfolio); + //filter transactions for those before the date + var currentDate = dateCollection[date.index]; + var filteredTransactions = _transactions.filter(function(t){ + return t.date <= currentDate; + }); + filteredTransactions.sort(function(a,b){ + if(a.date < b.date){ + return -1; + } + else if(a.date > b.date){ + return 1; + } + else{ + return 0; + } + }); + //build a portfolio from scratch using these transacations + filteredTransactions.forEach(function(t){ + if(t.type == "BUY"){ + if(_portfolio[t.symbol]){ + _portfolio[t.symbol].quantity += t.quantity; + _portfolio[t.symbol].moneySpent += t.quantity * t.price; + } + else{ + _portfolio[t.symbol] = { + quantity: t.quantity, + moneySpent: t.quantity * t.price, + moneyEarned: 0 + }; + } + } + else{ + _portfolio[t.symbol].quantity -= t.quantity; + _portfolio[t.symbol].moneyEarned += t.quantity * t.price; + } + }); + }; + + stub.getPortfolioStats = function(){ + var _stats = { + costBasis: 0, + currentValue: 0, + profitLoss: 0, + oneDay: 0, + sevenDay: 0, + thirtyDay: 0 + }; + //for each portfolio entry, calculate costBasis, currentValue, profitLoss, 1d,7d,30d and add the stats + for (var p in _portfolio){ + var cp = StocksService.currentPrice(p); + var cv = _portfolio[p].quantity * cp; + _stats.currentValue += cv; + var cb = _portfolio[p].moneySpent - _portfolio[p].moneyEarned; + _stats.costBasis += cb; + var pl = cv - cb; + _stats.profitLoss += pl; + var td = StocksService.priceChange(p, 30); + _stats.thirtyDay += td; + var sd = StocksService.priceChange(p, 7); + _stats.sevenDay += sd; + var od = StocksService.priceChange(p, 1); + _stats.oneDay += od; + } + + return _stats; + }; + + stub.getPortfolio = function(){ + return _portfolio; + }; + + return stub; +}]); \ No newline at end of file diff --git a/js/services/dateService.js b/js/services/dateService.js new file mode 100644 index 0000000..4ce496a --- /dev/null +++ b/js/services/dateService.js @@ -0,0 +1,21 @@ +"use strict"; +app.factory('dateService', function(){ + var stub = {}; + + var _date = {index: 30}; + + + stub.setDay = function(day) { + _date.index = day; + }; + + stub.nextDay = function(){ + _date.index ++; + }; + + stub.getDate = function(){ + return _date; + }; + + return stub; +}); diff --git a/js/services/mainService.js b/js/services/mainService.js new file mode 100644 index 0000000..f16b421 --- /dev/null +++ b/js/services/mainService.js @@ -0,0 +1,17 @@ +"use strict"; +app.factory('mainService', ['accountService', function(accountService){ + var stub = {}; + var _gameState; + + stub.setState = function(state){ + _gameState = state; + accountService.reset(); + }; + + stub.getState = function(){ + return _gameState; + }; + + return stub; + +}]); \ No newline at end of file diff --git a/js/services/stocksService.js b/js/services/stocksService.js new file mode 100644 index 0000000..f07e283 --- /dev/null +++ b/js/services/stocksService.js @@ -0,0 +1,150 @@ +"use strict"; +app.factory('StocksService', ['$http', 'dateService', '_', '$q', function($http, dateService, _, $q){ + + var stub = {}; + var _stocks = {}; + var _dates = {}; + var _dateCollection = []; + var _stockDates = {}; + + var _stockSymbols = ['AAPL', 'GOOG', 'PHM', 'ICON', 'PCLN', 'PM', 'MO', 'GPOR', 'AREX', 'ATW', 'CMO', 'LTC', 'RNR', 'GILD']; + + var _populateAllStocks = function(){ + var requests = []; + _stockSymbols.forEach(function(el){ + requests.push(_populateStock(el)); + }); + return $q.all(requests).then(function(response){ + response.forEach(function(stock){ + _buildCollections(stock); + }); + _buildDateCollection(); + return _stocks; + }, function(error){ + console.log(error); + }); + }; + + var _buildStockString = function(symbol){ + var thing = 'http://query.yahooapis.com/v1/public/yql?q= ' + + 'select * from yahoo.finance.historicaldata ' + + 'where symbol = ' + '"' + symbol + '"' + ' ' + + 'and startDate = "2015-01-01" ' + + 'and endDate = "2015-12-31" ' + +'&format=json ' + + '&diagnostics=true ' + + '&env=store://datatables.org/alltableswithkeys ' + + '&callback='; + return thing; + }; + + var _populateStock = function(symbol){ + return $http({ + url: _buildStockString(symbol), + method: "GET" + }); + }; + + var _buildCollections = function(response){ + response.data.query.results.quote.forEach(function(stock) { + _buildStockObject(stock); + _buildDatesArr(stock); + _buildStockDates(stock); + }); + }; + + var _buildDateCollection = function(){ + var sortedDates = Object.keys(_dates).sort(function(a,b) { + var aDate = new Date(a); + var bDate = new Date(b); + if (aDate > bDate) { + return 1; + } else if (aDate < bDate) { + return -1; + } else { + return 0; + } + }); + angular.copy(sortedDates, _dateCollection); + }; + + var _buildStockObject = function(stock) { + if (_stocks[stock.Symbol]) { + _stocks[stock.Symbol][stock.Date] = stock; + } else { + _stocks[stock.Symbol] = {}; + _stocks[stock.Symbol][stock.Date] = stock; + } + }; + + var _buildDatesArr = function(stock) { + if (_dates[stock.Date]) { + _dates[stock.Date].push(stock.Symbol); + } else { + _dates[stock.Date] = [stock.Symbol]; + } + }; + + var _buildStockDates = function(stock) { + if (_stockDates[stock.Symbol]) { + _stockDates[stock.Symbol].unshift(stock.Date); + } else { + _stockDates[stock.Symbol] = [stock.Date]; + } + } + + stub.getDateCollection = function() { + return _dateCollection; + }; + + // stub.sevenDayAverage = function(symbol) { + // var today; + // for (var i = 0; i < _stockDates[symbol].length; i++) { + // if (_stockDates[symbol][i] === _dateCollection[dateService.getDate().index]) { + // today = i; + // break; + // } + // } + // var avgPrice = 0; + // for (var j = today - 6; j <= today; j++ ) { + // avgPrice += Number(_stocks[symbol][_stockDates[symbol][j]].Close); + // } + // return Math.round(avgPrice / 7 * 100) / 100; + // }; + + // stub.thirtyDayAverage = function(symbol) { + // var today; + // for (var i = 0; i < _stockDates[symbol].length; i++) { + // if (_stockDates[symbol][i] === _dateCollection[dateService.getDate().index]) { + // today = i; + // break; + // } + // } + // var avgPrice = 0; + // for (var j = today - 29; j <= today; j++ ) { + // avgPrice += Number(_stocks[symbol][_stockDates[symbol][j]].Close); + // } + // return Math.round(avgPrice / 30 * 100) / 100; + // }; + + stub.priceChange = function(symbol, days){ + var date = _dateCollection[dateService.getDate().index - days]; + var thenPrice = Math.round(_stocks[symbol][date].Close * 100) / 100; + return Math.round((stub.currentPrice(symbol) - thenPrice) * 100) / 100; + }; + + stub.currentPrice = function(symbol) { + return Math.round(_stocks[symbol][_dateCollection[dateService.getDate().index]].Close * 100) / 100; + }; + + stub.all = function(){ + if(!_.isEmpty(_stocks)){ + return _stocks; + } + else{ + return _populateAllStocks(); + } + }; + + return stub; +}]); diff --git a/js/templates/dateSlider.html b/js/templates/dateSlider.html new file mode 100644 index 0000000..283f4b2 --- /dev/null +++ b/js/templates/dateSlider.html @@ -0,0 +1,17 @@ +
+

Chosen Date: {{ dates[selectedDate.index] | date}}

+ + + + 02/17/2015 + 12/31/2015 + + +
+ +
+

Chosen Date: {{ dates[selectedDate.index] | date}}

+ + + +
\ No newline at end of file diff --git a/js/templates/gameDateSlider.html b/js/templates/gameDateSlider.html new file mode 100644 index 0000000..c163ef8 --- /dev/null +++ b/js/templates/gameDateSlider.html @@ -0,0 +1,6 @@ +
+

Chosen Date: {{ dates[selectedDate.index] | date}}

+ + + +
diff --git a/js/templates/introOptions.html b/js/templates/introOptions.html new file mode 100644 index 0000000..7a1d590 --- /dev/null +++ b/js/templates/introOptions.html @@ -0,0 +1,2 @@ + + diff --git a/js/templates/mainContent.html b/js/templates/mainContent.html new file mode 100644 index 0000000..be33d1c --- /dev/null +++ b/js/templates/mainContent.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/templates/portfolio.html b/js/templates/portfolio.html new file mode 100644 index 0000000..6abbccc --- /dev/null +++ b/js/templates/portfolio.html @@ -0,0 +1,62 @@ +
+

Portfolio

+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + +
Cost BasisCurrent ValueProfit/Loss1d7d30d
{{statistics.costBasis | currency}}{{statistics.currentValue | currency}}{{statistics.profitLoss | currency}}{{statistics.oneDay | myCurrency}}{{statistics.sevenDay | myCurrency}}{{statistics.thirtyDay | myCurrency}}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolQuantityCost BasisCurrent ValueProfit/LossCurrent Price1d7d30dTrade?
CASH{{ account.cash | currency }}{{ account.cash | currency }}{{ account.cash | currency }}{{ 0 | currency }}{{ 0 | currency }}{{ 0 | currency }}{{ 0 | currency }}{{ 0 | currency }}
\ No newline at end of file diff --git a/js/templates/portfolioRow.html b/js/templates/portfolioRow.html new file mode 100644 index 0000000..37efe14 --- /dev/null +++ b/js/templates/portfolioRow.html @@ -0,0 +1,12 @@ + + {{symbol}} + {{stock.quantity}} + {{costBasis | currency}} + {{currentValue | currency}} + {{profitLoss | currency}} + {{currentPrice | currency}} + {{oneDay | myCurrency}} + {{sevenDay | myCurrency}} + {{thirtyDay | myCurrency}} + trade + \ No newline at end of file diff --git a/js/templates/stockTicker.html b/js/templates/stockTicker.html new file mode 100644 index 0000000..a965449 --- /dev/null +++ b/js/templates/stockTicker.html @@ -0,0 +1,8 @@ + + {{ symbol }} + {{ currentPrice | currency }} + {{ oneDay | myCurrency }} + {{ sevenDay | myCurrency }} + {{ thirtyDay | myCurrency }} + trade + diff --git a/js/templates/stocksTicker.html b/js/templates/stocksTicker.html new file mode 100644 index 0000000..7b2dcf9 --- /dev/null +++ b/js/templates/stocksTicker.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + + +
Stocks
SymbolPrice1d7d30dTrade?
diff --git a/js/templates/trade.html b/js/templates/trade.html new file mode 100644 index 0000000..d336b76 --- /dev/null +++ b/js/templates/trade.html @@ -0,0 +1,17 @@ +
+

Trade

+
+
+
+ + +
+
+ + + diff --git a/js/templates/tradeForm.html b/js/templates/tradeForm.html new file mode 100644 index 0000000..e1a5be6 --- /dev/null +++ b/js/templates/tradeForm.html @@ -0,0 +1,43 @@ +
+
+
+
+ + + + + + + + +
+ +
+
+
+

Cash Available: {{ account.cash | currency }}

+
+
+ + + \ No newline at end of file diff --git a/js/templates/transactions.html b/js/templates/transactions.html new file mode 100644 index 0000000..7a8fb33 --- /dev/null +++ b/js/templates/transactions.html @@ -0,0 +1,42 @@ +
+

Transactions

+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + +
+ Date + + + + Symbol + + + TypeQuantityPrice
{{t.date}}{{t.symbol}}{{t.type}}{{t.quantity}}{{t.price}}
\ No newline at end of file diff --git a/js/vendor/loadingbar.css b/js/vendor/loadingbar.css new file mode 100644 index 0000000..65bdbcd --- /dev/null +++ b/js/vendor/loadingbar.css @@ -0,0 +1,197 @@ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #29d; + color: #29d; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #29d, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/js/vendor/pace.min.js b/js/vendor/pace.min.js new file mode 100644 index 0000000..c47d6e5 --- /dev/null +++ b/js/vendor/pace.min.js @@ -0,0 +1,2 @@ +/*! pace 1.0.0 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cQ;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
\n
\n
\n
',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); \ No newline at end of file diff --git a/screenshots/portfolio_view.png b/screenshots/portfolio_view.png new file mode 100644 index 0000000..c4d42f4 Binary files /dev/null and b/screenshots/portfolio_view.png differ diff --git a/screenshots/trade_screen.png b/screenshots/trade_screen.png new file mode 100644 index 0000000..1af4d27 Binary files /dev/null and b/screenshots/trade_screen.png differ diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..f532283 --- /dev/null +++ b/styles.css @@ -0,0 +1,3 @@ +td{ + white-space: nowrap; +} \ No newline at end of file