2016-11-29 131 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脚本之间使用共享内存?你也可以使用线程或多线程和信号,但我会选择第一个选项,因为它对我来说最简单。然后,您将有一个脚本将交易写入文件,另一个脚本会将该文件中的每笔交易存入代理... 希望我的想法可以帮助