• The CompuBBS Code - November 2020 (2/3)

    From Aryavartan Riekh@21:1/5 to All on Tue Nov 10 10:23:41 2020
    [continued from previous message]

    virtual as in cyber and a database of the nth dimension as in matrix.
    So the cybermatrix is a network of databases of a given
    dimension(matricees) with a larger databases of the nth
    dimension(matrix). So, let's do this.

    God bless and God speed for Jesus Christ is God. Always a pleasure.
    Good luck to you all. I want you to win. Allahu Akhbar! ----------------------------------------------------------------------------- Josh Greene's Island ECN day trading code in Python between horizontal
    rule ----------------------------------------------------------------------------- SET TALK OFF SET CURSOR OFF SET SAFETY OFF SET MEMOWIDTH TO 80 CLEAR ALL
    CLOSE ALL CLEAR CLEAR MACRO && Get rid of F keys typing commands SET
    HELP OFF && Needed to clear out F1 key too

    =rand(-1)

    #define COREDEST "FFFFFFFF0673"

    gstoredflag = .F. && Are there any messages buffered that could be
    flushed?

    #define VERSION "2.40"

    malertfile = "M:\logs\island2.err" mholdofffile =
    "M:\island2\holdoff.txt"

    blanknbuffer="R"+replicate( " " , 200 ) && get BRIGADEN message here

    #define CORELINELEN 124 define COREMESSAGELEN 122

    #define READPORT "067F"

    load int99

    define window title from 0,0 to 0,scols()-1 COLOR "W/B" NONE define
    window output from 1,0 to 10,scols()-1 NONE COLOR "W+/N" define window
    ticker from 12,0 to srows()-1,scols()-1 NONE define window status from
    11,0 to 11,scols()-1 COLOR "W+/R" NONE

    do title do initstatus

    activate window title activate window status

    activate window output activate window ticker


    s = fopen( "ISLAND2.TXT" )

    if s <= 0 wait window "COULD NOT FIND ISLAND2.TXT IN CURRENT DIR. RUN
    RESET." quit
    endif

    x = fgets( s )

    if "ISLAND2" # x wait window "ACCOUNT IN ISLAND2.TXT DOES NOT MATCH
    ACCOUNT ENV VAR. RUN RESET." =fclose( s ) quit
    endif

    tcount = 0 && For counting random stuff

    tseq = val( fgets( s ) ) && Next order number tmatch = val( fgets( s ) )
    && Next match number tnextdead = val( fgets( s ) ) && Next dead order (zero=none) =fclose( s )

    select select(1) use events set order to WHEN

    tnow = 0

    ttoolate = 0 && Count the too late to cancel events

    gaccept = .F. && Let any orders in? Set by SOD, cleared by EOD
    gactaccept = .F. && Let ACT orders in? Set by SOD, cleared by EOA

    geom = .F. && Have we gotten EOM yet?

    gprinting = .F. && Print incoming messages?

    go top

    if eof("EVENTS")

    tnext = 99999.999

    else

    tnext = WHEN && Time of next event

    endif

    select 0 use sources set order to SOURCE

    select select(1) use island

    gsx = alltrim( str( date() - {2/6/1996} ) )

    gsession = left( "0000000000" , 9-len( gsx ) ) + gsx + "F"

    s="N"+gsession+"5050" && Open the islandfile for writing Mold on port
    5050 call int99 with s

    if s # "n" && Valid open file?

    do alert with "InitMold filed with reason >"+s

    do case

    case s = "i"

    sm ="Error opening files in deney-write mode"

    case s = "j"

    sm = "a file had a partial line fragment"

    case s = "k"

    sm = "not all trailing files are empty"

    case s = "l"

    sm = "all files full"

    otherwise

    sm = "Unknown error"

    endcase

    do alert with sm

    wait window "Error on ISLAND.OUT or ISLAND2.OUT OPEN:"+s

    quit

    endif

    select island

    tecount = 0 && Assume worst case, just to make sure ecount is high
    enough txcount = 0 && Cancels

    x = "L"+READPORT+" " && Read Island2 requests call int99 with x if x #
    "l"
    do alert with "Could not open Command listen!" endif


    gstatdelay = 0.25 do showstatus gnextstats = seconds() + gstatdelay

    gmolddelay = 1 && Time between mold heartbeats gmoldheart = seconds() + gmolddelay && Time to send a MOLD heartbeat by doing a FLUSH

    gmessages = 0 && Number of messages written to the stream gpackets = 0
    && Number of packets writtento the stream

    mdone = .F.

    do while !mdone

    tnow = seconds()

    do while tnow >= tnext

    if !EVENTS.PROCESSED

    do swrite with "G" , EVENTS.CODE

    select EVENTS replace PROCESSED with .T. select
    ISLAND

    else

    ? time()+" Event bypassed:"+ EVENTS.CODE

    endif

    do seteventflags with EVENTS.CODE

    skip 1 in EVENTS

    if eof("EVENTS")

    tnext = 99999.999

    else

    tnext = EVENTS.WHEN

    endif

    enddo

    nbuffer = blanknbuffer

    call int99 with nbuffer

    if nbuffer = "r"

    tlenstr = substr( nbuffer , 2 , 5 )

    tlen = val( tlenstr )

    tmessage = substr( nbuffer , 43 , tlen )

    if gprinting ? time()+" >"+tmessage+"<" endif

    if tmessage = "P" && PING REQUEST

    tsource = substr( nbuffer ,11 , 8)

    do pingreply with tsource , tmessage

    else

    do processtcpip with tmessage

    endif

    else && No pending commands...

    if gstoredflag

    do flush

    gstoredflag = .F.

    gmoldheart = seconds() + gmolddelay

    gpackets = gpackets + 1

    else

    if gmoldheart < seconds()

    do flush

    gmoldheart = seconds() + gmolddelay

    endif

    endif

    endif

    if gnextstats <= seconds()

    do showstatus gnextstats = seconds() + gstatdelay

    endif

    lastkey=inkey()

    if lastkey # 0

    activate window output

    do case case lastkey = asc("~") ? time()+" Quitting..."
    mdone = .T.

    case lastkey = asc("@") ? time()+" Copying to
    island2.dbf" set order to copy to
    m:\island2\island2 ?? "Done"

    case lastkey = asc("#") ? time()+"
    Suspending..." suspend

    case lastkey = asc("!")

    ? time()+"
    ACCEPT="+iif(gaccept,"T","F")+" ACT="+
    iif(gactaccept,"T","F") + "
    EOM="+iif(geom,"T","F")+"
    NEXT="+str(tnext,9,3)+ "
    TOO-LATE="+str(ttoolate,6,0)+"
    COUNT="+str(tcount,9,0)

    s = "T"+space(60) call int99 with s

    if s = "t"

    tbuffered = val( substr(s,26,5)
    )

    ? "MOLD INFO:
    SESSION="+substr(s,2,10)+"
    SEQ="+substr(s,12,10)+"
    SOCKET="+substr(s,22,4)+"
    BUFFERED="+str(tbuffered,5,0)

    else

    ? "Could not get mold info!"

    tbuffered = 0

    endif


    if gpackets > 0

    ?
    "MESSAGES:"+str(gmessages-tbuffered,
    12,0)+"
    PACKETS:"+str(gpackets,12,0)+"
    ("+str( (gmessages-tbuffered)/
    gpackets , 5 , 3 )+")"

    gmessages = tbuffered gpackets
    =0

    endif

    case lastkey = asc("%") ? time()+" Shutdown
    attempt..." do shutdown

    case lastkey = asc("(") ? time()+" toggled
    gaccept" gaccept = !gaccept

    case lastkey = asc("?") ? "@-Copy to island2.DBF
    ~-Quit !-Status #-Suspend %-ShutDown
    $-Print incoming"

    case lastkey = asc("$")

    if gprinting

    ? time()+" Printing off"
    gprinting = .F.
    else

    ? time()+" Printing on"
    gprinting = .T.

    endif


    endcase

    activate window ticker

    endif

    enddo && Main Loop

    activate window output

    && Final flush to mak sure everything is sent

    do flush

    && Close file

    s = "C" call int99 with s

    x = "H"+READPORT call int99 with x if x # "h" do alert with "Could not
    close PingPort!"
    endif

    use && Unuse Island

    && Create fresh waypoint file

    f = fcreate("ISLAND2.TXT")

    if f<=0 ? "Could not create ISLAND.TXT!" suspend endif

    =fputs( f , "ISLAND2" ) && ROLE

    =fputs( f , str( tseq , 9 , 0 ) ) && Order number =fputs( f , str(
    tmatch , 9 , 0 ) ) && Match number =fputs( f , str( tnextdead , 9 , 0 )
    ) && Next dead order pointer =fclose(f)

    quit


    procedure title activate window title SAME clear @ 0,0 SAY " Island2 ú
    Version "+VERSION+" (c)1996 Joshua Levine ú Press [?] for help"
    activate window ticker SAME
    return

    proc werror param wcode

    do case

    case wcode = "w"

    return "Error on file write"

    case wcode = "s"

    return "Error on nework send"

    case wcode = "c"

    return "Invalid message length"

    case wcode = "d"

    return "all files full"

    endcase

    return "Unknown error"




    **** write actualy writes a string the the file, steam, and screen

    proc write parameter wstring

    wl = len( wstring )

    ws="W"+chr(wl)+wstring

    call int99 with ws

    gmessages = gmessages + 1

    if ws = 'b'

    gstoredflag = .T.

    else

    if ws = "f"

    gpackets = gpackets + 1

    gstoredflag = .F.

    else

    activate window output

    ? time() +" !!!! ERROR ON WRITE!!!!!!"

    ? ws

    do alert with "Erorr on write:"+werror(ws)

    activate window ticker

    suspend

    endif

    endif

    return



    *** Write a message

    **** ACTIONS: **** A - Accept the order was accepted into Island **** B
    - Booked this order hit the book **** E - Execute the order was executed
    for this many shares at this price **** X - Cancel this many shares were canceled **** C - Break this order was executed, now broken **** G -
    Control stock is the control type **** R - Report trade done away but
    will report/clear through Island

    **** ON Cancel CONTRA = Reason for cancel


    ***** MINDICATE = on accept always "D" (legacy) ***** on execute "A"=
    added liquidity, "R"=Removed liquidity ***** on report "Y" trade report,
    "N" don't report, "S" step-out

    ****** mmatch = on accept or book is MINIMUM shares, in execution is
    match number ****** not defined on cancels, but 0 for now

    proc mwrite

    parameter
    maction,mseq,mshares,mprice,mcontra,mindicate,mmatch,mlocate

    mwhen = str( tnow , 9 , 3)

    w = left( mwhen , 5 ) + "," +maction+","+str(mseq,9,0)+","+PORT+","+USER+","+TOKEN+","+BUY_SELL+"," +str(mshares,9,0)+","+str(mmatch,9,0)+","+STOCK+","+str(mprice,11,4)+","
    +str(mlocate,8,0)+ ", 0,"+SHORT+","+MMID+","+PA+","+mcontra+","+mindicate+","+DISPLAY+"," +right(mwhen,3)+","+CLEARING+",D"

    do write with w

    return

    ****** Swrite writes a status message that doesnot concern an order,
    Like G-Good morning

    proc swrite

    param maction , mcode

    mwhen = str( tnow , 9 , 3)

    xcode = left( padr( mcode , 3) , 3 )

    w = left( mwhen , 5 ) +","+maction+","+" 0"+", , , , , 0,
    0,*"+xcode+" , 0.0000,00000000, 0, , , , , , ,"+right( mwhen , 3
    )+", , "

    do write with w

    return

    ****** Enter order adds the audit, tries for a match, and if it don't
    work, books it. ****** Enter order assumes ostock and obuy_sell are the
    right length. ****** Also assumes that buy_sell has aready been checked
    to be B or S. ****** Also assumes that the token is no already used

    proc enter2order

    parameter

    oport,ouser,otoken,obuy_sell,oshares,ostock,oprice,otif,oshort,ommid, opa,odisplay,omin,oclearing,oflags


    if odisplay = "P"

    obasefirm = ouser

    else

    obasefirm = "####"

    endif

    && Get the working record

    if tnextdead > 0

    tlocate = tnextdead goto tnextdead tnextdead = SEQ

    else

    insert into ISLAND (LEAVES) values (0) && Keep it out of
    the indexes for now tlocate = recno()

    endif

    tseq = tseq + 1

    awhen = str( tnow , 9 , 3)

    oleaves = oshares

    ofilled = 0

    aflag = .f. && have we written the "A" message yet?

    if obuy_sell = "B" && Buy order...

    set order to SSEEK

    do case

    case omin > 1 && Minimum quantity specified?

    *** if the min is bigger than the size,
    set it to the size

    if omin > oshares

    mmin = oshares

    else

    mmin = omin

    endif

    *** First prescan to see if we have
    enough size to fill it

    if seek( ostock )

    scan while mmin > 0 .and. ostock
    = STOCK .and. BUY_SELL = "S"
    .and. oprice >= PRICE

    mmin = mmin - LEAVES

    endscan

    endif

    if mmin <= 0

    *** There were at least enough
    to fill the minimum quantity

    mmax = oshares

    else

    *** Not enough to fill the min,
    so fill none

    mmax = 0

    endif

    case odisplay = "R" .or. odisplay = "P" && Is
    this a round-lot only order?

    mmax = 0

    *** Prescan to find the number of a
    shares available

    if seek( ostock )

    scan while mmax <= oshares .and.
    ostock = STOCK .and. BUY_SELL =
    "S" .and. oprice >= PRICE .and.
    obasefirm # MMID

    mmax = mmax + LEAVES

    endscan

    endif

    if mmax >= oshares

    *** Max out with the number of
    shares specified

    mmax = oshares

    endif

    *** Round down to nearest round lot
    wihtout using floating point

    mmax = val( substr( str( mmax , 6, 0 ) ,
    1 ,4 ) + "00" )


    otherwise

    mmax = oshares

    endcase

    do while mmax > 0 .and. seek( ostock ) .and. oprice >=
    PRICE

    if !aflag

    w = left( awhen , 5 ) +",A,"
    +str(tseq,9,0) +"," +oport+"," +ouser
    +"," +otoken +"," +obuy_sell +", "
    +str(oshares,6,0) +", " +str(omin,6,0)
    +"," +ostock +"," +str(oprice,11,4) +","
    +str(tlocate,8,0) +"," +str(otif,5,0)
    +"," +oshort +"," +ommid +","
    +opa+","+oflags+", ," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    do write with w

    aflag = .T.

    endif

    tecount = tecount + 1

    eshares = min( LEAVES , mmax )

    oleaves = oleaves - eshares

    mmax = mmax - eshares

    ofilled = ofilled + eshares

    tmatch = tmatch + 1

    w = left( awhen , 5 ) +",E," +str( SEQ ,9,0)
    +"," +PORT +"," +USER +"," +TOKEN +"," +BUY_SELL
    +", " +str(eshares,6,0) +"," +str(tmatch,9,0)
    +"," +ostock +"," +str(PRICE,11,4) +"," +str(
    recno() ,8,0)+ ", 0," +SHORT +"," +MMID +","
    +PA+"," +ommid+",A," +DISPLAY +","
    +right(awhen,3) +"," +CLEARING+",D"

    do write with w

    w = left( awhen , 5 ) +",E," +str(tseq,9,0) +","
    +oport+"," +ouser +"," +otoken +"," +obuy_sell
    +", " +str(eshares,6,0) +"," +str(tmatch,9,0)
    +"," +ostock +"," +str(PRICE,11,4) +","
    +str(tlocate,8,0)+", 0," +oshort +"," +ommid
    +"," +opa+","+MMID+",R," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    do write with w


    dleaves = LEAVES - eshares

    if dleaves <= 0 && Dead record?

    replace LEAVES with 0 , SEQ with
    tnextdead tnextdead = recno()

    else

    replace LEAVES with dleaves , FILLED
    with FILLED + eshares

    endif

    enddo

    else && sell order..

    set order to BSEEK

    do case

    case omin > 1 && Minimum quantity specified?

    *** if the min is bigger than the size,
    set it to the size

    if omin > oshares

    mmin = oshares

    else

    mmin = omin

    endif

    *** First prescan to see if we have
    enough size to fill it

    if seek( ostock )

    scan while mmin > 0 .and. ostock
    = STOCK .and. BUY_SELL = "B"
    .and. oprice <= PRICE

    mmin = mmin - LEAVES

    endscan

    endif

    if mmin <= 0

    mmax = oshares

    else

    mmax = 0

    endif

    case odisplay = "R" .or. odisplay = "P" && Is
    this a round-lot only order?

    mmax = 0

    *** Prescan to find the number of a
    shares available

    if seek( ostock )

    scan while mmax <= oshares .and.
    ostock = STOCK .and. BUY_SELL =
    "B" .and. oprice <= PRICE .and.
    obasefirm # MMID

    mmax = mmax + LEAVES

    endscan

    endif

    if mmax >= oshares

    mmax = oshares

    endif

    *** Round down to nearest round lot
    wihtout using floating point

    mmax = val( substr( str( mmax , 6, 0 ) ,
    1 ,4 ) + "00" )


    otherwise

    mmax = oshares

    endcase

    do while mmax > 0 .and. seek( ostock ) .and. oprice <=
    PRICE

    if !aflag

    w = left( awhen , 5 ) +",A,"
    +str(tseq,9,0) +"," +oport+"," +ouser
    +"," +otoken +"," +obuy_sell +", "
    +str(oshares,6,0) +", " +str(omin,6,0)
    +"," +ostock +"," +str(oprice,11,4) +","
    +str(tlocate,8,0) +","+str(otif,5,0)
    +"," +oshort +"," +ommid +","
    +opa+","+oflags+", ," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    do write with w

    aflag = .T.

    endif

    tecount = tecount + 1

    eshares = min( LEAVES , mmax )

    oleaves = oleaves - eshares

    mmax = mmax - eshares

    ofilled = ofilled + eshares

    tmatch = tmatch + 1

    w = left( awhen , 5 ) +",E," +str( SEQ ,9,0)
    +"," +PORT +"," +USER +"," +TOKEN +"," +BUY_SELL
    +", " +str(eshares,6,0) +"," +str(tmatch,9,0)
    +"," +ostock +"," +str(PRICE,11,4) +"," +str(
    recno() ,8,0) +", 0," +SHORT +"," +MMID +","
    +PA+"," +ommid+",A," +DISPLAY +","
    +right(awhen,3) +"," +CLEARING+",D"

    do write with w

    w = left( awhen , 5 ) +",E," +str(tseq,9,0) +","
    +oport+"," +ouser +"," +otoken +"," +obuy_sell
    +", " +str(eshares,6,0) +"," +str(tmatch,9,0)
    +"," +ostock +"," +str(PRICE,11,4) +","
    +str(tlocate,8,0) +", 0," +oshort +"," +ommid
    +"," +opa+","+MMID+",R," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    do write with w

    dleaves = LEAVES - eshares

    if dleaves <= 0 && Dead record?

    replace LEAVES with 0 , SEQ with
    tnextdead tnextdead = recno()

    else

    replace LEAVES with dleaves , FILLED
    with FILLED + eshares

    endif

    enddo

    endif

    if oleaves > 0 && any non-executed shares left?

    if otif = 0 && Fill or kill, so cancel leaves

    if !aflag && did we not make an A message yet?

    w = left( awhen , 5 ) +",A,"
    +str(tseq,9,0) +"," +oport+"," +ouser
    +"," +otoken +"," +obuy_sell +", "
    +str(oshares,6,0) +", " +str(omin,6,0)
    +"," +ostock +"," +str(oprice,11,4) +","
    +str(tlocate,8,0)+ "," +str(otif,5,0)
    +"," +oshort +"," +ommid +","
    +opa+","+oflags+", ," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D" do
    write with w

    endif

    w = left( awhen , 5 ) +",X," +str(tseq,9,0) +","
    +oport+"," +ouser +"," +otoken +"," +obuy_sell
    +", " +str(oleaves,6,0) +", 0," +ostock +","
    +str(oprice,11,4) +"," +str(tlocate,8,0)+ ", 0,"
    +oshort +"," +ommid +"," +opa+",#IOC, ,"
    +odisplay +"," +right(awhen,3) +","
    +oclearing+",D" do write with w

    oleaves = 0

    else

    if !aflag && did we not make an A message yet?

    w = left( awhen , 5 ) +",A,"
    +str(tseq,9,0) +"," +oport+"," +ouser
    +"," +otoken +"," +obuy_sell +", "
    +str(oshares,6,0) +", " +str(omin,6,0)
    +"," +ostock +"," +str(oprice,11,4) +","
    +str(tlocate,8,0) +"," +str(otif,5,0)
    +"," +oshort +"," +ommid +","
    +opa+","+oflags+",B," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    else

    w = left( awhen , 5 ) +",B,"
    +str(tseq,9,0) +"," +oport+"," +ouser
    +"," +otoken +"," +obuy_sell +", "
    +str(oleaves,6,0) +", 0," +ostock +","
    +str(oprice,11,4) +"," +str(tlocate,8,0)
    +"," +str(otif,5,0) +"," +oshort +","
    +ommid +"," +opa+", , ," +odisplay +","
    +right(awhen,3) +"," +oclearing+",D"

    endif

    do write with w

    endif && otif == 0

    endif && oleaves > 0

    if oleaves > 0 && Still open?

    goto tlocate

    replace ; PORT with oport,; USER with ouser,; TOKEN with
    otoken,; BUY_SELL with obuy_sell,; LEAVES with
    oleaves,; STOCK with ostock,; PRICE with
    oprice,; SHORT with oshort,; MMID with ommid,;
    PA with opa,; DISPLAY with odisplay,; CLEARING
    with oclearing,; FILLED with ofilled,; SEQ with
    tseq

    else && leaves = 0 (add current order to deadlist)

    goto tlocate replace SEQ with tnextdead tnextdead =
    recno()

    endif && oleaves > 0

    return

    ****** Enter Report adds a type R line to the file ****** Enter order
    assumes ostock and obuy_sell are the right length.

    proc enter2report

    parameter

    oport,ouser,otoken,obuy_sell,oshares,ostock,oprice,oshort,ommid,opa,oreport,oclearing,ocontra

    tseq = tseq + 1

    tmatch = tmatch + 1

    mwhen = str( tnow , 9 , 3)

    w = left( mwhen , 5 ) + ",R,"+str(tseq,9,0) +"," +oPORT+","
    +oUSER+"," +oTOKEN+"," +oBUY_SELL +",
    "+str(oshares,6,0)+","+str(tmatch,9,0)+","
    +oSTOCK+","+str(oprice,11,4)+",00000000,

    0,"+oSHORT+","+oMMID+","+oPA+","+ocontra+","+oreport+",R,"+right(mwhen, 3)+","+oCLEARING+",D"

    do write with w

    return


    ****** Enter Reject adds a type J line to the file

    proc enter2reject

    parameter oport,ouser,otoken,otype,oreason

    tseq = tseq + 1

    *** Leaves MUST be 0 or it might be included in the match!

    mwhen = str( tnow , 9 , 3)

    w = left( mwhen , 5 ) + ",J," +str(tseq,9,0) +"," +oport+","
    +ouser +"," +otoken+"," +otype+", 0, 0, , 0.0000,00000000, 0, ,
    , , ," +oreason +",N,"+right(mwhen,3)+", ,D"

    do write with w

    return


    ****** Enter break adds a type C line to the file

    proc enterbreak

    parameter oseq, oport , ouser, otoken, obuy_sell, oshares,
    omatch, ostock, oprice, ommid, oreason, omisc, oclearing ,
    oshort

    if oseq > tseq .or. oseq < 1

    ? time()+" Bad SEQ in Break! OSEQ="+str(oseq,9,0)+"
    RECS="+str( tseq, 9,0)

    return

    endif

    if oshares <= 0

    ? time()+" Jerk boy BREAK zero shares
    SEQ="+str(oseq,9,0)

    return

    endif

    if oprice <= 0

    ? time()+" Jerk boy BREAK zero price SEQ="+str(oseq,9,0)

    return

    endif

    if ! omisc $ "AR"

    ? time()+" Invalid A/R BREAK MISC="+omisc+"
    SEQ="+str(oseq,9,0)

    return

    endif

    mwhen = str( tnow , 9 , 3)

    w = left( mwhen , 5 ) + ",C,"+str(oseq,9,0) +"," +oPORT+","
    +oUSER+"," +oTOKEN+"," +oBUY_SELL +",
    "+str(oshares,6,0)+","+str(omatch,9,0)+","
    +oSTOCK+","+str(oprice,11,4)+",00000000, 0,"+oshort+","+oMMID+",
    ,"+oreason +","+omisc+", ,"+right(mwhen,3)+","+oCLEARING+",D"

    do write with w

    return


    ****** Enter maint adds a type M line to the file


    *** SHORTTYPE ***** N - No short sale checks ***** B - Bidtick test
    ***** L - Lasttrade test

    *** BLOCKSUB - Block subscriber only orders? ***** B - Block ***** N -
    No block

    *** CENTER ***** Q - NASDAQ ***** L - LISTED

    proc entermaint

    parameter
    oport,ouser,otoken,ostock,oshorttype,oblocksub,ocenter,omisc

    if ! oshorttype $ "NBL"

    ? time()+" Bad SHORTTYPE="+oshorttype+" STOCK="+ostock

    return

    endif

    if !oblocksub $ "BN" ? time()+" Bad BLOCKSUB="+oblocksub+"
    STOCK="+ostock

    return endif

    if !ocenter $ "QL" ? time()+" Bad CENTER="+ocenter+"
    STOCK="+ostock

    return endif

    if len( omisc ) # 4 ? time()+" Bad omisc len!"+omisc return
    endif

    for eml = 1 to 4

    emb = substr( omisc , eml , 1 )

    if !isalpha( emb ) .and. emb # " "

    ? time()+" Bad omisc letter!"+omisc return

    endif

    endfor

    awhen = str( tnow , 9 , 3 )

    w = left( awhen , 5 ) +",M, 0,"+oport+","+ouser+","+otoken+",S,
    0, 0," +ostock +", 0.0000,00000000, 0,"+oshorttype+", ,
    ,"+omisc+","+ocenter+","+oblocksub+"," +right(awhen,3) +", , "

    do write with w

    return

    *** STATE - Trading state ***** T - Trading ***** H - Halted

    proc enterstate

    parameter oport,ouser,otoken,ostock,ostate


    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)