#FTS Python example: constant mix strategy # do not change anything all the way to where you see "You can change this part" import socket import select import sys import datetime # the following 'constant' declarations refer to the different parts of qty for nArgs=6 (the current implementation) cCashQty=0 cMarginQty=1 cShortQty=2 cCashAvailable=3 cCVAP=4 # 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="" last=dict() bid=dict() ask=dict() qty=dict() returnString=dict() def translate_message(message): #don't change this: it converts the data received into arrays you can use # print(message, len(message)) # remove the cMessageStart and cMessageEnd characters message=message[message.find(cMessageStart)+len(cMessageStart):message.find(cMessageEnd)] argv = message.split(cMessageDelimiter) # the first step is to read the number of arguments per ticker # in the future, we may pass more arguments per ticker; that is why we made this variable nArg=int(argv[0]) serverTime = argv[1] print("Server time: " + serverTime) i=1 last.clear() bid.clear() ask.clear() qty.clear() for tkr in tickers: print(tkr) i=i+1 bid[tkr]=float(argv[i]) i=i+1 ask[tkr]=float(argv[i]) i=i+1 last[tkr]=float(argv[i]) qty[tkr]=list() for j in range(nArg): i=i+1 # print(i,argv[i]) qty[tkr].append(float(argv[i])) def create_tradeorder_message(): #don't change this msg=cTradeOrder+cMessageDelimiter for tkr in tickers: msg=msg+tkr+cMessageDelimiter+returnString[tkr]+cMessageDelimiter return msg # do not change this server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) IP_address = "127.0.0.1" #do not change this Port = 22135 #do not change this try : server.connect((IP_address, Port)) except Exception as e: print(e) sys.exit() def sendStringToServer(message): #do not change this arr = bytes(cMessageStart+message+cMessageEnd, 'utf-8') server.sendall(arr) # You can change this part def constant_mix(): # this is the trading strategy: invest $100000 in each stock returnString.clear() dollarAmount=100000.0 nTrade=0 for tkr in tickers: if last[tkr]>0: if qty[tkr][cCashQty]*last[tkr] < dollarAmount: nTrade=dollarAmount / last[tkr] - qty[tkr][cCashQty] returnString[tkr]=cCashBuy + '/' + str(int(nTrade)) elif qty[tkr][cCashQty]*last[tkr] > dollarAmount: nTrade= qty[tkr][cCashQty] - dollarAmount / last[tkr] returnString[tkr]=cCashSell + '/' + str(int(nTrade)) else: returnString[tkr]='blank' tickers=['CSCO','IBM','AMZN','BA','MSFT'] # the stock tickers you are interested in print(tickers) frequency=60 message = cTickers + cMessageDelimiter + cMessageDelimiter.join(tickers) print("sending tickers") sendStringToServer(message) print("sending frequency") message=cFrequency+cMessageDelimiter+str(frequency) sendStringToServer(message) print("requesting data") message=cRequestData sendStringToServer(message) while True: sockets_list = [server] read_sockets,write_socket, error_socket = select.select(sockets_list,[],[]) for socks in read_sockets: if socks == server: message = socks.recv(2048) # data message received from the server now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") print("data received: " + now) translate_message(message.decode("utf-8")) # message translated constant_mix() #strategy created message = create_tradeorder_message() #trade order message constructed sendStringToServer(message) #orders sent now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") print("trades sent: " + now) server.close()