home *** CD-ROM | disk | FTP | other *** search
/ PCDisk Magazine Disks / PCDisk Magazine - Disk 5.img / SM.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1984-05-28  |  12.7 KB  |  268 lines

  1. 10  REM STOCK MINDER Copyright (c) 1984 by Ron Lashley
  2. 20  DEFINT A-B,I-J,V:DIM DAYS(12),MAV(53),Y2(53),FL(30,52),NM$(30),DTS(52),SLOPE(31),MEAN(31),SDEV(31),LST(31),BETA(31),ACT$(31),ISTKN(30),VL(30)
  3. 30  FOR I=1 TO 3:FOR J=1 TO 3:READ SB$(I,J):NEXT J,I:FOR I=1 TO 12:READ DAYS(I):NEXT I
  4. 40  SCREEN 0:WIDTH 80:CLS:COLOR 7,0:KEY OFF:FOR I=1 TO 10:KEY I,"":NEXT
  5. 50  COLOR 14,0:LOCATE 10,35:PRINT "STOCK MINDER"
  6. 60  LOCATE 12,25:PRINT "COPYRIGHT (C) 1984 BY RON LASHLEY"
  7. 190  REM ----- Switch Stock List
  8. 200  COLOR 7,0:LOCATE 22,21:PRINT "YOU ARE PRESENTLY IN STOCK LIST # "DTA
  9. 205  LOCATE 23,21,1:PRINT "WHICH STOCK LIST DO YOU WANT (1,2,OR 3): ";
  10. 210  AN$=INKEY$:IF AN$="" THEN 210 ELSE PRINT AN$;
  11. 212  IF ASC(AN$)=13 THEN 205
  12. 214  J1=POS(V)-1:IF VAL(AN$)<1 OR VAL(AN$)>3 THEN LOCATE ,J1,0:PRINT " ";:LOCATE ,J1,1:GOTO 210
  13. 216  IF DTA=VAL(AN$) THEN 330 ELSE DTA=VAL(AN$)
  14. 218  LOCATE 24,35,0:COLOR 30,0:PRINT"LOADING DATA";
  15. 220  ON ERROR GOTO 320
  16. 230  ON DTA GOTO 240,250,260
  17. 240  OPEN "DATA1" FOR INPUT AS #1:GOTO 270
  18. 250  OPEN "DATA2" FOR INPUT AS #1:GOTO 270
  19. 260  OPEN "DATA3" FOR INPUT AS #1
  20. 270  ON ERROR GOTO 0:INPUT #1,A,B
  21. 285  FOR I=1 TO A:INPUT#1,NM$(I):NEXT I
  22. 290  IF B>0 THEN FOR I=1 TO B:INPUT#1,DTS(I):NEXT I
  23. 300  IF B>0 THEN FOR I=1 TO A:FOR J=1 TO B:INPUT#1,FL(I,J):NEXT J,I
  24. 310  CLOSE:GOTO 330
  25. 320  GOSUB 4200:RESUME 330
  26. 330  REM ----- Main Menu
  27. 335  ON ERROR GOTO 0:CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(29)"STOCK MINDER MAIN MENU":COLOR 7,0:GOSUB 4100
  28. 340  PRINT:PRINT TAB(25)"1 - ADD OR DELETE STOCK"
  29. 350  PRINT TAB(25)"2 - UPDATE STOCK PRICES"
  30. 360  PRINT TAB(25)"3 - GRAPH STOCK PERFORMANCE"
  31. 370  PRINT TAB(25)"4 - HIGH - LOW - LAST"
  32. 380  PRINT TAB(25)"5 - BUY/SELL ANALYSIS"
  33. 390  PRINT TAB(25)"6 - SORT STOCKS"
  34. 400  PRINT TAB(25)"7 - PRINT PRICE HISTORY"
  35. 410  PRINT TAB(25)"8 - SWITCH STOCK LIST"
  36. 420  LOCATE 23:COLOR 14,0:PRINT TAB(25)"ENTER CHOICE (<ESCAPE> TO EXIT): ";:LOCATE ,,1:COLOR 7,0
  37. 430  AN$=INKEY$:IF AN$="" THEN 430 ELSE PRINT AN$;
  38. 432  IF ASC(AN$)=13 THEN 420
  39. 434  IF ASC(AN$)=27 THEN 3000
  40. 436  J1=POS(V)-1:IF VAL(AN$)<1 OR VAL(AN$)>8 THEN LOCATE ,J1,0:PRINT " ";:LOCATE ,J1,1:GOTO 430
  41. 440  ON VAL(AN$) GOTO 450,700,1100,1480,2020,2715,1640,190
  42. 450  REM ----- Add/Delete Stock
  43. 460  CLS:LOCATE ,,0:PRINT TAB(30);:COLOR 14,0:PRINT "ADD/DELETE STOCK":PRINT:PRINT
  44. 465  PRINT TAB(22)"(A)dd or (D)elete (Enter Letter): ";:LOCATE ,,1:COLOR 7,0:VST=A
  45. 470  AN$=INKEY$:IF AN$="" THEN 470 ELSE PRINT AN$
  46. 475  IF AN$="D" OR AN$="d" THEN 555 ELSE IF AN$<>"A" AND AN$<>"a" THEN 330
  47. 480  IF A<30 THEN 500
  48. 485  PRINT:PRINT TAB(20)"STOCK LIST IS FULL.":PRINT TAB(10)"PRESS ANY KEY TO RETURN TO MENU."
  49. 490  AN$=INKEY$:IF A$="" THEN 490 ELSE GOTO 330
  50. 500  PRINT TAB(27)"ENTER NAME - PRESS <ENTER>."
  51. 505  PRINT TAB(27)"PRESS <ENTER> ONLY FOR MENU."
  52. 510  PRINT:PRINT "  ENTER NAMES WITH MARKET IN PARENTHESES [i.e. AVX(N) ]-- 12 CHARACTERS MAX."
  53. 515  A=A+1:WHILE A<31:PRINT TAB(27)"STOCK # "A":  ";:J1=POS(V):LOCATE ,,1:LINE INPUT NM$(A):IF NM$(A)="" THEN 550
  54. 520  IF A=1 THEN 535
  55. 525  X=0:FOR I=1 TO A-1:IF NM$(A)=NM$(I) THEN X=1
  56. 530  NEXT I:IF X=1 THEN PRINT TAB(27)"NAME ALREADY IN LIST";:FOR I1=1 TO 1500:NEXT I1:LOCATE ,27,0:PRINT SPACE$(20);:I1=CSRLIN-1:LOCATE I1,J1,0:PRINT SPACE$(30);:LOCATE I1-1,J1,0:GOTO 545
  57. 535  IF LEN(NM$(A))>12 THEN PRINT TAB(27)"NAME TOO LONG";:FOR I1=1 TO 1500:NEXT I1:LOCATE ,27,0:PRINT SPACE$(20);:I1=CSRLIN-1:LOCATE I1,J1,0:PRINT SPACE$(30);:LOCATE I1-1,J1,0:GOTO 545
  58. 540  FOR I=1 TO B:FL(A,I)=0:NEXT I:A=A+1
  59. 545  WEND
  60. 550  A=A-1:IF A=VST THEN 330 ELSE 2900
  61. 555  IF A=0 THEN GOSUB 5000:GOTO 330
  62. 557  CLS:LOCATE ,,0:PRINT:PRINT TAB(32)"STOCKS ON RECORD":GOSUB 4100
  63. 560  PRINT:PRINT TAB(17)"ENTER # TO BE DELETED, PRESS <ENTER>."
  64. 570  PRINT TAB(23)"PRESS <ENTER> ONLY TO END.":PRINT
  65. 580  PRINT TAB(20)"STOCK # TO DELETE:";:J1=POS(V)+1:LOCATE ,,1:INPUT" ",AN$:IF AN$="" THEN 650
  66. 590  DLT=VAL(AN$):IF DLT<1 OR DLT>A THEN GOSUB 5500:GOTO 580
  67. 600  PRINT TAB(20)"CONFIRM "NM$(DLT)" (Y/N): ";:LOCATE ,,1:GOSUB 5400
  68. 620  IF AN$="N" OR AN$="n" THEN I1=CSRLIN-1:LOCATE ,20,0:PRINT SPACE$(40);:LOCATE I1,J1,0:PRINT" ";:LOCATE I1-1:GOTO 580
  69. 640  FOR I=DLT+1 TO A:NM$(I-1)=NM$(I):IF B>0 THEN FOR J=1 TO B:FL(I-1,J)=FL(I,J):NEXT J
  70. 645  NEXT I:NM$(A)="":FOR I=1 TO A:FL(I,A)=0:NEXT I:A=A-1:PRINT TAB(25)"DELETED":FOR I=1 TO 1500:NEXT I:GOTO 555
  71. 650  IF A=VST THEN 330 ELSE 2900
  72. 700  REM ----- Update Stock Prices
  73. 710  CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(30)"UPDATE STOCK PRICES":COLOR 7,0:PRINT:PRINT
  74. 715  IF A=0 THEN GOSUB 5000:GOTO 330
  75. 720  PRINT"ENTER DATE OF PRICES: MONTH/DAY/YEAR (i.e. 6/20/84):";:LOCATE ,,1:J1=POS(V)+1:INPUT" ",DT$
  76. 723  IF DT$="" THEN 330
  77. 725  I=INSTR(DT$,"/"):IF I=0 THEN GOSUB 5200:GOTO 720
  78. 730  J=INSTR(I+1,DT$,"/"):IF J=0 THEN GOSUB 5200:GOTO 720
  79. 735  M=VAL(LEFT$(DT$,I-1)):D=VAL(MID$(DT$,I+1,J-1)):Y=VAL(MID$(DT$,J+1)):IF Y<80 OR Y>99 THEN GOSUB 5300:GOTO 720
  80. 740  IF M<1 OR M>12 THEN GOSUB 5300:GOTO 720
  81. 745  IF D<1 OR D>DAYS(M) THEN GOSUB 5300:GOTO 720
  82. 750  DT=INT((Y*10000)+(M*100)+D)
  83. 755  V1=0:CHG=O:FOR I=1 TO B:IF DT=DTS(I) THEN V1=I
  84. 760  NEXT I:IF V1=0 THEN 1000
  85. 765  CLS:PRINT TAB(23)"EDIT STOCK PRICES FOR: "DT$:PRINT
  86. 767  F$="####.###":FOR I=1 TO 10 :PRINT:PRINT I;NM$(I);:IF FL(I,V1)>0 THEN PRINT TAB(17);:PRINT USING F$;FL(I,V1);
  87. 769  PRINT TAB(27)I+10;NM$(I+10);:IF FL(I+10,V1)>0 THEN PRINT TAB(43);:PRINT USING F$;FL(I+10);
  88. 771  PRINT TAB(55)I+20;NM$(I+20);:IF FL(I+20,V1)>0 THEN PRINT TAB(71);:PRINT USING F$;FL(I+20)
  89. 772  NEXT I
  90. 773  LOCATE 15,20,0:PRINT SPACE$(50):LOCATE 15,20:PRINT"SELECT STOCK TO BE EDITED:";:J1=POS(V)+1:LOCATE ,,1:INPUT" ",AN$
  91. 775  IF AN$="" THEN IF CHG=0 THEN 330 ELSE 2900
  92. 780  V2=VAL(AN$):IF V2<0 OR V2>A THEN GOSUB 5500:GOTO 773
  93. 785  LOCATE 17,20,0:PRINT SPACE$(50):LOCATE 17,20,0:PRINT "EDIT FOR SPLIT (Y/N)? ";:LOCATE ,,1:GOSUB 5400
  94. 795  IF AN$="N" OR AN$="n" THEN 900
  95. 800  LOCATE 19,10:PRINT SPACE$(65):LOCATE 19,10:PRINT"ENTER SPLIT FACTOR USING A COMMA (E.G. 3 FOR 2 AS 3,2): ";:J1=POS(V):LOCATE ,,1:LINE INPUT AN$
  96. 805  IF AN$="" THEN LOCATE 19,10:PRINT SPACE$(60):GOTO 785
  97. 810  I=INSTR(AN$,","):IF I=0 THEN GOSUB 5200:GOTO 800
  98. 815  F1=VAL(LEFT$(AN$,I-1)):F2=VAL(MID$(AN$,I+1))
  99. 820  LOCATE 21,10:PRINT "CONFIRM SPLIT: ";F1;" FOR ";F2;" (Y/N): ";:LOCATE ,,1:GOSUB 5400
  100. 830  IF AN$="N" OR AN$="n" THEN LOCATE 21,30:PRINT SPACE$(40):LOCATE 19,10:PRINT SPACE$(60):GOTO 800
  101. 835  CHG=1:FOR I=V1 TO 1 STEP-1:FL(V2,I)=FL(V2,I)*(F2/F1):NEXT I:GOTO 765
  102. 900  LOCATE 19,20:PRINT"ENTER NEW PRICE FOR ";NM$(V2);":";:LOCATE ,,1:INPUT" ",AN$:IF AN$="" THEN LOCATE 19,20,0:PRINT SPACE$(50):LOCATE 17,20:PRINT SPACE$(50):GOTO 773
  103. 905  CHG=1:IF VAL(AN$)<0 THEN FL(V2,V1)=0 ELSE FL(V2,V1)=VAL(AN$)
  104. 910  GOTO 765
  105. 1000  LOCATE 6,15:PRINT"CONFIRM: NEW PRICE DATA (Y/N)? ";:LOCATE ,,1:GOSUB 5400
  106. 1010  IF AN$="N" OR AN$="n" THEN 710
  107. 1015  FOR I=1 TO B:IF DT>DTS(I) THEN V1=I
  108. 1020  NEXT I:IF V1=0 AND B=52 THEN LOCATE 8,20:PRINT"DATE TOO EARLY; WOULD DESTROY LATEST DATA":FOR J=1 TO 1500:NEXT J:GOTO 710
  109. 1025  IF B=52 THEN FOR J=1 TO V1-1:DTS(J)=DTS(J+1):FOR I=1 TO A:FL(I,J)=FL(I,J+1):NEXT J,I:GOTO 1035
  110. 1030  B=B+1:V1=V1+1:IF V1<B THEN FOR J=B-1 TO V1 STEP-1:DTS(J+1)=DTS(J):FOR I=1 TO A:FL(I,J+1)=FL(I,J):NEXT I,J
  111. 1035  CLS:PRINT TAB(25)"ENTERING NEW PRICES FOR ";DT$:PRINT:FOR I=1 TO A:PRINT TAB(30) NM$(I);":";:LOCATE ,,1:INPUT" ",AN$
  112. 1040  IF VAL(AN$)<0 THEN FL(I,V1)=0 ELSE FL(I,V1)=VAL(AN$)
  113. 1045  NEXT I:DTS(V1)=DT:GOTO 2900
  114. 1100  REM ----- Graph Stocks
  115. 1110  CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(30)"PERFORMANCE GRAPHS":COLOR 7,0:PRINT:PRINT
  116. 1120  IF B=0 THEN GOSUB 5100:GOTO 330
  117. 1180  PRINT"GRAPH LEGEND:     PRICES = VERTICAL LINES    MOVING AVE = HORIZONTAL *":GOSUB 4100
  118. 1200  PRINT:COLOR 14,0:PRINT TAB(10)"ENTER # TO BE GRAPHED (<RETURN> TO EXIT):";:J1=POS(V)+1:LOCATE ,,1:INPUT" ",AN$:IF AN$="" THEN 330
  119. 1210  X=VAL(AN$):IF X<1 OR X>A THEN GOSUB 5500:GOTO 1200
  120. 1220  CLS:COLOR 7,0:K1=FL(X,1):K2=K1
  121. 1230  FOR J=1 TO B:IF FL(X,J)<>0 AND K1>FL(X,J) THEN K1=FL(X,J)
  122. 1240  IF FL(X,J)<>0 AND K2<FL(X,J) THEN K2=FL(X,J)
  123. 1250  NEXT J:K1=INT(K1):K2=INT(K2+1)
  124. 1254  FOR I=1 TO B:IF FL(X,I)=0 THEN NEXT I
  125. 1256  FOR J=B TO 1 STEP-1:IF FL(X,J)=0 THEN NEXT J
  126. 1258  DT1$=STR$(DTS(I)):DT1$=MID$(DT1$,4,2)+"/"+RIGHT$(DT1$,2)+"/"+MID$(DT1$,2,2)
  127. 1260  DT2$=STR$(DTS(J)):DT2$=MID$(DT2$,4,2)+"/"+RIGHT$(DT2$,2)+"/"+MID$(DT2$,2,2)
  128. 1265  PRINT "STOCK: ";NM$(X);:PRINT TAB(25)"FIRST PRICE: ";DT1$;"   LAST PRICE: ";DT2$
  129. 1270  K3=INT(((K2-K1)/18)+0.99)
  130. 1280  PRINT:FOR I=K1+17*K3 TO K1-K3 STEP-K3:PRINT I:NEXT '----- Graph Scale
  131. 1290  FOR J=1 TO B:IF FL(X,J)=0 THEN Y2(J)=0:GOTO 1310
  132. 1300  Y2(J)=INT(((FL(X,J)-K1)/K3)+1) '----- Calc. Vert. Line
  133. 1310  NEXT J:LOCATE 22,4
  134. 1320  FOR J=1 TO B:IF Y2(J) THEN FOR I=21 TO 21-Y2(J) STEP-1:LOCATE I,5+J:PRINT CHR$(221):NEXT I
  135. 1330  NEXT J
  136. 1340  FOR J=5 TO B:Y2(J)=0:IF FL(X,J)=0 THEN 1380
  137. 1350  FOR I=J-1 TO J-4 STEP-1:IF FL(X,I)=0 THEN 1380
  138. 1360  NEXT I:MAV(J)=0:FOR I=J TO J-4 STEP-1:MAV(J)=MAV(J)+FL(X,I):NEXT I:MAV(J)=MAV(J)/5
  139. 1370  Y2(J)=INT(20-((MAV(J)-K1)/K3)+1) '----- Calc. Line
  140. 1380  NEXT J
  141. 1390  FOR J=5 TO B:IF Y2(J)>0 THEN XX=5+J:LOCATE Y2(J),XX:PRINT"*"
  142. 1400  NEXT J:LOCATE 22,1:COLOR 14,0:PRINT"     1234567890123456789012345678901234567890123456789012 -- Periods"
  143. 1410  PRINT"              1         2         3         4         5 "
  144. 1465  COLOR 7,0:PRINT"Enter (G) for another graph; (ESC) to return to menu or PrtSc  to print";
  145. 1470  AN$=INKEY$:IF AN$="" THEN 1470 ELSE IF ASC(AN$)<>27 THEN 1110
  146. 1475  GOTO 330
  147. 1480  REM ----- High-Low-Last
  148. 1490  CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(30)"HI-LOW-LAST  PRICES":COLOR 7,0:PRINT:PRINT
  149. 1495  IF B=0 THEN GOSUB 5100:GOTO 330
  150. 1500  PRINT"STOCK          HI       LOW      LAST  |STOCK          HI       LOW      LAST"
  151. 1510  PRINT:Y=0:FOR I=1 TO 15:LST=0:LST2=0:HFL2=0:HFL=0:LFL=FL(I,1):LFL2=FL(I+15,1)
  152. 1520  FOR J=1 TO B:IF FL(I,J)>HFL THEN HFL=FL(I,J)
  153. 1530  IF FL(I+15,J)>HFL2 THEN HFL2=FL(I+15,J)
  154. 1540  IF FL(I,J)<=LFL AND FL(I,J)>0 THEN LFL=FL(I,J)
  155. 1550  IF FL(I+15,J)<=LFL2 AND FL(I+15,J)>0 THEN LFL2=FL(I+15,J)
  156. 1560  IF FL(I,J)>0 THEN LST=FL(I,J)
  157. 1570  IF FL(I+15,J)>0 THEN LST2=FL(I+15,J)
  158. 1580  NEXT J:COLOR 7,0:Y=1-Y:IF Y THEN COLOR 14,0
  159. 1590  F$="####.###":IF NM$(I)<>"" THEN PRINT LEFT$(NM$(I),10);:PRINT TAB(13);:PRINT USING F$;HFL;:PRINT TAB(22);:PRINT USING F$;LFL;:PRINT TAB(31);:PRINT USING F$;LST;:PRINT TAB(40)"|";
  160. 1600  IF NM$(15+I)<>"" THEN PRINT TAB(41) LEFT$(NM$(15+I),10);:PRINT TAB(53);:PRINT USING F$;HFL2;:PRINT TAB(62);:PRINT USING F$;LFL2;:PRINT TAB(71);:PRINT USING F$;LST2 ELSE PRINT
  161. 1610  NEXT I
  162. 1615  COLOR 7,0
  163. 1616  LOCATE 23,1,1:PRINT "PRESS ANY KEY TO RETURN TO MENU.";
  164. 1620  AN$=INKEY$:IF AN$="" THEN 1620 ELSE 330
  165. 1640  REM ----- Print Price History
  166. 1650  CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(30)"STOCK PRICE HISTORY":COLOR 7,0:PRINT:IF B=0 THEN PRINT:GOSUB 5100:GOTO 330
  167. 1653  GOSUB 4100:PRINT:PRINT
  168. 1655  ISTK=0:PRINT TAB(12)"ENTER SELECTION (<ENTER> FOR ALL, 0 TO EXIT): ";:J1=POS(V):LOCATE ,,1:LINE INPUT AN$
  169. 1657  IF AN$="0" THEN 330
  170. 1660  IF AN$="" THEN ISTK=A:FOR I=1 TO A:ISTKN(I)=I:NEXT I:GOTO 1700
  171. 1665  I=INSTR(AN$,"-"):IF I=0 THEN 1680
  172. 1670  V1=VAL(LEFT$(AN$,I-1)):V2=VAL(MID$(AN$,I+1))
  173. 1675  IF V1<1 OR V1>A OR V2<1 OR V2>A OR V1>V2 THEN GOSUB 5500:GOTO 1655 ELSE ISTK=V2-V1+1:FOR I=V1 TO V2:ISTKN(I-V1+1)=I:NEXT I:GOTO 1700
  174. 1680  I=INSTR(AN$,","):IF I=0 THEN 1695
  175. 1685  V1=1:WHILE V1<=LEN(AN$):V2=VAL(MID$(AN$,V1,I-V1)):IF V2<1 OR V2>A THEN GOSUB 5500:GOTO 1655 ELSE ISTK=ISTK+1:ISTKN(ISTK)=V2
  176. 1690  V1=I+1:I=INSTR(V1,AN$,","):IF I=0 THEN I=LEN(AN$)+1:
  177. 1693  WEND:GOTO 1700
  178. 1695  V1=VAL(AN$):IF V1<1 OR V1>A THEN GOSUB 5500:GOTO 1655 ELSE ISTK=1:ISTKN(1)=V1
  179. 1700  PRINT:PRINT TAB(17)"READY PRINTER. PRESS ANY KEY TO START."
  180. 1705  AN$=INKEY$:IF AN$="" THEN 1705
  181. 1710  F$="#######.###":V1=INT(ISTK/5):VST=1:IF V1=0 THEN 1720
  182. 1715  FOR I=1 TO V1:VST=((I-1)*5)+1:VFIN=VST+4:GOSUB 1800:LPRINT CHR$(12):NEXT I:VST=VST+5
  183. 1720  IF VST<=ISTK THEN VFIN=ISTK:GOSUB 1800
  184. 1730  GOTO 330
  185. 1800  LPRINT:LPRINT TAB(30)"STOCK PRICE HISTORY":LPRINT:LPRINT
  186. 1805  FOR J=VST TO VFIN:VL(J)=LEN(NM$(ISTKN(J))):LPRINT TAB((J-VST)*14+10)SPACE$((14-VL(J))/2-0.5);NM$(ISTKN(J));:NEXT J:LPRINT
  187. 1810  FOR J=VST TO VFIN:LPRINT TAB((J-VST)*14+10)SPACE$((14-VL(J))/2-0.5);STRING$(VL(J),"-");:NEXT J:LPRINT
  188. 1815  FOR J=1 TO B:DT1$=STR$(DTS(J)):DT1$=MID$(DT1$,4,2)+"/"+RIGHT$(DT1$,2)+"/"+MID$(DT1$,2,2):LPRINT DT1$;
  189. 1820  LPRINT TAB(10);:FOR J1=VST TO VFIN:LPRINT USING F$;FL(ISTKN(J1),J);:LPRINT SPACE$(3);:NEXT J1:LPRINT:NEXT J:LPRINT:RETURN
  190. 2020  REM ----- Buy/Sell Evaluation Routine
  191. 2030  CLS:LOCATE ,,0:COLOR 14,0:PRINT TAB(27)"STOCK BUY/SELL ANALYSIS":COLOR 7,0:PRINT:PRINT
  192. 2040  IF B=0 THEN GOSUB 5100:GOTO 330
  193. 2050  FOR I=1 TO A:LOCATE 4,29:PRINT"ANALYZING STOCK # "I:FOR J=1 TO B:IF FL(I,J)>0 THEN LST(I)=FL(I,J)
  194. 2080  NEXT J
  195. 2090  Y1=0:FOR J=1 TO B:IF FL(I,J)=0 THEN 2110 '----- Calc. Slope
  196. 2100  Y1=Y1+1:Y2(Y1)=J
  197. 2110  NEXT J:SUMY=0:XY=0
  198. 2120  FOR J=1 TO Y1:XY=XY+J*FL(I,Y2(J)):SUMY=SUMY+FL(I,Y2(J)):NEXT J
  199. 2130  IF Y1>1 THEN SLOPE(I)=(XY-SUMY*(Y1/2))/10
  200. 2140  IF Y1>0 THEN MEAN(I)=SUMY/Y1
  201. 2150  IF Y1<5 THEN MX=2:MY=2:GOTO 2385
  202. 2200  FOR J=1 TO Y1:SUMSQR=SUMSQR+(MEAN(I)-FL(I,Y2(J)))^2
  203. 2210  NEXT J:SDEV(I)=SQR(SUMSQR)/(Y1-1):BETA(I)=INT((SDEV(I)/MEAN(I))*1000):MX=2:MY=2
  204. 2320  DIF=LST(I)-MEAN(I):IF DIF>2*SDEV(I) THEN MY=3:GOTO 2350
  205. 2330  IF DIF<-2*SDEV(I) THEN MY=1:GOTO 2350
  206. 2340  MY=2
  207. 2350  IF SLOPE(I)>SDEV(I) THEN MX=3:GOTO 2380
  208. 2360  IF SLOPE(I)<-SDEV(I) THEN MX=1:GOTO 2380
  209. 2370  MX=2
  210. 2380  IF MX=3 AND MY=3 AND LST(I)-MEAN(I)>4*SDEV(I) THEN MX=2
  211. 2385  ACT$(I)=SB$(MX,MY)
  212. 2390  NEXT I
  213. 2400  LOCATE 4,1,0:COLOR 14,0:PRINT"STOCK NAME           ACTION            AVE. PRICE        LAST PRICE    DELTA"
  214. 2405  PRINT"----------           ------            ----------        ----------    -----"
  215. 2410  FOR I=1 TO A:IF ACT$(I)="SELL" THEN COLOR 20,0
  216. 2420  IF ACT$(I)="BUY" THEN COLOR 18,0
  217. 2440  PRINT NM$(I)TAB(22);
  218. 2442  IF Y1=0 THEN PRINT"NO PRICES":GOTO 2450
  219. 2444  PRINT ACT$(I)TAB(42)MEAN(I)TAB(59);:
  220. 2446  PRINT USING"####.###";LST(I);:PRINT TAB(72);
  221. 2448  IF Y1>4 THEN PRINT USING"##.##";BETA(I)/10 ELSE PRINT "  NA"
  222. 2450  COLOR 7,0:IF I<>15 THEN 2460
  223. 2453  COLOR 14,0:PRINT:PRINT"PRESS ANY KEY TO CONTINUE.";:LOCATE ,,1:COLOR 7,0
  224. 2455  AN$=INKEY$:IF AN$="" THEN 2455 ELSE LOCATE CSRLIN-1,1,0
  225. 2460  NEXT I
  226. 2490  PRINT:PRINT"PRESS ANY KEY FOR MENU.";:LOCATE ,,1
  227. 2500  AN$=INKEY$:IF AN$="" THEN 2500 ELSE 330
  228. 2715  REM ----- Sorting Routine
  229. 2720  LOCATE 23,25,0:PRINT SPACE$(45);:LOCATE ,30:IF A=0 THEN GOSUB 5000:GOTO 330 ELSE COLOR 30,0:PRINT"SORTING";
  230. 2730  FOR I=1 TO A-1:FOR J=I+1 TO A:IF RIGHT$(NM$(I),2)<=RIGHT$(NM$(J),2) THEN 2760
  231. 2740  SWAP NM$(I),NM$(J)
  232. 2750  FOR Z=1 TO B:SWAP FL(I,Z),FL(J,Z):NEXT Z
  233. 2760  NEXT J,I
  234. 2770  FOR I=1 TO A-1:FOR J=I+1 TO A
  235. 2775  IF (RIGHT$(NM$(I),2)=RIGHT$(NM$(J),2) AND RIGHT$(NM$(I),1)=")" AND NM$(I)<=NM$(J)) OR (RIGHT$(NM$(I),1)<>")" AND RIGHT$(NM$(J),1)<>")" AND NM$(I)<=NM$(J)) THEN 2800
  236. 2780  SWAP NM$(I),NM$(J)
  237. 2790  FOR Z=1 TO B:SWAP FL(I,Z),FL(J,Z):NEXT Z
  238. 2800  NEXT J,I:LOCATE 23,30,0:COLOR 14,0:PRINT"SORT COMPLETE";:FOR I=1 TO 1500:NEXT I:LOCATE ,30:PRINT SPACE$(20):LOCATE ,1:GOTO 2900
  239. 2900  REM ----- Save Updated Data To Disk
  240. 2910  COLOR 30,0:PRINT TAB(30)"SAVING DATA";:ON DTA GOTO 2915,2920,2925
  241. 2915  OPEN "DATA1" FOR OUTPUT AS #1:GOTO 2930
  242. 2920  OPEN "DATA2" FOR OUTPUT AS #1:GOTO 2930
  243. 2925  OPEN "DATA3" FOR OUTPUT AS #1
  244. 2930  PRINT#1,A;B
  245. 2935  FOR I=1 TO A:PRINT#1,NM$(I):NEXT I
  246. 2940  IF B>0 THEN FOR I=1 TO B:PRINT#1,DTS(I):NEXT I
  247. 2945  IF B>0 THEN FOR I=1 TO A:FOR J=1 TO B:PRINT#1,FL(I,J):NEXT J,I
  248. 2950  CLOSE:GOTO 330
  249. 3000  REM ----- End Routine
  250. 3010  KEY 1,"LIST ":KEY 2,"RUN"+CHR$(13):KEY 3,"LOAD"+CHR$(34):KEY 4,"SAVE"+CHR$(34):KEY 5,"CONT"+CHR$(13):KEY 6,","+CHR$(34)+"LPT1:"+CHR$(34)+CHR$(13):KEY 7,"TRON"+CHR$(13):KEY 8,"TROFF"+CHR$(13):KEY 9,"KEY "
  251. 3020  KEY 10,"SCREEN "+CHR$(0)+","+CHR$(0)+","+CHR$(0)+CHR$(13):CLS:KEY ON:END
  252. 3500  REM ----- Data Section
  253. 3510  DATA CONSIDER A BUY,CONSIDER A SELL,SELL,BUY,NO ACTION,SELL,BUY,CONSIDER A BUY,CONSIDER A SELL
  254. 3520  DATA 31,29,31,30,31,30,31,31,30,31,30,31
  255. 4000  REM ----- Subroutines
  256. 4100  PRINT:FOR I=1 TO 10 :PRINT TAB(5)I;NM$(I)TAB(30)I+10;NM$(I+10)TAB(55)I+20;NM$(I+20):NEXT I:RETURN
  257. 4200  A=0:B=0:FOR I=1 TO 30:NM$(I)="":ACT$(I)="":FOR J=1 TO 52:FL(I,J)=0:NEXT J,I:FOR I=1 TO 52:DTS(I)=0:NEXT:RETURN
  258. 5000  PRINT TAB(30)"NO STOCKS IN LIST":FOR I1=1 TO 1500:NEXT I1:RETURN
  259. 5100  PRINT TAB(30)"NO PRICES IN LIST":FOR I1=1 TO 1500:NEXT I1:RETURN
  260. 5200  PRINT TAB(40)"INVALID FORMAT";:FOR I1=1 TO 1500:NEXT I1:I1=CSRLIN-1:LOCATE ,40,0:PRINT SPACE$(20);:LOCATE I1-1,J1:PRINT SPACE$(20);:RETURN
  261. 5300  PRINT TAB(40)"INVALID DATE";:FOR I1=1 TO 1500:NEXT I1:I1=CSRLIN-1:LOCATE ,40,0:PRINT SPACE$(20);:LOCATE I1,J1:PRINT SPACE$(20);:LOCATE ,1,1:RETURN
  262. 5400  AN$=INKEY$:IF AN$="" THEN 5400 ELSE J1=POS(V)
  263. 5410  IF ASC(AN$)<>13 THEN PRINT AN$;
  264. 5420  IF AN$="Y" OR AN$="y" OR AN$="N" OR AN$="n" THEN 5440
  265. 5430  LOCATE ,,0:PRINT TAB(35)"Y OR N PLEASE";:FOR I1=1 TO 1000:NEXT I1:I1=CSRLIN-1:LOCATE ,35:PRINT SPACE$(20);:LOCATE I1,J1:PRINT " ";:LOCATE ,J1,1:GOTO 5400
  266. 5440  RETURN
  267. 5500  PRINT TAB(30)"BAD SELECTION";:FOR I1=1 TO 1500:NEXT I1:I1=CSRLIN-1:LOCATE ,30,0:PRINT SPACE$(20);:LOCATE I1,J1,0:PRINT SPACE$(10);:LOCATE ,1,1:RETURN
  268.