• The CompuBBS code (3/4)

    From SPP@21:1/5 to All on Mon Jul 26 22:49:45 2021
    [continued from previous message]

    +"," +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

    if !ostate $ "TH" ? time()+" Bad STATE="+ostate+" STOCK="+ostock

    return endif

    awhen = str( tnow , 9 , 3 )

    w = left( awhen , 5 ) +",M, 0,"+oport+","+ouser+","+otoken+",T,
    0, 0," +ostock +", 0.0000,00000000, 0, , , , ,"+ostate+", ,"
    +right(awhen,3) +", , "

    do write with w

    return

    *** Enter account configures an OUCH account

    proc enteraccount

    parameter oaccount,opassword,otest,otrusted, othresh,
    osscheck,oiflag, odefault

    if !otest$"TN"

    ? time()+" Bad TEST flag in enteraccount:"+otest return

    endif

    if !otrusted$"TN"

    ? time()+" Bad TRUSTED flag in enteraccount:"+otrusted
    return

    endif

    if !osscheck$"YN"

    ? time()+" Bad SSCHECK flag in enteraccount:"+osscheck
    return

    endif

    if !oiflag$"IN"

    ? time()+" Bad IFLAG flag in enteraccount:"+oiflag
    return

    endif

    if len( opassword ) # 10 ? time()+" Bad opassword
    len!"+opassword return
    endif

    for eml = 1 to 10

    emb = substr( opassword , eml , 1 )

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

    ? time()+" Bad opassword
    letter!"+opassword+":"+str(eml) return

    endif

    endfor


    if len( oaccount ) # 6 ? time()+" Bad oaccount len!"+oaccount
    return
    endif

    for eml = 1 to 6

    emb = substr( oaccount , eml , 1 )

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

    ? time()+" Bad oaccount
    letter!"+oaccount+":"+str(eml) return

    endif

    endfor

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

    for eml = 1 to 4

    emb = substr( odefault , eml , 1 )

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

    ? time()+" Bad odefault letter!"+odefault
    +":"+str(eml) return

    endif

    endfor

    awhen = str( tnow , 9 , 3 )

    w = left( awhen , 5 ) +",M, 0,"+oaccount+",
    ,"+opassword+",A,"+str(othresh,9,0)+", 0, , 0.0000,00000000,
    0,"+osscheck+","+odefault +", ,"+otest+ " "+ otrusted +"
    ,"+oiflag+", ," +right(awhen,3) +", , "

    do write with w

    return


    *** Enter firm configures an OUCH account for clearing

    proc enterfirm

    parameter oaccount,ommid,oclearing

    if !oclearing$"AIQRN"

    ? time()+" Bad clearing in enterfirm:"+oclearing return

    endif

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

    for eml = 1 to 4

    emb = substr( ommid , eml , 1 )

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

    ? time()+" Bad ommid letter!"+ommid+":"+str(eml)
    return

    endif

    endfor

    if len( oaccount ) # 6 ? time()+" Bad oaccount len!"+oaccount
    return
    endif

    for eml = 1 to 6

    emb = substr( oaccount , eml , 1 )

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

    ? time()+" Bad oaccount
    letter!"+oaccount+":"+str(eml) return

    endif

    endfor


    awhen = str( tnow , 9 , 3 )

    w = left( awhen , 5 ) +",M, 0,"+oaccount+", , ,F, 0, 0, ,
    0.0000,00000000, 0, ,"+ ommid +", , , , ," +right(awhen,3)
    +","+oclearing+", "

    do write with w

    return

    proc new2cancel

    parameter olocate,oseq,oshares,ocontra && Contra indeicates
    reason for cancel

    if olocate <= 0 .or. olocate > reccount()

    ? time()+" CANCEL LOCATE OUT OF BOUNDS " +str( olocate ,
    8 , 0)+ " SEQ=" +str(oseq,8,0)

    return 0

    endif

    goto olocate

    if oseq # SEQ

    *** ? time()+" CANCEL OUT OF DATE " +str( olocate , 8 , 0)+ " SEQ=" +str(oseq,8,0)

    ttoolate = ttoolate + 1

    return 0

    endif

    if LEAVES <= oshares

    ttoolate = ttoolate + 1

    return

    endif

    xshares = LEAVES - oshares

    do mwrite with "X", SEQ , xshares , PRICE , ocontra , " " , 0 ,
    recno()

    txcount = txcount + 1

    dleaves = LEAVES - xshares

    if dleaves <=0

    && Must set LEAVES to zero to pull order from indexes

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

    else

    replace LEAVES with dleaves

    endif

    return


    ****** Cancel Order takes a locator and a SEQ number ****** passed
    shares in new intedned order size ****** returns number of shares
    canceled and leaves record pointer on order canceled.

    proc i2cancel

    parameter olocate,oseq,oshares,ocontra && Contra indeicates
    reason for cancel


    if olocate <= 0 .or. olocate > reccount()

    ? time()+" CANCEL LOCATE OUT OF BOUNDS " +str( olocate ,
    8 , 0)+ " SEQ=" +str(oseq,8,0)

    return 0

    endif

    goto olocate

    if oseq # SEQ

    *** ? time()+" CANCEL OUT OF DATE " +str( olocate , 8 , 0)+ " SEQ=" +str(oseq,8,0)

    ttoolate = ttoolate + 1

    return 0

    endif

    msize = LEAVES + FILLED && Current size of order

    if oshares >= msize

    *** ? time()+" INTENEDED CANCEL BIGGER THAN ORDER SHARES="+str( oshares,
    6 , 0 )+" REASON="+ocontra

    return 0

    endif

    xshares = msize - oshares && HOwmany do we have to cancel to get
    from current size to new size?

    if xshares > LEAVES && Don't cancel more than are open

    xshares = LEAVES

    endif

    if xshares = 0

    ttoolate = ttoolate + 1

    return 0

    endif

    do mwrite with "X", SEQ , xshares , PRICE , ocontra , " " , 0 ,
    recno()

    txcount = txcount + 1

    dleaves = LEAVES - xshares

    if dleaves <=0

    && Must set LEAVES to zero to pull order from indexes

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

    else

    replace LEAVES with dleaves

    endif

    return xshares


    proc initstatus activate window status @ 0,1 SAY "Orders:" @ 0,27 SAY
    "Executions:" @ 0,52 SAY "Cancels:" activate window ticker
    return

    proc showstatus activate window status @ 0,11 SAY tseq PICTURE
    "##,###,###" @ 0,38 SAY tmatch PICTURE "##,###,###" @ 0,60 SAY
    txcount PICTURE "##,###,###" activate window ticker
    return

    proc processtcpip

    param ptm

    tcommand = substr( ptm , 1 , 1 )

    if geom

    ? time()+" Command recieved after EOM:"+tcommand return

    endif

    do case

    case tcommand = "H"

    tport = substr( ptm , 2 , 6 )

    if !seek( tport , "SOURCES" )

    insert into SOURCES values ( tport , 1 )

    endif

    tinseq = val(substr( ptm , 73, 9 ) )

    if tinseq # SOURCES.SEQ

    if tinseq < SOURCES.SEQ

    *** ? time()+" Duped inseq "+tport+" Expected:"+str( SOURCES.SEQ , 9,
    0)+" Got:"+str( tinseq , 9 , 0 )
    return

    endif

    do alert with "Gapped inseq "+tport+"
    Expected:"+str( SOURCES.SEQ , 9, 0)+"
    Got:"+str( tinseq , 9 , 0 )

    endif

    tuser = substr( ptm , 8 , 4 ) ttoken = substr(
    ptm , 12 , 10 ) tbuy_sell = substr( ptm , 22 , 1
    ) tshares = val( substr( ptm , 23 , 6 ) ) tmin =
    val( substr( ptm , 29 , 6 ) ) tstock = substr(
    ptm , 35 , 6 ) tprice = val( substr( ptm , 41 ,
    11 ) ) ttif = val( substr( ptm , 52 , 5 ) )
    tdisplay = substr( ptm , 57 , 1 ) tshort =
    substr( ptm , 58 , 1 ) tpa = substr( ptm , 59 ,
    1 ) tmmid = substr( ptm , 60 , 4 ) tclearing =
    substr( ptm , 64 , 1 ) tflags = substr( ptm , 65
    , 4 )

    if tbuy_sell = "B"

    xshort = " "

    else

    if tbuy_sell # "S"

    ? time()+" Bad buy_sell
    "+tbuy_sell+" port="+tport

    return

    endif

    do case case tshort = "Y" xshort = "S"

    case tshort = "S" xshort = "S"

    case tshort = "N" xshort = "L"

    case tshort = "L" xshort = "L"

    case tshort = "E" xshort = "E"

    otherwise xshort = "?"

    endcase

    endif

    if tshares <= 0

    ? time()+" Jerk boy zero shares TOKEN "
    +tport+"-" +tuser+"-" +ttoken

    return

    endif

    if tshares >= 1000000

    ? time()+" Jerk boy million shares TOKEN
    " +tport+"-" +tuser+"-" +ttoken

    return

    endif


    if tprice <= 0

    ? time()+" Jerk boy zero price TOKEN "
    +tport+"-" +tuser+"-" +ttoken

    return

    endif


    if tprice >= 1000000

    ? time()+" Jerk boy million price TOKEN
    " +tport+"-" +tuser+"-" +ttoken

    return

    endif


    if ! tclearing $ "AIQOR"

    ? time()+" Jerk boy strange clearing >"
    +tclearing+"< TOKEN " +tport+"-"
    +tuser+"-" +ttoken

    return

    endif


    if ! tdisplay $ "YNLRP"

    ? time()+" Jerk boy strange display >"
    +tdisplay+"< TOKEN " +tport+"-"
    +tuser+"-" +ttoken

    return

    endif

    if (tdisplay = "R" .or. tdisplay = "P" ) .and.
    ttif > 0

    ? time()+" Jerk boy R or P or Q display
    with nonzero tif >" +str(ttif,5,0)+"<
    TOKEN " +tport+"-"+tuser+"-"+ttoken

    return

    endif

    if !gaccept

    ? time()+" Trade ignored outside SOD-EOD
    time "+tport+"-" +tuser+"-" +ttoken

    return

    endif

    if tclearing = "A"

    if !gactaccept

    ? time()+" ACT trade ignored
    outside ACT time " +tport+"-"
    +tuser+"-" +ttoken

    return

    endif

    endif


    select SOURCES replace SEQ with tinseq + 1
    select ISLAND

    do enter2order with tport , tuser , ttoken ,
    tbuy_sell , tshares , tstock , tprice , ttif ,
    xshort , tmmid , tpa , tdisplay , tmin ,
    tclearing , tflags

    case tcommand = "L"

    tolocate = val( substr( ptm , 2 , 8 ) ) toseq =
    val( substr( ptm , 10 , 9 ) ) tshares = val(
    substr( ptm , 19 , 6 ) ) treason = substr( ptm ,
    25 , 1 )

    do case case treason = "A" xreason = "#USR" case
    treason = "B"
    xreason = "#TME" case treason =
    "C"
    xreason = "#HLT" case treason =
    "D"
    xreason = "#SUP" case treason =
    "E"
    xreason = "#DNT" case treason =
    "F"
    xreason = "#MBL"

    otherwise xreason = "#USR" endcase

    do new2cancel with tolocate , toseq , tshares ,
    xreason

    case tcommand = "I"

    tport = substr( ptm , 2 , 6 )


    if !seek( tport , "SOURCES" )

    insert into SOURCES values ( tport , 1 )

    endif

    tinseq = val( substr( ptm , 24 , 9 ) )

    if tinseq # SOURCES.SEQ

    if tinseq < SOURCES.SEQ

    *** ? time()+" Duped REJ inseq "+tport+" Expected:"+str( SOURCES.SEQ ,
    9, 0)+" Got:"+str( tinseq , 9 ,
    0 ) return

    endif

    do alert with "Gapped REJ inseq
    "+tport+" Expected:"+str( SOURCES.SEQ ,
    9, 0)+" Got:"+str( tinseq , 9 , 0 )

    endif


    tuser = substr( ptm , 8 , 4 ) ttoken = substr(
    ptm , 12 , 10 ) ttype = substr( ptm , 22 , 1 )
    treason = substr( ptm , 23 , 1 )

    do enter2reject with tport , tuser , ttoken ,
    ttype , treason

    select SOURCES replace SEQ with tinseq + 1
    select ISLAND

    case tcommand = "Z"

    tolocate = val( substr( ptm , 2 , 8 ) ) toseq =
    val( substr( ptm , 10 , 9 ) ) tshares = val(
    substr( ptm , 19 , 6 ) ) treason = substr( ptm ,
    25 , 1 )

    do case case treason = "A" xreason = "#USR" case
    treason = "B"
    xreason = "#TME" case treason =
    "C"
    xreason = "#HLT" case treason =
    "D"
    xreason = "#SUP" case treason =
    "E"
    xreason = "#DNT" case treason =
    "F"
    xreason = "#MBL"

    otherwise xreason = "#USR" endcase


    =i2cancel( tolocate , toseq , tshares , xreason
    )

    case tcommand = "S"

    tport = substr( ptm , 2 , 6 )

    if !seek( tport , "SOURCES" )

    insert into SOURCES values ( tport , 1 )

    endif

    tinseq = val(substr( ptm , 58 , 9 ) )

    if tinseq # SOURCES.SEQ

    if tinseq < SOURCES.SEQ

    *** ? time()+" Duped REP inseq "+tport+" Expected:"+str( SOURCES.SEQ ,
    9, 0)+" Got:"+str( tinseq , 9 ,
    0 ) return

    endif

    do alert with "Gapped REP inseq
    "+tport+" Expected:"+str( SOURCES.SEQ ,
    9, 0)+" Got:"+str( tinseq , 9 , 0 )

    endif

    tuser = substr( ptm , 8 , 4 ) ttoken = substr(
    ptm , 12 , 10 ) tbuy_sell = substr( ptm , 22 , 1
    ) tshares = val( substr( ptm , 23 , 6 ) ) tstock
    = substr( ptm , 29 , 6 ) tprice = val( substr(
    ptm , 35 , 11 ) ) treport = substr( ptm , 46 , 1
    ) tshort = substr( ptm , 47 , 1 ) tpa = substr(
    ptm , 48 , 1 ) tmmid = substr( ptm , 49 , 4 )
    tclearing = substr( ptm , 53 , 1 ) tcontra =
    substr( ptm , 54 , 4 )


    if ! treport $ "YNS" ? time()+" Jerk boy REPORT
    code TOKEN " +tport

    return

    endif


    if tshares <= 0

    ? time()+" Jerk boy REPORT zero shares
    TOKEN "+tport+"-"+tuser+"-"+ttoken

    return

    endif


    if tshares >= 1000000

    ? "Jerk boy REPORT million shares TOKEN
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif


    if tprice <= 0

    ? "Jerk boy REPORT zero price TOKEN
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif

    if tprice >= 1000000

    ? "Jerk boy REPORT million price TOKEN
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif


    if ! tclearing $ "ABSIQORN"

    ? "Jerk boy REPORT strange clearing
    >"+tclearing+"< TOKEN
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif

    if !gaccept

    ? "Report ignored outside SOD-EOD time
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif

    if tclearing = "A"

    if !gactaccept

    ? "ACT trade REPORT ignored
    outside ACT time
    "+tport+"-"+tuser+"-"+ttoken

    return

    endif

    endif

    do enter2report with tport , tuser , ttoken ,
    tbuy_sell , tshares , tstock , tprice , tshort ,
    tmmid , tpa , treport , tclearing , tcontra

    select SOURCES replace SEQ with tinseq + 1
    select ISLAND

    case tcommand = "D"

    tcseq = val( substr( ptm , 2 , 9 ) ) tcport =
    substr( ptm , 11 , 6 ) tcuser = substr( ptm , 17
    , 4 ) tctoken = substr( ptm , 21 , 10 )
    tcbuy_sell = substr( ptm , 31 , 1 ) tcshares =
    val( substr( ptm , 32 , 6 ) ) tcmatch = val(
    substr( ptm , 38 , 9 ) ) tcstock = substr( ptm ,
    47 , 6 ) tcprice = val( substr( ptm , 53 , 11 )
    ) tcmmid = substr( ptm , 64 , 4 ) tcmisc =
    substr( ptm , 68 , 1 ) tcreason = substr( ptm ,
    69 , 1 ) tcclearing = substr( ptm , 70 , 1 )

    do case case tcreason = "A" xreason = "#ERR"
    case tcreason = "B"
    xreason = "#CON" case tcreason =
    "C"
    xreason = "#SUP" case tcreason =
    "D"
    xreason = "#SYS" case tcreason =
    "E"
    xreason = "#EXT"

    otherwise

    ? time()+" Unvalid break reason
    = "+tcreason

    return

    endcase

    do case

    case tcbuy_sell = "B" xbuy_sell = "B"
    xshort = " "

    case tcbuy_sell = "S" xbuy_sell = "S"
    xshort = "L"

    case tcbuy_sell = "T" xbuy_sell = "S"
    xshort = "S"

    case tcbuy_sell = "E" xbuy_sell = "S"
    xshort = "E"

    otherwise

    ? time()+" Unvalid break
    buy_sell = "+tcbuy_sell return

    endcase


    [continued in next message]

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