library("reader") library(stringr) # the following constants are used in the messages sent and received cMessageDelimiter <- "#" cMessageStart <- "!" cMessageEnd <- "|" cTickers<-"tickers" cFrequency <- "frequency" cRequestData <- "requestdata" cTradeOrder <- "tradeorder" # the following constants are used for the trades cCashBuy <- "cashbuy"; cCashSell <- "cashsell"; cMarginBuy <- "marginbuy"; cMarginSell <- "marginsale"; cShortSell <- "shortsell"; cShortCover <- "shortcover"; serverTime <- "" tickers <- c("CSCO", "IBM", "AMZN", "MSFT") # the stock tickers you are interested in print(tickers) nStock<-length(tickers) bid <- vector(mode="numeric", length=nStock) ask <- vector(mode="numeric", length=nStock) last <- vector(mode="numeric", length=nStock) qty <- vector(mode="numeric", length=nStock) # functions sendServerMessage <- function(message, socket){ message=paste(cMessageStart,message,cMessageEnd) write.socket(socket,message) } # end of function haveCompleteMessage <- function(dataReceived){ iStart<-str_locate(dataReceived,pattern=fixed(cMessageStart))[1] #print(paste("istart: ",iStart)) if(is.na(iStart)) return(FALSE) iEnd<-str_locate(dataReceived,pattern=fixed(cMessageEnd))[1] #print(paste("iEnd: ",iEnd)) if(is.na(iEnd)) return(FALSE) return(TRUE) } extractCompleteMessage <- function(dataReceived){ iStart<-str_locate(dataReceived,pattern=fixed(cMessageStart))[1] iEnd<-str_locate(dataReceived,pattern=fixed(cMessageEnd))[1] completeMessage<-substr(dataReceived,iStart,iEnd) #print(paste("comp msg ",completeMessage)) return(completeMessage) } deciperMessage <- function(stringFromServer){ stringFromServer = str_replace_all(stringFromServer,pattern=fixed(cMessageStart),"") stringFromServer = str_replace_all(stringFromServer,pattern=fixed(cMessageEnd),"") #print(paste("Received: ",stringFromServer)) msg <- data.frame(str_split(tail(stringFromServer,1), "#")) nQtyArgs <- as.numeric(tail(msg[1,1])) #see documentation for the various quantity arguments that are sent serverTime = tail(msg[2,1]) print(paste("Server time: ",serverTime)) i<-2 for(k in 1:nStock){ i=i+1 bid[k]<<-as.numeric(tail(msg[i,1])) i=i+1 ask[k]<<-as.numeric(tail(msg[i,1])) i=i+1 last[k]<<-as.numeric(tail(msg[i,1])) #print(paste("last",k,last[k],sep=" ")) i=i+1 qty[k]<<-as.numeric(tail(msg[i,1])) #print(paste("qty",k,qty[k],sep=" ")) i=i+nQtyArgs-1 #ignoring remaining qty fields } }#end if function createTradingStrategy <- function(qty,last){ dollarAmount <- 100000 qtrad = vector(mode="numeric", length=nStock) otype = vector(mode="character", length=nStock) myOrder<-cTradeOrder for(k in 1:nStock){ qtrad[k]=0 if(qty[k]*last[k] != dollarAmount){ qtrad[k]=as.integer(((dollarAmount / last[k]) - qty[k] + 0.5)) } if(qtrad[k]>0) { otype[k]=paste(cCashBuy,"/",as.character(qtrad[k]),sep='') } else { qtrad[k]<-qtrad[k]*-1 otype[k]=paste(cCashSell,"/",as.character(qtrad[k]),sep='') } otype[k]=paste(tickers[k],otype[k],sep=cMessageDelimiter) myOrder<-paste(myOrder,otype[k],sep=cMessageDelimiter) } # "tradeorder#CSCO#cashbuy/37#IBM#cashbuy/29#AMZN#cashbuy/15#MSFT#cashbuy/11#" myOrder<-str_replace_all(myOrder," ","") return (myOrder) } # connect to the RT Client Socket socket <- make.socket(host="127.0.0.1", 22135,server=FALSE) on.exit(close.socket(socket)) print(socket) t1 <- paste(cTickers,cMessageDelimiter,sep='') t2 <- paste(tickers,collapse=cMessageDelimiter) message <- paste(t1,t2,sep='') print(message) sendServerMessage(message,socket) message <- paste(cFrequency,cMessageDelimiter,"60",sep='') print(message) sendServerMessage(message,socket) outerLoop<-TRUE dataReceived<-"" while(outerLoop){ error<-FALSE tryCatch( expr = { stringFromServer <- read.socket(socket) dataReceived<-paste(dataReceived,stringFromServer) #print(paste("data received: ",dataReceived)) if(haveCompleteMessage(dataReceived)){ completeMessage<-extractCompleteMessage(dataReceived) deciperMessage(completeMessage) myOrder=createTradingStrategy(qty,last) print(myOrder) dataReceived<-str_replace_all(dataReceived,pattern=fixed(completeMessage),"") #print(paste("rem data",length(dataReceived),dataReceived)) } sendServerMessage(myOrder, socket) }, error = function(e){ message('Caught an error!') print(e) outerLoop=FALSE error=TRUE break }, warning = function(w){ message('Caught an warning!') print(w) outerLoop=FALSE }, finally = { if(error){ outerLoop=FALSE break } } ) if(error) break }# end of outerLoop print("Finished")