// STOCKMARKET // // Converted from BASIC to Javascript by Oscar Toledo G. (nanochess) // function print(str) { document.getElementById("output").appendChild(document.createTextNode(str)); } function input() { var input_element; var input_str; return new Promise(function (resolve) { input_element = document.createElement("INPUT"); print("? "); input_element.setAttribute("type", "text"); input_element.setAttribute("length", "50"); document.getElementById("output").appendChild(input_element); input_element.focus(); input_str = undefined; input_element.addEventListener("keydown", function (event) { if (event.keyCode == 13) { input_str = input_element.value; document.getElementById("output").removeChild(input_element); print(input_str); print("\n"); resolve(input_str); } }); }); } function tab(space) { var str = ""; while (space-- > 0) str += " "; return str; } var sa = []; var pa = []; var za = []; var ca = []; var i1; var n1; var e1; var i2; var n2; var e2; var x1; var w3; var t8; var a; var s4; // New stock values - subroutine function randomize_initial() { // RANDOMLY PRODUCE NEW STOCK VALUES BASED ON PREVIOUS // DAY'S VALUES // N1,N2 ARE RANDOM NUMBERS OF DAYS WHICH RESPECTIVELY // DETERMINE WHEN STOCK I1 WILL INCREASE 10 PTS. AND STOCK // I2 WILL DECREASE 10 PTS. // IF N1 DAYS HAVE PASSED, PICK AN I1, SET E1, DETERMINE NEW N1 if (n1 <= 0) { i1 = Math.floor(4.99 * Math.random() + 1); n1 = Math.floor(4.99 * Math.random() + 1); e1 = 1; } // IF N2 DAYS HAVE PASSED, PICK AN I2, SET E2, DETERMINE NEW N2 if (n2 <= 0) { i2 = Math.floor(4.99 * Math.random() + 1); n2 = Math.floor(4.99 * Math.random() + 1); e2 = 1; } // DEDUCT ONE DAY FROM N1 AND N2 n1--; n2--; // LOOP THROUGH ALL STOCKS for (i = 1; i <= 5; i++) { x1 = Math.random(); if (x1 < 0.25) { x1 = 0.25; } else if (x1 < 0.5) { x1 = 0.5; } else if (x1 < 0.75) { x1 = 0.75; } else { x1 = 0.0; } // BIG CHANGE CONSTANT:W3 (SET TO ZERO INITIALLY) w3 = 0; if (e1 >= 1 && Math.floor(i1 + 0.5) == Math.floor(i + 0.5)) { // ADD 10 PTS. TO THIS STOCK; RESET E1 w3 = 10; e1 = 0; } if (e2 >= 1 && Math.floor(i2 + 0.5) == Math.floor(i + 0.5)) { // SUBTRACT 10 PTS. FROM THIS STOCK; RESET E2 w3 -= 10; e2 = 0; } // C(I) IS CHANGE IN STOCK VALUE ca[i] = Math.floor(a * sa[i]) + x1 + Math.floor(3 - 6 * Math.random() + 0.5) + w3; ca[i] = Math.floor(100 * ca[i] + 0.5) / 100; sa[i] += ca[i]; if (sa[i] <= 0) { ca[i] = 0; sa[i] = 0; } else { sa[i] = Math.floor(100 * sa[i] + 0.5) / 100; } } // AFTER T8 DAYS RANDOMLY CHANGE TREND SIGN AND SLOPE if (--t8 < 1) { // RANDOMLY CHANGE TREND SIGN AND SLOPE (A), AND DURATION // OF TREND (T8) t8 = Math.floor(4.99 * Math.random() + 1); a = Math.floor((Math.random() / 10) * 100 + 0.5) / 100; s4 = Math.random(); if (s4 > 0.5) a = -a; } } // Main program async function main() { print(tab(30) + "STOCK MARKET\n"); print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n"); print("\n"); print("\n"); print("\n"); // STOCK MARKET SIMULATION -STOCK- // REVISED 8/18/70 (D. PESSEL, L. BRAUN, C. LOSIK) // IMP VRBLS: A-MRKT TRND SLP; B5-BRKRGE FEE; C-TTL CSH ASSTS; // C5-TTL CSH ASSTS (TEMP); C(I)-CHNG IN STK VAL; D-TTL ASSTS; // E1,E2-LRG CHNG MISC; I-STCK #; I1,I2-STCKS W LRG CHNG; // N1,N2-LRG CHNG DAY CNTS; P5-TTL DAYS PRCHSS; P(I)-PRTFL CNTNTS; // Q9-NEW CYCL?; S4-SGN OF A; S5-TTL DYS SLS; S(I)-VALUE/SHR; // T-TTL STCK ASSTS; T5-TTL VAL OF TRNSCTNS; // W3-LRG CHNG; X1-SMLL CHNG(<$1); Z4,Z5,Z6-NYSE AVE.; Z(I)-TRNSCT // SLOPE OF MARKET TREND:A (SAME FOR ALL STOCKS) x = 1; a = Math.floor(Math.random() / 10 * 100 + 0.5) / 100; t5 = 0; x9 = 0; n1 = 0; n2 = 0; e1 = 0; e2 = 0; // INTRODUCTION print("DO YOU WANT THE INSTRUCTIONS (YES-TYPE 1, NO-TYPE 0)"); z9 = parseInt(await input()); print("\n"); print("\n"); if (z9 >= 1) { print("THIS PROGRAM PLAYS THE STOCK MARKET. YOU WILL BE GIVEN\n"); print("$10,000 AND MAY BUY OR SELL STOCKS. THE STOCK PRICES WILL\n"); print("BE GENERATED RANDOMLY AND THEREFORE THIS MODEL DOES NOT\n"); print("REPRESENT EXACTLY WHAT HAPPENS ON THE EXCHANGE. A TABLE\n"); print("OF AVAILABLE STOCKS, THEIR PRICES, AND THE NUMBER OF SHARES\n"); print("IN YOUR PORTFOLIO WILL BE PRINTED. FOLLOWING THIS, THE\n"); print("INITIALS OF EACH STOCK WILL BE PRINTED WITH A QUESTION\n"); print("MARK. HERE YOU INDICATE A TRANSACTION. TO BUY A STOCK\n"); print("TYPE +NNN, TO SELL A STOCK TYPE -NNN, WHERE NNN IS THE\n"); print("NUMBER OF SHARES. A BROKERAGE FEE OF 1% WILL BE CHARGED\n"); print("ON ALL TRANSACTIONS. NOTE THAT IF A STOCK'S VALUE DROPS\n"); print("TO ZERO IT MAY REBOUND TO A POSITIVE VALUE AGAIN. YOU\n"); print("HAVE $10,000 TO INVEST. USE INTEGERS FOR ALL YOUR INPUTS.\n"); print("(NOTE: TO GET A 'FEEL' FOR THE MARKET RUN FOR AT LEAST\n"); print("10 DAYS)\n"); print("-----GOOD LUCK!-----\n"); } // GENERATION OF STOCK TABLE: INPUT REQUESTS // INITIAL STOCK VALUES sa[1] = 100; sa[2] = 85; sa[3] = 150; sa[4] = 140; sa[5] = 110; // INITIAL T8 - # DAYS FOR FIRST TREND SLOPE (A) t8 = Math.floor(4.99 * Math.random() + 1); // RANDOMIZE SIGN OF FIRST TREND SLOPE (A) if (Math.random() <= 0.5) a -= a; // RANDOMIZE INITIAL VALUES randomize_initial(); // INITIAL PORTFOLIO CONTENTS for (i = 1; i <= 5; i++) { pa[i] = 0; za[i] = 0; } print("\n"); print("\n"); // INITIALIZE CASH ASSETS:C c = 10000; z5 = 0; // PRINT INITIAL PORTFOLIO print("STOCK\t \t\t\tINITIALS\tPRICE/SHARE\n"); print("INT. BALLISTIC MISSILES\t\t IBM\t\t" + sa[1] + "\n"); print("RED CROSS OF AMERICA\t\t RCA\t\t" + sa[2] + "\n"); print("LICHTENSTEIN, BUMRAP & JOKE\t LBJ\t\t" + sa[3] + "\n"); print("AMERICAN BANKRUPT CO.\t\t ABC\t\t" + sa[4] + "\n"); print("CENSURED BOOKS STORE\t\t CBS\t\t" + sa[5] + "\n"); while (1) { print("\n"); // NYSE AVERAGE:Z5; TEMP. VALUE:Z4; NET CHANGE:Z6 z4 = z5; z5 = 0; t = 0; for (i = 1; i <= 5; i++) { z5 += sa[i]; t += sa[i] * pa[i]; } z5 = Math.floor(100 * (z5 / 5) + 0.5) / 100; z6 = Math.floor((z5 - z4) * 100 + 0.5) / 100; // TOTAL ASSETS:D d = t + c; if (x9 <= 0) { print("NEW YORK STOCK EXCHANGE AVERAGE: " + z5 + "\n"); } else { print("NEW YORK STOCK EXCHANGE AVERAGE: " + z5 + " NET CHANGE " + z6 + "\n"); } print("\n"); t = Math.floor(100 * t + 0.5) / 100; print("TOTAL STOCK ASSETS ARE $" + t + "\n"); c = Math.floor(100 * c + 0.5) / 100; print("TOTAL CASH ASSETS ARE $" + c + "\n"); d = Math.floor(100 * d + 0.5) / 100; print("TOTAL ASSETS ARE $" + d + "\n"); print("\n"); if (x9 != 0) { print("DO YOU WISH TO CONTINUE (YES-TYPE 1, NO-TYPE 0)"); q9 = parseInt(await input()); if (q9 < 1) { print("HOPE YOU HAD FUN!!\n"); return; } } // INPUT TRANSACTIONS while (1) { print("WHAT IS YOUR TRANSACTION IN\n"); print("IBM"); za[1] = parseInt(await input()); print("RCA"); za[2] = parseInt(await input()); print("LBJ"); za[3] = parseInt(await input()); print("ABC"); za[4] = parseInt(await input()); print("CBS"); za[5] = parseInt(await input()); print("\n"); // TOTAL DAY'S PURCHASES IN $:P5 p5 = 0; // TOTAL DAY'S SALES IN $:S5 s5 = 0; for (i = 1; i <= 5; i++) { za[i] = Math.floor(za[i] + 0.5); if (za[i] > 0) { p5 += za[i] * sa[i]; } else { s5 -= za[i] * sa[i]; if (-za[i] > pa[i]) { print("YOU HAVE OVERSOLD A STOCK; TRY AGAIN.\n"); break; } } } if (i <= 5) contine; // TOTAL VALUE OF TRANSACTIONS:T5 t5 = p5 + s5; // BROKERAGE FEE:B5 b5 = Math.floor(0.01 * t5 * 100 + 0.5) / 100; // CASH ASSETS=OLD CASH ASSETS-TOTAL PURCHASES // -BROKERAGE FEES+TOTAL SALES:C5 c5 = c - p5 - b5 + s5; if (c5 < 0) { print("YOU HAVE USED $" + (-c5) + " MORE THAN YOU HAVE.\n"); continue; } break; } c = c5; // CALCULATE NEW PORTFOLIO for (i = 1; i <= 5; i++) { pa[i] += za[i]; } // CALCULATE NEW STOCK VALUES randomize_initial(); // PRINT PORTFOLIO // BELL RINGING-DIFFERENT ON MANY COMPUTERS print("\n"); print("********** END OF DAY'S TRADING **********\n"); print("\n"); print("\n"); if (x9 >= 1) ; print("STOCK\tPRICE/SHARE\tHOLDINGS\tVALUE\tNET PRICE CHANGE\n"); print("IBM\t" + sa[1] + "\t\t" + pa[1] + "\t\t" + sa[1] * pa[1] + "\t" + ca[1] + "\n"); print("RCA\t" + sa[2] + "\t\t" + pa[2] + "\t\t" + sa[2] * pa[2] + "\t" + ca[2] + "\n"); print("LBJ\t" + sa[3] + "\t\t" + pa[3] + "\t\t" + sa[3] * pa[3] + "\t" + ca[3] + "\n"); print("ABC\t" + sa[4] + "\t\t" + pa[4] + "\t\t" + sa[4] * pa[4] + "\t" + ca[4] + "\n"); print("CBS\t" + sa[5] + "\t\t" + pa[5] + "\t\t" + sa[5] * pa[5] + "\t" + ca[5] + "\n"); x9 = 1; print("\n"); print("\n"); } } main();