• PyRFA 8.0.0 Dropping Support for RHEL5 and 32-bit Systems

    Recent release of PyRFA 8.0.0 (and forward) has dropped support for 32-bit and RHEL5. It supports only 64-bit systems on both Windows and Linux. The reason to drop the support on 32-bit depends on Thomson Reuters RFA C++ libraries that we use to build PyRFA. And since Thomson Reuters has decided not to include the libraries, PyRFA is affected this way.

    Feature-wise, we will keep maintaining version 7.6.1 as it is the last version with 32-bit and RHEL5 support. All future bug fixes and enhancement made to 8.0.0 will also be ported back to 7.6.1.

    For this case, 7.6.1.3 releases also change the data output format into a pure dictionary just like in 8.0.0.

    Thanks for using PyRFA!

  • PyRFA 8.0.0 Data Output Change

    In PyRFA 8.0.0 onwards, we have changed data output from dispatchEventQueue() to contain only dictionary. This enables Python users to parse and use data more efficiently.

    In previous 7.6.0:

    ('NIP', 'EUR=', {'ASK': '0.999', 'ASK_TIME': '13:41:32:120', 'BID': '0.988', 'BID_NET_CH': '0.0041'})

    Now in 8.0.0:

    {'MTYPE':'IMAGE','RIC':'EUR=','SERVICE':'IDN_RDF_SDS','ASK':1.3712,'BID':1.3709}
  • Making Mac Terminal and Windows CMD Support Unicode Charset Display in Python 3

    According to Python 3 unicode character representation, It is possible for the user to confront with Python exception when Terminal is trying to display such unicode data from Pyrfa. Here is the error:

    UnicodeEncodeError: 'ascii' codec can't encode character '\u21e7' in position 1: ordinal not in range(128)

    In this case the '\u21e7' is a unicode for an arrow character. It is a mandatory for the PyRFA users to configure their terminal in order to display these charset according to the Python 3 unicode support. Each of platform can properly display unicode via commands as follows:

    Unix:

    $ export PYTHONIOENCODING=utf-8
            

    Windows

    C:\> chcp 65001
  • Expanding Thomson Reuters Elektron Chain RICs with PyRFA

    We got an inquiry today regarding using our PyRFA to expand chain RICs. Here is the methods of expanding chain RICs that we delivered for a bank who used TREP-RT. Chains are comprised of RICs put in a FID LINK_ or LONGLINK divided into pages. Keep looking at NEXT_LR FID for the next chain RIC page and continue extracting actual RIC. Here are some Python code we used:

    def expandChainRIC(self, chainRIC):
            expanded = []
            done = False
            snapshot = self.snapshotRequest([chainRIC])
            while not done:
                if not snapshot:
                    break
                for i in ['LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6', 'LINK_7', 'LINK_8', 'LINK_9', 'LINK_10', 'LINK_11', 'LINK_12', 'LINK_13', 'LINK_14', 'LONGLINK1', 'LONGLINK2', 'LONGLINK3', 'LONGLINK4', 'LONGLINK5', 'LONGLINK6', 'LONGLINK7', 'LONGLINK8', 'LONGLINK9', 'LONGLINK10', 'LONGLINK11', 'LONGLINK12', 'LONGLINK13', 'LONGLINK14']:
                    if snapshot[0][2].has_key(i) and snapshot[0][2][i]:
                        expanded.append(snapshot[0][2][i])
                if snapshot[0][2].has_key('NEXT_LR') and snapshot[0][2]['NEXT_LR']:
                    snapshot = self.snapshotRequest([snapshot[0][2]['NEXT_LR']])
                elif snapshot[0][2].has_key('LONGNEXTLR') and snapshot[0][2]['LONGNEXTLR']:
                    snapshot = self.snapshotRequest([snapshot[0][2]['LONGNEXTLR']])
                else:
                    done = True
            # if chainRIC is not a chain, return itself back
            if not expanded:
                expanded.append(chainRIC)
            if self.debug:
                print "[debug] Expand chain " + chainRIC + " -> " + str(expanded)
            return expanded


    And

    def snapshotRequest(self, ricList):
            snaphots = ()
            self.pyrfa.log("Subscribing items: " + str(ricList) + " (total: " + str(len(ricList)) + " )")
            for ric in ricList:
                self.pyrfa.marketPriceRequest(ric)
            global end
            end = False
            t = threading.Timer(10, stop)
            t.start()
            imageReceived = 0
            while not end and imageReceived < len(ricList):
                images = self.pyrfa.dispatchEventQueue()
                if images:
                    for i in images:
                        if type(i[2]) is dict:
                            imageReceived += 1
                            snaphots += (i,)
                            t.cancel()
                            t = threading.Timer(10, stop)
                            t.start()
            self.pyrfa.log("Snapshots received: " + str(imageReceived))
            t.cancel()
            return snaphots
    
  • PyRFA for RHEL 6.3

    PyRFA is an alternative Python API for accessing Thomson Reuters real-time data feeds such as IDN, TS1 (time-series service), TREP-RT, RMDS or RDF-D from Thomson Reuters leveraging on OMM data model available in streaming or snapshot mode. Due to recent request from many buy-side/sell-side, brokers and banks around the world today DevCartel is pleased to announce the release of PyRFA v7.5.1.2 with support for Red Hat Enterprise Linux 6.3. PyRFA has extended its support to Red Hat 6.3 that comes with Python 2.6 as we see the needs from users to run financial Python applications on RHEL. So enjoy!

    See more at http://devcartel.com/pyrfa

  • PyRFA 7.5.1.1 Now with TS1 Timeseries

    One of new features in PyRFA 7.5.1.1 is ability to retrieve a full set of timeseries from Thomson Reuters TS1 service. PyRFA makes it unapologetically easy to request and decode TS1 in a few simple steps.

    Timeseries example script:

    import pyrfa
    p = pyrfa.Pyrfa()
    p.createConfigDb("./pyrfa.cfg")
    p.acquireSession("Session1")
    p.createOMMConsumer()
    p.login()
    p.directoryRequest()
    p.dictionaryRequest()
    p.setTimeSeriesPeriod("daily")
    p.setTimeSeriesMaxRecords(10)
    timeseries = p.getTimeSeries("CHK.N")
    print "\n########### CHK.N daily ###########"
    for record in timeseries:
    print record

    Output:

    ########### CHK.N daily  ###########
    DATE,CLOSE,OPEN,HIGH,LOW,VOLUME,VWAP
    2013/11/03,28.840,27.980,29.050,27.950,1998632.000,28.666
    2013/10/31,28.000,27.900,28.100,27.550,1027979.000,27.932
    2013/10/30,27.960,28.190,28.270,27.680,1345424.000,28.005
    2013/10/29,28.150,28.360,28.650,27.770,1370013.000,28.121
    2013/10/28,28.320,28.260,28.500,28.210,1246324.000,28.325
    2013/10/27,28.160,28.260,28.470,28.110,1328412.000,28.228
    2013/10/24,28.470,28.410,28.680,28.153,2462643.000,28.447
    2013/10/23,28.370,27.660,28.680,27.470,1773109.000,28.163
    ...
  • How to Save PyRFA Log

    Every time you run a PyRFA script, it will write a log file to a location specified by:

    \Logger\AppLogger\fileLoggerFilename = "./pyrfa.log"

    In the configuration. However, special options are allowed to append various unique prefix/suffix in the filename to avoid log file overwritten. Those options are:

    • {A} for process name
    • {P} for process ID
    • {T} for local 10-digit timestamp in UTC
    • {H} for hostname
    For example,
    \Logger\AppLogger\fileLoggerFilename = "./pyrfa.log.{T}"

    Will put a timestamp as a log file suffix and we will have a unique log file for every run.