Linux NoHup fails for Streaming API IG Markets where file is python

Question:

This is quite a specific question regarding nohup in linux, which runs a python file.
Back-story, I am trying to save down streaming data (from IG markets broadcast signal). And, as I am trying to run it via a remote-server (so I don’t have to keep my own local desktop up 24/7),
somehow, the nohup will not engage when it ‘listen’s to a broadcast signal.

Below, is the example python code

#!/usr/bin/env python
#-*- coding:utf-8 -*-

"""
IG Markets Stream API sample with Python
    """

user_ = 'xxx'
password_ = 'xxx'
api_key_ = 'xxx' # this is the 1st api key
account_ = 'xxx'
acc_type_ = 'xxx'
fileLoc = 'marketdata_IG_spx_5min.csv'

list_ = ["CHART:IX.D.SPTRD.DAILY.IP:5MINUTE"]
fields_ = ["UTM", "LTV", "TTV", "BID_OPEN",  "BID_HIGH",  
           "BID_LOW", "BID_CLOSE",]

import time
import sys
import traceback
import logging

import warnings
warnings.filterwarnings('ignore')

from trading_ig import (IGService, IGStreamService)
from trading_ig.lightstreamer import Subscription

cols_ = ['timestamp', 'data']
# A simple function acting as a Subscription listener
def on_prices_update(item_update):
    # print("price: %s " % item_update)
    print("xxxxxxxx
          ))
    

# A simple function acting as a Subscription listener
def on_charts_update(item_update):
    # print("price: %s " % item_update)
    print(xxxxxx"
          .format(
              stock_name=item_update["name"], **item_update["values"]
          ))
    res_ = [xxxxx"
            .format(
              stock_name=item_update["name"], **item_update["values"]
          ).split(' '))]
    # display(pd.DataFrame(res_))
    
    try:
        data_ = pd.read_csv(fileLoc)[cols_]
        data_ = data_.append(pd.DataFrame(res_, columns = cols_))
        
        data_.to_csv(fileLoc)
        print('there is data and we are reading it')
        # display(data_)
    except:
        pd.DataFrame(res_, columns = cols_).to_csv(fileLoc)
        print('there is no data and we are saving first time')
        
    time.sleep(60) # sleep for 1 min


def main():
    logging.basicConfig(level=logging.INFO)
    # logging.basicConfig(level=logging.DEBUG)

    ig_service = IGService(
        user_, password_, api_key_, acc_type_
    )

    ig_stream_service = IGStreamService(ig_service)
    ig_session = ig_stream_service.create_session()
    accountId = account_
    
    
    ################ my code to set sleep function to sleep/read at only certain time intervals
    s_time = time.time()
    ############################
    
    # Making a new Subscription in MERGE mode
    subscription_prices = Subscription(
        mode="MERGE",
        # make sure to put L1 in front of the instrument name
        items= list_,
        fields= fields_
    )
    # adapter="QUOTE_ADAPTER")

    # Adding the "on_price_update" function to Subscription
    subscription_prices.addlistener(on_charts_update)

    # Registering the Subscription
    sub_key_prices = ig_stream_service.ls_client.subscribe(subscription_prices)
    print('this is the line here')
    
    input("{0:-^80}n".format("HIT CR TO UNSUBSCRIBE AND DISCONNECT FROM 
    LIGHTSTREAMER"))

    # Disconnecting
    ig_stream_service.disconnect()


if __name__ == '__main__':
    main()

#######

Then, I try to run it on linux using this command : nohup python marketdata.py
where marketdata.py is basically the python code above.

Somehow, the nohup will not engage……. Any experts/guru who might see what I am missing in my code?

Asked By: Kiann

||

Answers:

the fix, is not to have the code running via main(). Instead, the line commands should be directly in the shell script.

hence, instead of just main(), if we expand out the code below, it does work in the cloud-based remote-server using nohup.

if __name__ == '__main__':
    
    logging.basicConfig(level=logging.INFO)
    
    ig_service = IGService(user_, password_, api_key_, acc_type_)
    ig_stream_service = IGStreamService(ig_service)
    ig_session = ig_stream_service.create_session()
    
    # create a subscription and add listeners
    subscription = Subscription(
        mode="MERGE",
        items=list_,
        fields=fields_,
        )
    subscription.addlistener(on_charts_update)
    # subscription.addlistener(on_charts_update)
    # subscription = ig_stream_service.create_price_subscription(list_, fields_, on_prices_update)
    ig_stream_service.ls_client.subscribe(subscription)

    
    
    # you can also subscribe to account updates (balance)
    # subscription_account = ig_stream_service.create_balance_subscription(on_account_update)
    # ig_stream_service.connect(subscription_account)

    # finally, keep the client running
    while True:
        time.sleep(1)
Answered By: Kiann