From Newsgroup: soc.culture.indian
Josh Levines' - ECN code
Please find below the CompuBBS ECN code originally developed by Josh
Levine. It is something a former friend of mine once told me about as he worked at Daytek during the dawn of the internet. At the time I was to oblivious to the fact that money is the very means by which our lives
revolve around. As they say, "when men and women get together [money]
gets in the way". The Josh Levines' ECN day trading code is intended as
a game for now until it becomes more viable for the purposes of the Cybermatrix.
The below ECN day trading code is in Python. So check it out. Try to
make it into a game at first so that you and your network can learn how
to play it before proceeding. I heard when it comes to the stock market
one can literally loose their shirt on this. So beware. Ignorance is not bliss.
The intention for this code is toward the establishment of the
cybermatrix or to say the open source fiat like monies initiative for
the sake of synergy or mutual success. The meaning of cybermartix is
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(matrices) within 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 Levines' Island ECN day trading code in Python ------------------------------------------------------------------------------------------------------
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
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
do enterbreak with tcseq , tcport, tcuser, tctoken, xbuy_sell, tcshares
, tcmatch ,tcstock , tcprice , tcmmid , xreason , tcmisc , tcclearing ,
xshort
case tcommand = "M"
tctype = substr( ptm , 2 , 1 )
do case
case tctype = "S" && Stock maintence
tport = substr( ptm , 3 , 6 )
tuser = substr( ptm , 9 , 4 )
ttoken = substr( ptm , 13 , 10 )
tcstock = substr( ptm , 23 , 6 )
tcshorttype = substr( ptm , 29 , 1 )
tcblocksub = substr( ptm , 30 , 1 )
tccenter = substr( ptm , 31 , 1 )
tcmisc = substr( ptm , 32 , 4 )
do entermaint with tport, tuser, ttoken, tcstock , tcshorttype ,
tcblocksub , tccenter , tcmisc
case tctype = "A" && Account settings
taccount = substr( ptm , 3 , 6 )
tpassword = substr( ptm , 9 , 10 )
ttest = substr( ptm , 19 , 1 )
ttrusted = substr( ptm , 20 , 1 )
tthresh = val( substr( ptm , 21 , 6 ) )
tsscheck = substr( ptm , 27 , 1 )
tiflag = substr( ptm , 28 , 1 )
tdefault = substr( ptm , 29 , 4 )
do enteraccount with taccount, tpassword, ttest , ttrusted , tthresh, tsscheck, tiflag, tdefault
case tctype = "F" && Account settings
taccount = substr( ptm , 3 , 6 )
tmmid = substr( ptm , 9 , 4 )
tclearing = substr( ptm , 13 , 1 )
do enterfirm with taccount, tmmid, tclearing
case tctype = "T" && Stock state
tport = substr( ptm , 3 , 6 )
tuser = substr( ptm , 9 , 4 )
ttoken = substr( ptm , 13 , 10 )
tcstock = substr( ptm , 23 , 6 )
tcstate = substr( ptm , 29 , 1 )
do enterstate with tport, tuser, ttoken, tcstock , tcstate
otherwise
? time()+" Unvalid maint reason = "+tctype
endcase
otherwise
do alert with "Unknown command"+ptm
endcase
return
proc sendeos
s = "E"
call int99 with s
if s # "f" .and. s # "b"
activate window output
? time() +" !!!! ERROR ON EOS WRITE!!!!!!"
? ws
activate window ticker
suspend
endif
return
proc flush
s = "F"
call int99 with s
if s # "f"
? "!!!!ERROR ON FLUSH!!!!"
do alert with "Error on flush:"+werror(s)
suspend
endif
gstoredflag = .F.
return
proc shutdown
do alert with "Shutdown initiated"
if !geom && Shutting down too early? Just in case...
wait window "Can't end day, EOM has not happened yet!" nowait
do alert with "Ending day attempted before EOM time!"
return
endif
sdk = chr( (rand() * 25) + asc("A") )
wait window "Initiate Shutdown by pressing ["+sdk+"] within 10 seconds"
to sdh timeout 10
if upper( sdh ) # sdk
wait window "Shutdown Aborted" nowait
do alert with "Shutdown aborted"
return
endif
wait window "Confirm Shutdown by pressing the magic key within 10
seconds" to sdh timeout 10
if upper( sdh ) # "M"
wait window "Inccorect Shutdown confirmation" nowait
do alert with "Incorrect shutdown magic key"
return
endif
do alert with "Shutdown confirmed"
if file( mholdofffile )
? "Holdoff file exists! Escalate!"
suspend
else
sdf = fcreate( mholdofffile )
=fputs( sdf , "Stop in the name of love!")
=fclose( sdf )
endif
if !file( mholdofffile )
wait window "No HOLDOFF file created, aborting Shutdown" nowait
do alert with "No HOLDOFF file created, aborting shutdown"
return
endif
wait window "Shutting down..." nowait
do swrite with "N" , ""
wait window "Shutting down... 3" timeout 1
do swrite with "N" , ""
wait window "Shutting down... 2" timeout 1
do swrite with "N" , ""
wait window "Shutting down... 1" timeout 1
do flush
wait window "Flushing..." timeout 1
do sendeos
do flush
wait window "Sending End of Session... 3" timeout 1
do flush
wait window "Sending End of Session... 2" timeout 1
do flush
wait window "Sending End of Session... 1" timeout 1
do flush
wait window "Sending End of Session... 0" timeout 1
do flush
mdone = .T.
zap
return
proc pingreply
param preply , ptm
ptoken = substr( ptm , 2 , 12 )
pport = substr( ptm , 14 , 4 )
x = "R"+ptoken+str( tseq ,9,0)+str( tmatch ,9,0)+str(0,9,0)
s = "S"+chr(len(x))+ preply+pport+ x
call int99 with s
return
proc seteventflags
param secode
do case
case secode = "SOD"
gaccept = .T.
gactaccept = .T.
case secode = "EOA"
gactaccept = .F.
case secode = "EOD"
gaccept = .F.
case secode = "EOM"
geom = .T.
endcase
return
proc alert
parameter s
xs = dtoc(date())+" "+time() +"-"+ s
? xs
IF FILE( malertfile ) && Does file exist?
errfile = FOPEN( malertfile ,12) && If so, open read/write
ELSE
errfile = FCREATE( malertfile ) && If not create it
ENDIF
IF errfile < 0 && Check for error opening file
WAIT 'Cannot open or create output file' WINDOW NOWAIT
ELSE && If no error, write to file
=fseek( errfile, 0 , 2 )
=FWRITE(errfile, xs + chr(13) + chr(10) )
ENDIF
=FCLOSE(errfile) && Close file
* ? chr(07)+chr(07)+chr(07)+chr(07)
return ------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
Readme.txt ------------------------------------------------------------------------------------------------------
This is Josh Levines' Island ECN program that a former pal of mine once
used to make 250K. He claimed it is simple and easy to use. So, I
thought maybe it should be mentioned in the CompuBBS list of tools. The
code is from the following url:
http://josh.com/notes/island-ecn-10th-birthday/ http://josh.com/notes/island-ecn-10th-birthday/ISLAND.PRG.TXT
Please use and edit the code with your own caution. However, learning
how to deal with monies is important and is considered one of the two
cardinal virtues of an educated person, along with learning how to
communicate. Already, we have the Unix communication tool but we also
need a nice set of tools for the FIAT monies pragma.
I tell ya, somethings work and these British itemized pragmas are like
so wonderful. They are a love affair that just does not quit. So check
it out and be made successful with them. Again, the thing to encourage
is synergy. The following networks seem to do something toward team
work or to say together everyone accomplishes more.:
#-network - mutuality - meaning - ism - place ----------------------------------------------
1-Simulcast - comaradery - mutual trust - evangelicalism - church
2-Internet - reciprocity - mutual respect - capitalism - brothel
3-Cybermatrix - synergy - mutual success - existentialism - bank
4-Tektocracy - unity - mutual purpose - republicanism - home
5-Sneakerweb - infidelity - mutual cheating - secularism - school
6-Darkring - calumny - mutual defamation - transcendentalism - park
# - network - tool - idnustry - mutuality - signal ----------------------------------------------------------
1 - Simulcast - radio - spiritual - comaradery - analog
2 - Internet - computer - technological - reciprocity - digital
3 - Cybermatrix - television - financial - synergy - pulse
4 - Tektocracy - beeper - political - unity - ?
5 - Sneakerweb - tablet - educational - infidelity - ?
6 - Darkring - console - architectural - ? - ?
7 - Datatron - tracker(i.e. fitbit) - medical - ? - ?
8 - Heliopex - watch - recreational - ? - ?
9 - Transpace - PDA(a.k.a smartphone) - sexual - ? - ?
10 - Stargate - controller - audiovisual - ? - ?
Anyway, just ruminating about the Transcendentalism and thier Satanic
Dharmic cults is making me sick to my stomach. Time for me to sleep, if
it is even possible anymore with thier julai state encouragement. God
bless and God speed for Jesus Christ is God. Always a pleasure. I want
you to win.
--- Synchronet 3.21b-Linux NewsLink 1.2