2016-11-29 49 views
0

我很難交易幾種用Python編寫的交易策略。 我已經通過Quickfix建立了FIX連接,但如果策略的腳本位於Quickfix連接腳本中,我只能發送訂單。由於我有幾個策略,我真的不知道如何從單獨的腳本發送訂單。有人可以給我一些解決方案嗎?Quickfix與幾種Python策略

import sys 
import datetime 
import time 
import quickfix as fix 


class Application(fix.Application): 
    orderID = 0 
    execID = 0 
    def gen_ord_id(self): 
     global orderID 
     orderID+=1 
     return orderID 

    def onCreate(self, sessionID): 
     return 

    def onLogon(self, sessionID): 
     self.sessionID = sessionID 
     print ("Successful Logon to session '%s'." % sessionID.toString()) 
     return 

    def onLogout(self, sessionID): 
     return 

    def toAdmin(self, message, sessionID): 
     username = fix.Username("username") 
     mypass = fix.Password("password") 
     mycompid = fix.TargetSubID("targetsubid") 
     message.setField(username) 
     message.setField(mypass) 
     message.setField(mycompid) 

    def fromAdmin(self, message, sessionID):   
     TradeID = fix.TradingSessionID 
     message.getField(TradeID) 
     return 

    def toApp(self, sessionID, message): 
     print "Sent the following message: %s" % message.toString() 
     return 

    def fromApp(self, message, sessionID): 
     print "Received the following message: %s" % message.toString() 
     return 

    def genOrderID(self): 
     self.orderID = self.orderID + 1 
     return `self.orderID` 

    def genExecID(self): 
     self.execID = self.execID + 1 
     return `self.execID` 

    def put_order(self, sessionID, myinstrument, myquantity): 
     self.myinstrument = myinstrument 
     self.myquantity = myquantity 
     print("Creating the following order: ") 
     today = datetime.datetime.now() 
     nextID = today.strftime("%m%d%Y%H%M%S%f") 
     trade = fix.Message() 
     trade.getHeader().setField(fix.StringField(8, "FIX.4.4")) 
     trade.getHeader().setField(fix.MsgType(fix.MsgType_NewOrderSingle)) 
     trade.setField(fix.ClOrdID(nextID)) #11=Unique order 
     trade.getHeader().setField(fix.Account("account")) 
     trade.getHeader().setField(fix.TargetSubID("targetsubid")) 
     trade.setField(fix.Symbol(myinstrument)) #55=SMBL ? 
     trade.setField(fix.TransactTime()) 
     trade.setField(fix.CharField(54, fix.Side_BUY)) 
     trade.setField(fix.OrdType(fix.OrdType_MARKET)) # 40=2 Limit order 
     trade.setField(fix.OrderQty(myquantity)) # 38=100 
     print trade.toString() 
     fix.Session.sendToTarget(trade, self.sessionID) 


try: 
    file = sys.argv[1] 
    settings = fix.SessionSettings(file) 
    application = Application() 
    storeFactory = fix.FileStoreFactory(settings) 
    logFactory = fix.ScreenLogFactory(settings) 
    initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory) 
    initiator.start() 

    while 1: 
     time.sleep(1) 

     if input == '1': 
      print "Putin Order" 
      application.put_order(fix.Application)   
     if input == '2': 
      sys.exit(0) 
     if input == 'd': 
      import pdb 
      pdb.set_trace() 
     else: 
      print "Valid input is 1 for order, 2 for exit" 

except (fix.ConfigError, fix.RuntimeError) as e: 
    print e 

這是我的啓動器應用程序。我的問題是,我可以更新從另一個python腳本以下值: trade.setField(fix.Symbol(myinstrument)) trade.setField(fix.OrderQty(myquantity))

所以我想改變myinstrument和myquantity從另一個python腳本中強制啓動,並使用新值執行以下命令application.put_order(fix.Application)。我的問題是這可能嗎?

+0

您可能需要詳細闡述一下。沒有人可以提供解決方案,他們只能提出建議。 – DumbCoder

+0

我有一個Python腳本,就像連接器/發起者一樣對我的經紀人起作用。我的問題是,如何使用由連接器/啓動器建立的現有連接將另一個python腳本的訂單放入我的代理? – manev

回答

0

聽起來就像您需要QuickFIX訂閱的內部消息傳遞層,並且您的單獨Python腳本發佈訂單。這是關於工作流程設計。嘗試像VertX那樣可以使用Python進行設置。

0

爲什麼你不嘗試在兩個python腳本之間使用共享內存?你也可以使用線程或多線程和信號,但我會選擇第一個選項,因爲它對我來說最簡單。然後,您將有一個腳本將交易寫入文件,另一個腳本會將該文件中的每筆交易存入代理... 希望我的想法可以幫助