1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GVPDQT: PLOTTING DATA
4  REM
5  REM       36554 REV A, PART 1 OF 2
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
250  REM ------------
500  DIM O$[50],A$[70],B$[50],Z$[50],W$[1]
510  DIM A[44],B[44]
515  DIM T[44]
520  DIM T$[70]
530  DIM Y[44],X[44]
600  FILES $STRING,$GPDQF,$GPDQI,$GPDQS,*
1000  REM ------------------------------
1001  REM -- MAIN ROUTINE
1010  PRINT "ITEM (A-G, '?' FOR INFORMATION)";
1012  INPUT Z$[1,1]
1014  IF Z$#"?" THEN 1020
1016  GOSUB 5100
1018  GOTO 1010
1020  REM -- GET FIRST ITEM
1022  GOSUB 5000
1024  A$=T$
1030  REM -- GET DATA
1032  GOSUB 4000
1040  FOR I0=1 TO 44
1042  A[I0]=T[I0]
1044  NEXT I0
1100  PRINT "DO YOU WANT TO PLOT ANYTHING ELSE";
1102  INPUT T$
1104  IF T$[1,1]="Y" THEN 1200
1110  S1=1
1112  GOTO 2000
1200  REM -- GET ANOTHER ITEM
1205  S1=2
1210  PRINT "ITEM (1-3, '?' FOR INFORMATION)";
1212  INPUT W$[1,1]
1214  IF W$#"?" THEN 1220
1216  GOSUB 5200
1218  GOTO 1210
1220  IF W$#"1" THEN 1300
1222  REM -- ANOTHER SET OF DATA
1224  GOSUB 5000
1226  B$=T$
1230  GOSUB 4000
1232  FOR I0=1 TO 44
1234  B[I0]=T[I0]
1236  NEXT I0
1240  GOTO 2000
1300  IF W$="2" THEN 1900
1350  REM -- MOVING AVERAGE
1360  PRINT "NUMBER OF QUARTERS FOR MOVING AVERAGE";
1362  INPUT Q9
1370  B$="MOVING AVERAGE"
1380  GOTO 2000
1900  B$="STRAIGHT-LINE TREND"
2000  REM -- FIND MAX AND MIN
2010  T1=0
2020  FOR I0=1 TO 44
2022  T2=A[I0]
2024  GOSUB 4100
2025  IF W$="2" THEN 2050
2026  IF S1=1 THEN 2050
2027  IF W$="3" THEN 2050
2028  T2=B[I0]
2030  GOSUB 4100
2050  NEXT I0
2100  REM -- SELECT SCALE
2110  PRINT "REGULAR SCALE OR LOGARITHMIC";
2112  INPUT T$
2114  S2=1
2116  IF T$[1,1]="R" THEN 2200
2118  S2=2
2120  IF X7>0 THEN 2200
2130  PRINT "MINIMUM VALUE IS ";X7
2132  PRINT "LOGARITHMIC SCALE IMPOSSIBLE -- REGULAR SCALE WILL BE USED";
2140  S2=1
2200  REM ------------------------
2201  REM -- CREATE GRAPH
2209  PRINT LIN(5)
2210  PRINT O$
2212  PRINT "*: ";A$
2220  IF S1=1 THEN 2300
2230  PRINT "+: ";B$
2232  PRINT "B: BOTH * AND +"
2300  IF S2=1 THEN 2400
2310  PRINT TAB(10);"LOGARITHMIC SCALE"
2400  T$="                                        "
2405  Z9=0
2410  IF (X7>0) OR (X8<0) THEN 2450
2415  Z9=(-40*X7)/(X8-X7)
2416  Z9=INT(Z9+1)
2420  T$[Z9,Z9]="!"
2450  REM -- AXIS IS IN Z9 UNLESS Z9 IS ZERO
2500  REM -- DRAW OTHER AXIS
2510  PRINT 
2512  PRINT "MINIMUM VALUE = ";X7
2514  PRINT "MAXIMUM VALUE = ";X8
2520  PRINT 
2525  PRINT "          *       +"
2530  PRINT TAB(23);"----------------------------------------"
2600  REM -- TRANSFORM VALUES IF NEEDED
2610  IF S2=1 THEN 2700
2611  X7=LOG(X7)
2612  X8=LOG(X8)
2620  FOR I0=1 TO 44
2622  IF A[I0]=-999 THEN 2630
2624  A[I0]=LOG(A[I0])
2630  NEXT I0
2635  IF S1=1 THEN 2700
2640  IF W$#"1" THEN 2700
2650  FOR I0=1 TO 44
2652  IF B[I0]=-999 THEN 2656
2654  B[I0]=LOG(B[I0])
2656  NEXT I0
2700  REM -- CALCULATE B VALUES IF NEEDED
2710  IF S1=1 THEN 2800
2712  IF W$="1" THEN 2800
2714  IF W$#"2" THEN 2770
2715  REM -- REGRESSION
2716  GOSUB 8000
2717  GOTO 2800
2770  REM -- MOVING AVERAGE
2771  GOSUB 8100
2800  REM -------------------
2805  D1=1963
2806  D2=0
2810  FOR I0=1 TO 44
2811  A9=B9=0
2812  D2=D2+1
2814  PRINT  USING 2815;D1,D2
2815  IMAGE #,DDDD,"/",D
2818  IF D2<4 THEN 2828
2820  D1=D1+1
2822  D2=0
2828  IF A[I0]=-999 THEN 2840
2830  V9=40*(A[I0]-X7)/(X8-X7)
2831  V9=INT(V9+1)
2835  A9=V9
2836  T$[V9,V9]="*"
2838  PRINT  USING "#,DDDD.DDD";A[I0]
2839  GOTO 2850
2840  PRINT  USING 2841
2841  IMAGE #,"   N/A  "
2842  A9=0
2850  IF S1=1 THEN 2875
2852  IF B[I0]=-999 THEN 2870
2853  IF (B[I0]<X7) OR (B[I0]>X8) THEN 2870
2854  V9=40*(B[I0]-X7)/(X8-X7)
2856  V9=INT(V9+1)
2858  B9=V9
2862  T$[B9,B9]="+"
2863  PRINT  USING "#,DDDD.DDD";B[I0]
2864  GOTO 2880
2865  T$[B9,B9]="B"
2866  GOTO 2880
2870  PRINT  USING 2841
2871  B9=0
2872  GOTO 2880
2875  PRINT  USING 2876
2876  IMAGE #,"        "
2880  GOSUB 3500
2885  IF A9=0 THEN 2890
2886  T$[A9,A9]=" "
2887  IF S1=1 THEN 2893
2890  IF B9=0 THEN 2893
2891  T$[B9,B9]=" "
2893  IF Z9=0 THEN 2895
2894  T$[Z9,Z9]="!"
2895  NEXT I0
3000  REM -- ALL DONE
3030  STOP 
3500  REM -- PRINT T$
3510  L9=1
3520  FOR I2=1 TO 41
3522  IF T$[I2,I2]=" " THEN 3530
3524  L9=I2
3530  NEXT I2
3540  PRINT " ";T$[1,L9]
3550  RETURN 
4000  REM ----------------
4001  REM -- GET DATA
4005  FOR I0=1 TO 44
4006  T[I0]=-999
4007  NEXT I0
4010  IF Z$="A" THEN 7100
4012  IF Z$="B" THEN 7200
4014  IF Z$="C" THEN 7300
4016  IF Z$="D" THEN 7400
4018  IF Z$="E" THEN 7500
4020  IF Z$="F" THEN 7600
4022  IF Z$="G" THEN 7700
4050  RETURN 
4100  REM ----------
4101  REM -- USE TO FIND MAX OR MIN
4110  IF T2=-999 THEN 4150
4112  IF T1=0 THEN 4140
4114  IF T2<X8 THEN 4120
4116  X8=T2
4120  IF T2>X7 THEN 4150
4122  X7=T2
4124  GOTO 4150
4140  T1=1
4142  X7=T2
4144  X8=T2
4150  RETURN 
5000  REM ---------------
5001  REM -- SUBROUTINE TO POSITION FOR INPUT RECORD
5010  PRINT "FUND, INDEX, STOCK OR PORTFOLIO";
5012  INPUT T$
5015  IF T$[1,1]="F" THEN 5020
5016  IF T$[1,1]="I" THEN 5022
5017  IF T$[1,1]="S" THEN 5024
5018  IF T$[1,1]="P" THEN 5026
5019  GOTO 5010
5020  F9=2
5021  GOTO 5030
5022  F9=3
5023  GOTO 5030
5024  F9=4
5025  GOTO 5030
5026  ASSIGN "PDQP",5,F9
5027  F9=5
5030  PRINT "NUMBER";
5031  INPUT T1
5040  REM -- PUT NAME IN T$
5042  IF F9#5 THEN 5050
5043  T$="PORTFOLIO"
5044  GOTO 5060
5050  READ #F9,T1
5052  FOR T2=1 TO 121
5053  READ #F9;T3
5054  NEXT T2
5056  READ #F9;T$
5060  READ #F9,T1
5065  REM -- FILE IS F9, POSITIONED TO READ
5070  RETURN 
5100  REM ------------
5101  REM -- LIST OPTIONS FOR ITEM
5110  PRINT "A) PRICE: STOCK PRICE/SHARE, INDEX LEVEL, FUND NAV/SHARE"
5112  PRINT "B) PRICE RETURN: PERCENTAGE CHANGE IN (A) PER QUARTER"
5114  PRINT "C) DIVIDEND"
5116  PRINT "D) DIVIDEND YIELD; QUARTERLY DIVIDEND/PRICE AT END OF PREVIOUS QUARTER"
5118  PRINT "E) RETURN: (B) + (C)"
5120  PRINT "F) CUMULATIVE VALUE WITH DIVIDENDS REINVESTED"
5122  PRINT "G) CUMULATIVE VALUE WITH DIVIDENDS IGNORED"
5190  PRINT 
5192  RETURN 
5200  REM -----------
5201  REM -- PRINT OPTIONS FOR SECOND ITEM
5210  PRINT "1) THE SAME TYPE OF DATA FOR ANOTHER STOCK, INDEX, FUND OR PORTFOLIO"
5212  PRINT "2) A STRAIGHT-LINE TREND FIT TO THE DATA BY LEAST-SQUARES REGRESSION"
5214  PRINT "3) A MOVING AVERAGE OF THE DATA"
5250  RETURN 
7100  REM --------
7101  REM -- OPTION (A) PRICE
7110  FOR I0=1 TO 40
7112  READ #F9;T1,T2,T3
7114  T[I0]=T1
7116  NEXT I0
7120  D9=0
7121  O$="PRICE"
7122  GOTO 4050
7200  REM -----------
7201  REM -- OPTION (B) PRICE RETURN
7210  FOR I0=1 TO 40
7212  READ #F9;T1,T2,T3
7214  IF (T3=-999) OR (T1=-999) THEN 7220
7215  T[I0]=(100*(T3-T1))/T1
7216  GOTO 7230
7220  T[I0]=-999
7230  NEXT I0
7232  D9=10
7233  O$="PRICE RETURN"
7240  GOTO 4050
7300  REM ----------
7301  REM -- OPTION (C) DIVIDENDS
7310  FOR I0=1 TO 40
7312  READ #F9;T1,T2,T3
7314  T[I0]=T2
7316  NEXT I0
7318  D9=10
7319  O$="DIVIDENDS"
7320  GOTO 4050
7400  REM ----------
7401  REM OPTION (D) DIVIDEND YIELD
7410  FOR I0=1 TO 40
7412  READ #F9;T1,T2,T3
7413  IF (T1=-999) OR (T2=-999) THEN 7416
7414  T[I0]=100*T2/T1
7415  GOTO 7419
7416  T[I0]=-999
7419  NEXT I0
7420  D9=10
7421  O$="DIVIDEND YIELD"
7422  GOTO 4050
7500  REM ----------
7501  REM OPTION (E) RATE OF RETURN
7510  FOR I0=1 TO 40
7512  READ #F9;T1,T2,T3
7513  IF (T1=-999) OR (T2=-999) OR (T3=-999) THEN 7516
7514  T[I0]=(100*(T3+T2-T1))/T1
7515  GOTO 7520
7516  T[I0]=-999
7520  NEXT I0
7530  D9=10
7531  O$="RATE OF RETURN"
7540  GOTO 4050
7600  REM -----------
7601  REM OPTION (F) CUMULATIVE WITH DIV
7610  FOR I0=1 TO 40
7612  READ #F9;T1,T2,T3
7614  IF (T1=-999) OR (T2=-999) OR (T3=-999) THEN 7650
7616  R=(T3+T2)/T1
7620  IF I0=1 THEN 7640
7622  IF T[I0-1]=-999 THEN 7640
7630  T[I0]=T[I0-1]*R
7635  GOTO 7650
7640  T[I0]=1
7650  NEXT I0
7651  O$="CUMULATIVE VALUE WITH DIVIDENDS REINVESTED"
7652  D9=0
7660  GOTO 4050
7700  REM -----------
7701  REM OPTION (G) -- CUMULATIVE W/O DIV
7710  FOR I0=1 TO 40
7712  READ #F9;T1,T2,T3
7714  IF (T1=-999) OR (T3=-999) THEN 7750
7716  R=(T3/T1)
7720  IF I0=1 THEN 7740
7722  IF T[I0-1]=-999 THEN 7740
7730  T[I0]=T[I0-1]*R
7735  GOTO 7750
7740  T[I0]=1
7750  NEXT I0
7751  O$="CUMULATIVE VALUE WITH DIVIDENDS IGNORED"
7752  D9=0
7760  GOTO 4050
8000  REM -----------
8001  REM -- COMPUTE B FROM REGRESSION
8010  N=0
8012  FOR I0=1 TO 44
8014  IF A[I0]=-999 THEN 8022
8016  N=N+1
8018  Y[N]=A[I0]
8020  X[N]=I0
8022  NEXT I0
8024  IF N <= 3 THEN 8090
8030  T1=T2=0
8032  FOR I0=1 TO N
8034  T1=T1+Y[I0]
8036  T2=T2+X[I0]
8040  NEXT I0
8042  T1=T1/N
8044  T2=T2/N
8050  T3=T4=0
8052  FOR I0=1 TO N
8054  T3=T3+((Y[I0]-T1)*(X[I0]-T2))
8056  T4=T4+((X[I0]-T2)^2)
8058  NEXT I0
8060  T3=T3/T4
8062  FOR I0=1 TO 44
8064  IF A[I0]=-999 THEN 8070
8066  B[I0]=T1+(T3*(I0-T2))
8068  GOTO 8072
8070  B[I0]=-999
8072  NEXT I0
8090  RETURN 
8100  REM -----------
8101  REM -- COMPUTE B AS Q9-QUARTER MOV AVG
8110  FOR I0=1 TO 44
8112  B[I0]=-999
8114  NEXT I0
8120  FOR I0=1 TO (45-Q9)
8122  T1=0
8130  FOR J0=I0 TO (I0+Q9-1)
8132  IF A[J0]=-999 THEN 8150
8134  T1=T1+A[J0]
8136  NEXT J0
8140  B[I0+Q9-1]=T1/Q9
8150  NEXT I0
8190  RETURN 
9999  END 
