home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0020 - 0029 / ibm0020-0029 / ibm0028.tar / ibm0028 / PDXOS2-1.ZIP / SAMPLE / DOFEED.SC < prev    next >
Encoding:
Text File  |  1988-12-29  |  8.2 KB  |  189 lines

  1. ; SCRIPT:     DOFEED.SC
  2. ; Version:    2.0
  3. ; Date:       2 May 87
  4. ;
  5. ;
  6. ; The DOFEED script contains the procedures used to generate stock buy and
  7. ; sell activity (done at random). When DOFEED first begins, it attempts to
  8. ; initialize the PRICE table -- if the PRICE table has already been
  9. ; initialized, it is assumed that another copy of FEED is running elsewhere
  10. ; on the network, and the information in the fields manipulated by Rnd is not
  11. ; zeroed out.  If the PRICE table is not yet initialized, then information
  12. ; about the latest stock trading is zeroed out (High and Low set to the
  13. ; Price, Last Activity zeroed, and so on).
  14.  
  15. ; The DoFeed procedure creates random stock trading information and displays
  16. ; it as it is generated.
  17.  
  18. PROC DoFeed()
  19.   @ 0,0
  20.   ?? FORMAT("w80,ac",
  21.           "SIMULATED PRICE FEED IS RUNNING - PRESS ANY KEY TO ESCAPE")
  22.   R=FirstStockRow - 1                           ; display trades on starting line
  23.   COEDIT "PRICE"                                ; get the PRICE table on workspace
  24.   WHILE NOT CHARWAITING()                       ; For as long as user doesn't press key
  25.     Zip=INT(RAND()*NRECORDS(TABLE()))           ; Generate random record #       in table
  26.     MOVETO RECORD Zip + 1                       ; And move to that record
  27.     Retry = FALSE                               ; Don't want to retry just yet
  28.     LOCKRECORD                                  ; Can we get the record?
  29.     WHILE NOT retval                            ; no, so we must
  30.       Retry = TRUE                              ;   keep reminder that we need to retry
  31.       SLEEP 200                                 ;   pause a moment before retrying
  32.       LOCKRECORD                                ;   and try to get the record again
  33.       PutMessage("*")                           ;   display an asterisk to show we're retrying
  34.     ENDWHILE
  35.  
  36. ; If we get here, we locked record successfully
  37.  
  38.     IF (Retry) THEN ClearMessage() ENDIF         ; If we had to retry, erase asterisk
  39.     Change=ROUND((RAND()-.5)*[Price]/8,3)        ; Generate a random price
  40.     Volume = INT( (1000/[Price]) * (RAND() * 5)) ; Generate a random volume
  41.     Newprice = [Price]+Change                    ; Calculate new stock price
  42.     [High] = MAX( [High], Newprice)              ; Calculate new session High price
  43.     [Low]  = MIN( [Low], Newprice)               ; Calculate new session Low price
  44.     [Volume] = [Volume] + Volume                 ; Update the stock trading volume
  45.     [Chg] = Newprice - ( [Price] - [Chg])        ; Stick in the change in price
  46.     [Price]= NewPrice                            ; And update the Price
  47.     [LAST]=TIME()                                ; Finally, stick in the time of the trade
  48.  
  49. ; Time to display what we've done
  50.  
  51.    Lastr=R                          ; Lastr is previous row we displayed trade on
  52.    R=R+1                            ; Increment our row counter to get new trade row
  53.    IF R>LastStockRow THEN R=FirstStockRow ENDIF    ; Wrap to start line when we get to bottom
  54.    @ Lastr,LeftMargin ?? "            " ; Clear the LAST TRADE: marker from previous trade
  55.    ?? Curline                       ; and display previous trade
  56.    IF (IsColorMonitor)
  57.      THEN STYLE ATTRIBUTE 116       ; Red on Light Grey for Color monitors
  58.      ELSE STYLE REVERSE             ; everyone else gets inverse
  59.    ENDIF
  60.  
  61.    @ R,LeftMargin ?? "LAST TRADE: "         ; And update the trade information
  62.    Curline = format("W6",[TICKER]) +
  63.              "  " + FORMAT("W9.3",[PRICE]) +
  64.              " " + FORMAT("W6",VOLUME) + " SHARES " +
  65.              " AT " + [LAST] + "  "
  66.    SWITCH
  67.      CASE Change > .001 :
  68.         Curline = Curline + "+" + FORMAT("W8.3",Change)
  69.      CASE Change < -.001 :
  70.         Curline = Curline + "-" + FORMAT("W8.3",-Change)
  71.      OTHERWISE:
  72.         Curline = Curline + "UNCHANGED"
  73.    ENDSWITCH
  74.    ?? Curline                       ; Display the trade information
  75.    STYLE ATTRIBUTE 31               ; Back to High Intensity or White on Blue
  76.    UNLOCKRECORD
  77. ENDWHILE
  78.  
  79. ; If we drop out of the above loop, user must have pressed a key
  80.  
  81.   x = GETCHAR()                     ; Gobble up the keystroke
  82.   DO_IT!                            ; Update the table!
  83.   CLEARALL                          ; Clear the workspace
  84.   DoneFeed()                        ; Update Semaphor to tell world we're done
  85. ENDPROC ; DoFeed
  86.  
  87. ; TryToInitialize attempts to reinitialize fields in the PRICE table.
  88. ; If we are the first ones there, we perform the initialization by
  89. ; zeroing out the fields that will be generated by Rnd. If we aren't the
  90. ; first ones there, then someone else is already generating stock activity
  91. ; and we shouldn't reinitialize the table.
  92.  
  93. PROC TryToInitialize()
  94.   IF (NOT TestInitialize())         ; Can we perform an initialization?
  95.     THEN                            ; No, so
  96.       IF (TestWaitForInitialize())  ;   Do we need to wait for someone else to
  97.                                     ;     complete an initialization?
  98.         THEN                        ;   Yes, so
  99.           PutMessage(
  100.      "Session Initialization being performed by another user. Please wait...")
  101.           WHILE (TestWaitForInitialize())  ; keep checking
  102.             SLEEP 500                      ; after a short pause
  103.           ENDWHILE
  104.           ClearMessage()            ;   erase the message, since we can go on
  105.       ENDIF
  106.       RETURN                        ;   move on
  107.   ENDIF
  108.  
  109. ; If we get here, we must have to initialize the market
  110.  
  111.   PutMessage("Initializing Stock Transaction Session...")
  112.   WHILE (TRUE)                      ; wait for any query to finish
  113.     LOCK "Price" PWL                ;    since queries do a WL on table
  114.     IF (RETVAL) THEN QUITLOOP ENDIF
  115.     SLEEP 200
  116.   ENDWHILE
  117.   COEDIT "Price"                    ; get the table on workspace
  118.   SCAN                              ; and for each record,
  119.     [VOLUME] = 0                    ;   reset the daily volume
  120.     [High]   = [Price]              ;   Today's High price is equal to previous close
  121.     [Low]    = [Price]              ;   Today's Low price is equal to previous close
  122.     [Chg]    = 0                    ;   No change in price yet
  123.   ENDSCAN
  124.   DO_IT!                            ; And save the new table
  125.   UNLOCK "Price" PWL
  126.   DoneInitialize()                  ; Release the Initialization semaphor
  127.   ClearMessage()                    ; Erase the Init message
  128. ENDPROC
  129.  
  130. PROC ClearBackground(Attr,RestAttr,FirstLine,LastLine)
  131.   PRIVATE s,i
  132.   STYLE ATTRIBUTE Attr
  133.   s = SPACES(80)
  134.   FOR i FROM FirstLine TO LastLine
  135.     @ i,0 ?? s
  136.   ENDFOR
  137.   STYLE ATTRIBUTE RestAttr
  138. ENDPROC
  139.  
  140. PROC PutMessage(s)             ; define a message window ala Paradox
  141.   IF (IsColorMonitor)          ; are we on a color monitor?
  142.     THEN STYLE ATTRIBUTE 116   ; yes, so use red on light grey
  143.     ELSE STYLE REVERSE         ; no, everyone else gets inverse
  144.   ENDIF
  145.   @ 24,80 - LEN(s) ?? s        ; display s in MESSAGE window
  146.   STYLE ATTRIBUTE 31           ; return style to normal
  147. ENDPROC
  148.  
  149. PROC ClearMessage()            ; clear the message window we defined
  150.   ClearBackground(31,31,24,24)
  151. ENDPROC
  152.  
  153. PROC StartUp()                 ; Get the feed started
  154.   RESET                        ; Start with a known system state
  155.   curline = ""
  156.   FirstStockRow = 8            ; where will start displaying stock info?
  157.   LastStockRow = 20            ; and where will end disply of stock info?
  158.   LeftMargin = 6
  159.   CURSOR OFF                   ; don't need the cursor to display info
  160.   IsColorMonitor = (MONITOR()="Color")  ; find out what kind of monitor we're on
  161.   ClearBackground(31,31,0,24)  ; and initialize the screen to blank
  162.   TryToInitialize()            ; see if we need to initialize Price table
  163.   @ FirstStockRow-2,LeftMargin ; finally, display headings for stock listings
  164.   ?? "           " +
  165.      FORMAT("W6,AL,","Symbol")+
  166.      FORMAT("W11,AR","Price")+
  167.      FORMAT("W14,AC","Volume")+
  168.      FORMAT("W15,AC","Time")+
  169.      FORMAT("W9,AR","Change")
  170. ENDPROC
  171.  
  172. PROC TestInitialize()
  173.   LOCK "Semaphor" WL, "Semaphor" PWL
  174.   RETURN retval
  175. ENDPROC
  176.  
  177. PROC TestWaitForInitialize()
  178.   LOCK "Semaphor" WL
  179.   RETURN NOT retval
  180. ENDPROC
  181.  
  182. PROC DoneInitialize()
  183.   UNLOCK "Semaphor" PWL
  184. ENDPROC
  185.  
  186. PROC DoneFeed()
  187.   UNLOCK "Semaphor" WL
  188. ENDPROC
  189.