10  REM ****  HP TIME-SHARED BASIC PROGRAM LIBRARY  ********************
20  REM
30  REM            STOCK:  STOCK MARKET SIMULATION
40  REM
50  REM            36331 (A860)  REV A -- 10/71
60  REM
70  REM ****  CONTRIBUTED PROGRAM  *************************************
80  REM STOCK MARKET SIMULATION     -STOCK-
90  REM REVISED 8/18/70 (D. PESSEL, L. BRAUN, C. LOSIK)  
100  REM IMP VRBLS: A-MRKT TRND SLP; B5-BRKRGE FEE; C-TTL CSH ASSTS;    
110  REM C5-TTL CSH ASSTS (TEMP); C(I)-CHNG IN STK VAL; D-TTL ASSTS;
120  REM E1,E2-LRG CHNG MISC; I-STCK #; I1,I2-STCKS W LRG CHNG; 
130  REM N1,N2-LRG CHNG DAY CNTS; P5-TTL DAYS PRCHSS; P(I)-PRTFL CNTNTS;
140  REM Q9-NEW CYCL?; S4-SGN OF A; S5-TTL DYS SLS; S(I)-VALUE/SHR; 
150  REM T-TTL STCK ASSTS; T5-TTL VAL OF TRNSCTNS;
160  REM W3-LRG CHNG; X1-SMLL CHNG(<$1); Z4,Z5,Z6-NYSE AVE.; Z(I)-TRNSCTN.
170  PRINT TAB(20);"THE STOCK MARKET"
180  DIM S[5],P[5],Z[5],C[5]
190  REM SLOPE OF MARKET TREND:A  (SAME FOR ALL STOCKS) 
200  LET X=0
210  LET A=INT((RND(X)/10)*100+.5)/100
220  LET T5=0
230  LET X9=0
240  LET N1=N2=0
250  LET E1=E2=0
260  LET Z5=0
270  REM INTRODUCTION 
280  PRINT "DO YOU WANT THE INSTRUCTIONS (YES-TYPE 1, NO-TYPE 0)";
290  INPUT Z9
300  PRINT 
310  PRINT 
320  IF Z9<1 THEN 490
330  PRINT "THIS PROGRAM PLAYS THE STOCK MARKET.  YOU WILL BE GIVEN"
340  PRINT "$10,000 AND MAY BUY OR SELL STOCKS.  THE STOCK PRICES WILL"
350  PRINT "BE GENERATED RANDOMLY AND THEREFORE THIS MODEL DOES NOT"
360  PRINT "REPRESENT EXACTLY WHAT HAPPENS ON THE EXCHANGE.  A TABLE"
370  PRINT "OF AVAILABLE STOCKS, THEIR PRICES, AND THE NUMBER OF SHARES"
380  PRINT "IN YOUR PORTFOLIO WILL BE PRINTED.  FOLLOWING THIS, THE"
390  PRINT "INITIALS OF EACH STOCK WILL BE PRINTED WITH A QUESTION"
400  PRINT "MARK.  HERE YOU INDICATE A TRANSACTION.  TO BUY A STOCK"
410  PRINT "TYPE +NNN, TO SELL A STOCK TYPE -NNN, WHERE NNN IS THE"
420  PRINT "NUMBER OF SHARES.  A BROKERAGE FEE OF 1% WILL BE CHARGED"
430  PRINT "ON ALL TRANSACTIONS.  NOTE THAT IF A STOCK'S VALUE DROPS"
440  PRINT "TO ZERO IT MAY REBOUND TO A POSITIVE VALUE AGAIN.  YOU"
450  PRINT "HAVE $10,000 TO INVEST.  USE INTEGERS FOR ALL YOUR INPUTS."
460  PRINT "(NOTE:  TO GET A 'FEEL' FOR THE MARKET RUN FOR AT LEAST"
470  PRINT "10 DAYS)"
480  PRINT "-----GOOD LUCK!-----"
490  REM GENERATION OF STOCK TABLE; INPUT REQUESTS  
500  REM INITIAL STOCK VALUES 
510  LET S[1]=100
520  LET S[2]=85
530  LET S[3]=150
540  LET S[4]=140
550  LET S[5]=110
560  REM INITIAL T8 - # DAYS FOR FIRST TREND SLOPE (A)
570  LET T8=INT(4.99*RND(X)+1)
580  REM RANDOMIZE SIGN OF FIRST TREND SLOPE (A)
590  IF RND(X)>.5 THEN 610
600  LET A=-A
610  REM RANDOMIZE INITIAL VALUES 
620  GOSUB 1720
630  REM INITIAL PORTFOLIO CONTENTS 
640  FOR I=1 TO 5
650  LET P[I]=0
660  LET Z[I]=0
670  NEXT I
680  PRINT 
690  PRINT 
700  REM INITIALIZE CASH ASSETS:C 
710  LET C=10000
720  REM PRINT INITIAL PORTFOLIO
730  PRINT "STOCK"," ","INITIALS","PRICE/SHARE"
740  PRINT "INT. BALLISTIC MISSILES","  IBM",S[1]
750  PRINT "RED CROSS OF AMERICA","  RCA",S[2]
760  PRINT "LICHTENSTEIN, BUMRAP & JOKE","  LBJ",S[3]
770  PRINT "AMERICAN BANKRUPT CO.","  ABC",S[4]
780  PRINT "CENSURED BOOKS STORE","  CBS",S[5]
790  PRINT 
800  REM NYSE AVERAGE:Z5; TEMP. VALUE:Z4; NET CHANGE:Z6 
810  LET Z4=Z5
820  LET Z5=0
830  LET T=0
840  FOR I=1 TO 5
850  LET Z5=Z5+S[I]
860  LET T=T+S[I]*P[I]
870  NEXT I
880  LET Z5=INT(100*(Z5/5)+.5)/100
890  LET Z6=INT((Z5-Z4)*100+.5)/100
900  REM TOTAL ASSETS:D 
910  LET D=T+C
920  IF X9>0 THEN 950
930  PRINT "NEW YORK STOCK EXCHANGE AVERAGE: "Z5
940  GOTO 960
950  PRINT "NEW YORK STOCK EXCHANGE AVERAGE: "Z5"   NET CHANGE: "Z6
960  PRINT 
970  LET T=INT(100*T+.5)/100
980  PRINT "TOTAL STOCK ASSETS ARE   $";T
990  LET C=INT(100*C+.5)/100
1000  PRINT "TOTAL CASH ASSETS ARE    $";C
1010  LET D=INT(100*D+.5)/100
1020  PRINT "TOTAL ASSETS ARE         $";D
1030  PRINT 
1040  IF X9=0 THEN 1080
1050  PRINT "DO YOU WISH TO CONTINUE (YES-TYPE 1, NO-TYPE 0)";
1060  INPUT Q9
1070  IF Q9<1 THEN 2370
1080  REM INPUT TRANSACTIONS
1090  PRINT "WHAT IS YOUR TRANSACTION IN"
1100  PRINT "IBM";
1110  INPUT Z[1]
1120  PRINT "RCA";
1130  INPUT Z[2]
1140  PRINT "LBJ";
1150  INPUT Z[3]
1160  PRINT "ABC";
1170  INPUT Z[4]
1180  PRINT "CBS";
1190  INPUT Z[5]
1200  PRINT 
1210  REM TOTAL DAY'S PURCHASES IN $:P5
1220  LET P5=0
1230  REM TOTAL DAY'S SALES IN $:S5
1240  LET S5=0
1250  FOR I=1 TO 5
1260  LET Z[I]=INT(Z[I]+.5)
1270  IF Z[I] <= 0 THEN 1300
1280  LET P5=P5+Z[I]*S[I]
1290  GOTO 1340
1300  LET S5=S5-Z[I]*S[I]
1310  IF -Z[I] <= P[I] THEN 1340
1320  PRINT "YOU HAVE OVERSOLD A STOCK; TRY AGAIN."
1330  GOTO 1090
1340  NEXT I
1350  REM TOTAL VALUE OF TRANSACTIONS:T5 
1360  LET T5=P5+S5
1370  REM BROKERAGE FEE:B5 
1380  LET B5=INT(.01*T5*100+.5)/100
1390  REM CASH ASSETS=OLD CASH ASSETS-TOTAL PURCHASES
1400  REM -BROKERAGE FEES+TOTAL SALES:C5 
1410  LET C5=C-P5-B5+S5
1420  IF C5 >= 0 THEN 1440
1430  PRINT "YOU HAVE USED $";-C5;"MORE THAN YOU HAVE."
1440  LET C=C5
1450  REM CALCULATE NEW PORTFOLIO  
1460  FOR I=1 TO 5
1470  LET P[I]=P[I]+Z[I]
1480  NEXT I
1490  REM CALCULATE NEW STOCK VALUES 
1500  GOSUB 1720
1510  REM PRINT PORTFOLIO
1520  REM BELL RINGING-DIFFERENT ON MANY COMPUTERS 
1530  FOR I=1 TO 20
1540  PRINT '7;
1550  NEXT I
1560  PRINT 
1570  PRINT "**********  END OF DAY'S TRADING"
1580  PRINT 
1590  PRINT 
1600  IF X9<1 THEN 1610
1610  PRINT "STOCK","PRICE/SHARE","HOLDINGS","VALUE","NET CHANGE"
1620  PRINT "IBM",S[1],P[1],S[1]*P[1],C[1]
1630  PRINT "RCA",S[2],P[2],S[2]*P[2],C[2]
1640  PRINT "LBJ",S[3],P[3],S[3]*P[3],C[3]
1650  PRINT "ABC",S[4],P[4],S[4]*P[4],C[4]
1660  PRINT "CBS",S[5],P[5],S[5]*P[5],C[5]
1670  LET X9=1
1680  PRINT 
1690  PRINT 
1700  GOTO 790
1710  REM NEW STOCK VALUES - SUBROUTINE
1720  REM RANDOMLY PRODUCE NEW STOCK VALUES BASED ON PREVIOUS
1730  REM DAY'S VALUES 
1740  REM N1,N2 ARE RANDOM NUMBERS OF DAYS WHICH RESPECTIVELY
1750  REM DETERMINE WHEN STOCK I1 WILL INCREASE 10 PTS. AND STOCK
1760  REM I2 WILL DECREASE 10 PTS. 
1770  REM IF N1 DAYS HAVE PASSED, PICK AN I1, SET E1, DETERMINE NEW N1 
1780  IF N1>0 THEN 1820
1790  LET I1=INT(4.99*RND(X)+1)
1800  LET N1=INT(4.99*RND(X)+1)
1810  LET E1=1
1820  REM IF N2 DAYS HAVE PASSED, PICK AN I2, SET E2, DETERMINE NEW N2 
1830  IF N2>0 THEN 1870
1840  LET I2=INT(4.99*RND(X)+1)
1850  LET N2=INT(4.99*RND(X)+1)
1860  LET E2=1
1870  REM DEDUCT ONE DAY FROM N1 AND N2
1880  LET N1=N1-1
1890  LET N2=N2-1
1900  REM LOOP THROUGH ALL STOCKS
1910  FOR I=1 TO 5
1920  LET X1=RND(X)
1930  IF X1>.25 THEN 1960
1940  LET X1=.25
1950  GOTO 2040
1960  IF X1>.5 THEN 1990
1970  LET X1=.5
1980  GOTO 2040
1990  IF X1>.75 THEN 2020
2000  LET X1=.75
2010  GOTO 2040
2020  LET X1=0
2030  REM BIG CHANGE CONSTANT:W3  (SET TO ZERO INITIALLY)
2040  LET W3=0
2050  IF E1<1 THEN 2100
2060  IF INT(I1+.5) <> INT(I+.5) THEN 2100
2070  REM ADD 10 PTS. TO THIS STOCK;  RESET E1 
2080  LET W3=10
2090  LET E1=0
2100  IF E2<1 THEN 2160
2110  IF INT(I2+.5) <> INT(I+.5) THEN 2160
2120  REM SUBTRACT 10 PTS. FROM THIS STOCK;  RESET E2
2130  LET W3=W3-10
2140  LET E2=0
2150  REM C(I) IS CHANGE IN STOCK VALUE
2160  LET C[I]=INT(A*S[I])+X1+INT(3-6*RND(X)+.5)+W3
2170  LET C[I]=INT(100*C[I]+.5)/100
2180  LET S[I]=S[I]+C[I]
2190  IF S[I]>0 THEN 2230
2200  LET C[I]=0
2210  LET S[I]=0
2220  GOTO 2240
2230  LET S[I]=INT(100*S[I]+.5)/100
2240  NEXT I
2250  REM AFTER T8 DAYS RANDOMLY CHANGE TREND SIGN AND SLOPE 
2260  LET T8=T8-1
2270  IF T8<1 THEN 2290
2280  RETURN 
2290  REM RANDOMLY CHANGE TREND SIGN AND SLOPE (A), AND DURATION OF
2300  REM OF TREND (T8)
2310  LET T8=INT(4.99*RND(X)+1)
2320  LET A=INT((RND(X)/10)*100+.5)/100
2330  LET S4=RND(X)
2340  IF S4 <= .5 THEN 2360
2350  LET A=-A
2360  RETURN 
2370  PRINT "HOPE YOU HAD FUN!!"
2380  END 
