예제 #1
0
	def __init__(self, directory, fxcodes, time = None):
		"""Initialize the Handler.
			Parameters:
			string directory - the directory which the .csv files lay in
			list fxcodes - a list of strings which represent currency
				pairs, e.g. ['EURUSD', 'USDJPY']. the Handler will look
				into the directory provided by `directory`, if it can
				find files called `fxcode`.csv (where fxcode is an
				item in fxcodes), e.g. EURUSD.csv
			datetime time - the time at which the simulation should
				start at, if not provided, it just uses the first time
				available
		"""
	
		log.debug("Initiating CSVForexTicksHandler Object")
		self._directory = directory
		self._data = defaultdict(None)
		self.fxcodes = fxcodes
		self.data_available = True

		self.time_change = Signal()
		self.tick = Signal()

		self._comb_index = None
		self._load_files(self._directory, self.fxcodes)
		
		if None == time:
			self._time = self._comb_index[0]
		else:
			self._time = time
		self._start_time = self._time
예제 #2
0
    def __init__(self,
                 market,
                 limit_storage_time=timedelta(days=10),
                 lag_time=timedelta(milliseconds=500)):
        """Initialize the broker
			Parameters:
			Market market - a market instance
			timedelta limit_storage_time - a time span which limit
				orders will be saved maximum
			timdelta lag_time - the time which it will take to broker
				to actually set a market order
		"""
        log.debug("Initiating Broker Object")
        self.market = market

        self.market.data.tick.registerObserver(self.market_tick)
        self.market.data.time_change.registerObserver(self.market_tick)

        self._orders = {}
        self._limit_storage_time = limit_storage_time
        self._market_order_delay = lag_time

        self.order_fill = Signal()
        self.order_delete = Signal()
        self._newest_order_id = -1
예제 #3
0
    def setUp(self):
        self.sig_function = Signal()
        self.sig_method = Signal()
        self.sig_function.connect(onSignalFunction)

        global signal_calls
        signal_calls = []
 def __init__(self, profileID=None, nameAndDecInfo=None, profileData=None):
     self.profileID = profileID
     self.nameAndDecInfo = nameAndDecInfo
     self.originalProfileData = profileData
     self.groupsBySettingID = None
     self.remoteSvc = sm.RemoteSvc(REMOTE_SERVICE_NAME)
     self.on_profile_saved = Signal()
     self.on_groups_added = Signal()
     self.on_group_changed = Signal()
     self.on_profile_value_changed = Signal()
def test_get_signal_dimensions():
    
    s_1 = Signal(known_intruder_1)


    assert s_1.get_signal_dimensions() == (8, 11)

    s_2 = Signal("----")

    assert s_2.get_signal_dimensions() == (1, 4)
예제 #6
0
def import_data():
    """Import your data here"""
    # Import your data as np array
    np_x = None
    np_y = None
    # Wrap your data up into a Signal
    fs = 1000  # sampling frequency
    x = Signal(np_x, fs=fs)
    y = Signal(np_y, fs=fs)
    # Return
    return x, y
예제 #7
0
 def __init__(self, copy_from=None, FS=96000):
     self.tempdir = None
     self.tempdir_keep = False
     self.backward_euler = False
     self.solver = None
     self.build_verbose = False
     self.module_id = None
     self.module_name = None
     self.module_desc = None
     self.c_datatype = "double"
     self.table_datatype = "double" #"float"
     self.pre_filter = None
     self.post_filter = None
     self.code_generator = None
     self.plugindef = None
     self.build_script = None
     self.resample = True
     self.FS = FS
     self.use_sim = SIM_C
     self.sig = Signal()
     self._clear()
     self._rmtree = shutil.rmtree
     self.subcircuits = {}
     if copy_from is not None:
         self.backward_euler = copy_from.backward_euler
         self.solver = copy_from.solver
         self.FS = copy_from.FS
         self.S = copy_from.S
         self.V = copy_from.V
예제 #8
0
def spectrogram(signal, binWidth, overlap):
    """
    Generates the spectrogram of an input signal.

    @param signal The input signal object
    @return specs The values of the spectrogram
    @return f The frequency spectrum
    @return t The time domain
    """
    try:
        signal.name = signal.name
    except AttributeError as e:
        print('AttributeError: input is not a Signal object')

    f = np.linspace(0, binWidth // 2 * signal.sampleRate // binWidth,
                    binWidth // 2)
    t = np.linspace(0, signal.length / signal.sampleRate,
                    signal.length // binWidth * overlap)

    starts = np.arange(0, signal.length, binWidth // overlap)
    starts = np.append(starts, signal.length)
    specs = np.zeros((binWidth // 2, np.shape(t)[0]))

    for step in range(np.shape(starts)[0] - overlap - 1):
        subsignal = Signal(sampleRate=signal.sampleRate,
                           length=starts[step + overlap] - starts[step],
                           values=signal.values[starts[step]:starts[step +
                                                                    overlap]])
        specs[:, step] = G_xx(subsignal)
    return specs, f, t
예제 #9
0
    def separate_interp(self, input_, alphas=None, max_order=4, verbose=False):

        # Sanity check
        if not isinstance(input_, Signal):
            raise TypeError('!! Input must be an instance of Signal')
        if alphas is None:
            alphas = []
            for order in range(max_order):
                alphas.append((-1)**order * (1 + order * 0.25))
        if verbose: print('>> alphas = {}'.format(alphas))

        N = len(alphas)

        # Generate matrix R
        R = np.zeros(shape=(N, input_.size))
        for i in range(N):
            R[i] = self(alphas[i] * input_)

        # Generate matrix A
        A = np.zeros(shape=(N, N))
        for r in range(N):
            for c in range(N):
                A[r, c] = alphas[r]**(c + 1)
        inv_A = np.linalg.inv(A)
        if verbose:
            print('>> ||inv(A)|| = {:.4f}'.format(np.linalg.norm(inv_A)))

        # Separate
        results = []
        yn = np.matmul(inv_A, R)
        for order in range(N):
            results.append(Signal(yn[order]))
            results[order].__array_finalize__(input_)

        return results
예제 #10
0
    def inference(self, input_, orders=None, *args, **kwargs):
        # Sanity check
        if not isinstance(input_, Signal):
            raise TypeError('!! Input must be an instance of Signal')
        if self.order_lock is not None: orders = self.order_lock
        if orders is not None: orders = self._check_orders(orders)

        # Calculate
        y = np.zeros_like(input_)
        if orders is None: pool = self.indices_full
        else:
            pool = []
            for order in orders:
                pool += list(
                    self.kernels.get_homogeneous_indices(
                        order, self.memory_depth[order - 1], symmetric=False))
        for lags in pool:
            # lags = (\tau_1, \tau_2, \cdots, \tau_k)
            # prod = h_k(\tau_1, \cdots, \tau_k) * \prod_{i=1}^k x[n-\tau_i]
            prod = self.kernels[lags]
            if prod == 0: continue

            for lag in lags:
                prod *= self._delay(input_, lag)
            y += prod

        output = Signal(y)
        output.__array_finalize__(input_)
        return output
예제 #11
0
 def __init__(self, settingID, groupID, value=0.0):
     self.settingInfo = structures.SETTING_OBJECT_BY_SETTINGID[settingID]
     self.settingType = self.settingInfo.valueType
     self.settingID = settingID
     self.groupID = groupID
     self.value = value
     self.on_profile_value_changed = Signal()
예제 #12
0
def get_signals_rsi(transaction_currency,
                    start_time,
                    end_time,
                    rsi_overbought,
                    rsi_oversold,
                    counter_currency="BTC"):
    rsi_signal_query = """ SELECT trend, horizon, strength_value, strength_max, price, price_change, timestamp, rsi_value 
                FROM signal_signal 
                WHERE   signal_signal.signal=%s AND 
                        transaction_currency=%s AND 
                        counter_currency=%s AND
                        timestamp >= %s AND
                        timestamp <= %s AND
                        (rsi_value > %s OR
                        rsi_value < %s) AND
                        source = 0
                ORDER BY timestamp;"""
    counter_currency_id = CounterCurrency[counter_currency].value
    cursor = dbc.execute(rsi_signal_query,
                         params=("RSI", transaction_currency,
                                 counter_currency_id, start_time, end_time,
                                 rsi_overbought, rsi_oversold))
    signals = []
    for (trend, horizon, strength_value, strength_max, price, price_change,
         timestamp, rsi_value) in cursor:
        signals.append(
            Signal(SignalType.RSI, trend, horizon, strength_value,
                   strength_max, price / 1E8, price_change, timestamp,
                   rsi_value, transaction_currency,
                   CounterCurrency[counter_currency]))
    return signals
예제 #13
0
    def __init__(self, TAlgorithm, datahandler, Broker, Portfolio, name):
        """Initialize a new Stock Simulation
		
		Parameters:
	
		TAlgorithm - A Class which extends TradingAlgorithm. Will be run
			as Trader in this simulation. Look at TradingAlgorithm
			for information about what this class should contain
		DataHandler - An instance of Class extending DataHandler. Look
			at DataHandler class about how this classes should look like
		Broker - A Class which will extend the Broker Class. Look at the
			Broker class about how this classes should look like
		Portfolio - a Reference to the Portfolio class
		string name - name of the simulation. has no use yet
		"""

        self.name = name
        self.game_end = Signal()
        self.data = datahandler
        start_port = defaultdict(lambda: 0)
        start_port['EUR'] = 50000
        self.broker = Broker(self)

        self.talgo_port = Portfolio(start_port)
        self.talgo = TAlgorithm(self, self.broker, self.talgo_port)

        self.date = None
예제 #14
0
 def __init__(self,
              itemID,
              solarsystemID,
              typeID,
              ownerID,
              structureServices=None,
              profileID=None,
              currentSchedule=0,
              nextSchedule=0,
              state=None,
              unanchoring=None,
              fuelExpires=None):
     self.structureInfo = KeyVal(itemID=itemID,
                                 solarsystemID=solarsystemID,
                                 typeID=typeID,
                                 ownerID=ownerID,
                                 structureServices=structureServices,
                                 profileID=profileID,
                                 currentSchedule=currentSchedule,
                                 nextSchedule=nextSchedule,
                                 state=state,
                                 unanchoring=unanchoring,
                                 fuelExpires=fuelExpires)
     self.systemAndStructureName = None
     self.requiredHours = None
     self.on_structure_state_changed = Signal()
예제 #15
0
def get_signals(signal_type,
                transaction_currency,
                start_time,
                end_time,
                counter_currency="BTC"):
    signal_query = """ SELECT trend, horizon, strength_value, strength_max, price, price_change, timestamp, rsi_value 
                FROM signal_signal 
                WHERE   signal_signal.signal=%s AND 
                        transaction_currency=%s AND 
                        counter_currency=%s AND
                        timestamp >= %s AND
                        timestamp <= %s AND
                        source = 0
                ORDER BY timestamp;"""

    counter_currency_id = CounterCurrency[counter_currency].value
    cursor = dbc.execute(signal_query,
                         params=(signal_type.value, transaction_currency,
                                 counter_currency_id, start_time, end_time))
    signals = []
    for (trend, horizon, strength_value, strength_max, price, price_change,
         timestamp, rsi_value) in cursor:
        signals.append(
            Signal(signal_type, trend, horizon, strength_value, strength_max,
                   price / 1E8, price_change, timestamp, rsi_value,
                   transaction_currency, CounterCurrency[counter_currency]))
    return signals
def build_vbi_signals(price_volume_df, percent_change_price, percent_change_volume, transaction_currency, counter_currency,
                      source, resample_period):
    # build signals
    all_buy_signals = []
    first_cross_buy_signals = []
    valid_in_previous_step = False
    for row in price_volume_df.itertuples():
        timestamp = row.Index.timestamp()
        price = row.price
        volume = row.volume
        avg_price = row.average_price
        avg_volume = row.average_volume

        # check whether to generate a buy signal:
        if price > (1 + percent_change_price)*avg_price and volume > (1 + percent_change_volume)*avg_volume:
            signal = Signal("RSI", 1, Horizon.any, 3, 3, price, 0, timestamp, 0, transaction_currency, counter_currency,
                            source, resample_period)
            all_buy_signals.append(signal)
            if not valid_in_previous_step:
                valid_in_previous_step = True
                first_cross_buy_signals.append(signal)
                # print(timestamp, price, avg_price, volume, avg_volume)
        else:
            valid_in_previous_step = False
    return all_buy_signals, first_cross_buy_signals
예제 #17
0
 def __init__(self):
     self.states = ["INIT", "RUN_COMMANDS"]
     self.state = self.states[0]
     self.num_frames = 0
     self.added_cmd_idx = 0
     self.signal_capacity = 15
     self.signal = Signal(self.signal_capacity)
     self.commands = Commands()
     self.unlock_frame_num = 0
예제 #18
0
파일: neural_net.py 프로젝트: zkmartin/nls
  def inference(self, input_, **kwargs):
    if not self.nn.built:
      raise AssertionError('!! Model has not been built yet')
    mlp_input = self._gen_mlp_input(input_)
    tfinput = TFData(mlp_input)
    output = self.nn.predict(tfinput, **kwargs).flatten()

    output = Signal(output)
    output.__array_finalize__(input_)
    return output
예제 #19
0
파일: wiener.py 프로젝트: zkmartin/nls
    def inference(self, input_, orders=None, *args, **kwargs):
        # Sanity check
        if not isinstance(input_, Signal):
            raise TypeError('!! Input must be an instance of Signal')

        y = np.zeros_like(input_)
        orders = range(self.degree + 1) if orders is None else [orders]
        for n in orders:
            y += self.G_n(n, input_)

        output = Signal(y)
        output.__array_finalize__(input_)
        return output
예제 #20
0
 def __init__(self, typeID):
     self.typeID = typeID
     self.radius = evetypes.GetRadius(typeID)
     self.movingOffset = None
     self.cameraMatrixes = None
     self._opacity = 0.0
     self.blueprintColor = None
     self.ballpark = sm.GetService('michelle').GetBallpark()
     self.model_valid = self._LoadModel(':variant?placement', display=True)
     self.model_invalid = self._LoadModel(':variant?forbiddenplacement',
                                          display=False)
     self.on_location_updated = Signal()
     self.UpdateModel()
예제 #21
0
파일: wiener.py 프로젝트: zkmartin/nls
    def G_n(self, n, x):
        # Sanity check
        if n < 0:
            raise ValueError(
                '!! degree of any Wiener operator must be non-negative')

        if n == 0: y_n = self.kernels[()] * np.ones_like(x)
        else:
            y_n = np.zeros_like(x)
            for i in range(n // 2 + 1):
                y_n += self.G_n_i(n, i, x)

        output = Signal(y_n)
        output.__array_finalize__(x)
        return output
예제 #22
0
    def response(self, input_, **kwargs):
        # Calculate
        y = np.zeros_like(input_)
        pool = self.kernels.params.keys()
        for lags in pool:
            assert isinstance(lags, tuple)
            # lags = (\tau_1, \tau_2, \cdots, \tau_k)
            # prod = h_k(\tau_1, \cdots, \tau_k) * \prod_{i=1}^k x[n-\tau_i]
            prod = self.kernels[lags]
            for lag in lags:
                prod *= self._delay(input_, lag)
            y += prod

        output = Signal(y)
        output.__array_finalize__(input_)
        return output
예제 #23
0
 def __init__(self):
     sm.RegisterNotify(self)
     self.remoteSvc = sm.RemoteSvc(REMOTE_SERVICE_NAME)
     self.objectCashingSvc = sm.GetService('objectCaching')
     self.on_new_group_created = Signal()
     self.on_group_selected = Signal()
     self.on_groupmembers_changed = Signal()
     self.on_groupmembers_removed = Signal()
     self.on_group_deleted = Signal()
     self.on_group_updated = Signal()
     self.on_groups_reload = Signal()
     self.membersByGroupID = {}
     self.groupByGroupID = None
     self.publicGroupsByGroupID = {}
     self.myGroupsCacheInvalidated = False
     self.currentSearchResults = None
def test_get_signal_edge_cases():

    
    # Test that empty strings cant be created for Signal class
    with pytest.raises(Exception, match="Signal string can not be empty") as exec_info:
        signal = Signal("")


    # Test that empty strings cant be created for subclasses of Signal class
    with pytest.raises(Exception, match="Signal string can not be empty") as exec_info:
        signal = RadarSignal("")

    with pytest.raises(Exception, match="Signal string can not be empty") as exec_info:
        signal = IntruderSignal("")


    # Test that the constructor does not take none as argument
    with pytest.raises(Exception, match="Signal string can not be empty") as exec_info:
        signal = RadarSignal(None)
예제 #25
0
    def parse(self, s, debug=False):
        self.clear()
        lines = s.strip().split("\n")
        if debug:
            print "Parsing message"
            print lines
        header = lines[0]
        parts = header.split(" ")
        if parts[0] != "BO_":
            print "Aborting: Expected \"BO_\" at beginning of message. Got \"" + parts[
                0] + "\"."
            return
        self.ID = int(parts[1])
        self.name = parts[2][:-1]
        self.DLC = int(parts[3])
        # TODO: Evaluate whatever is the meaning of "Vector__XXX"

        for line in lines[1:]:
            self.signals.append(Signal(line, debug))
예제 #26
0
파일: data_utils.py 프로젝트: zkmartin/nls
def sys97(x):
    assert isinstance(x, Signal)
    N = x.size
    v1 = np.zeros_like(x)
    v2 = np.zeros_like(x)
    for n in range(N):
        x_1 = x[n - 1] if n - 1 >= 0 else 0
        x_2 = x[n - 2] if n - 2 >= 0 else 0

        v1_1 = v1[n - 1] if n - 1 >= 0 else 0
        v1_2 = v1[n - 2] if n - 2 >= 0 else 0
        v1[n] = 1.2 * v1_1 - 0.6 * v1_2 + 0.5 * x_1

        v2_1 = v2[n - 1] if n - 1 >= 0 else 0
        v2_2 = v2[n - 2] if n - 2 >= 0 else 0
        v2_3 = v2[n - 3] if n - 3 >= 0 else 0
        v2[n] = 1.8 * v2_1 - 1.1 * v2_2 + 0.2 * v2_3 + 0.1 * (x_1 + x_2)

    y = (v1 + 0.8 * v2 * v2 - 0.6 * v1 * v1 * v2) * np.sin((v1 + v2) / 5)
    output = Signal(y, fs=x.fs)
    return output
예제 #27
0
    def inference(self, input_, orders=None, *args, **kwargs):
        if not isinstance(input_, Signal):
            raise TypeError('!! Input must be an instance of Signal')

        # Update Phi
        self._update_Phi_naive(input_)

        # Calculate output
        y = self.coefs[()] * np.ones_like(input_)
        pool = (self.coefs.get_indices(symmetric=False)
                if orders is None else self.coefs.get_homogeneous_indices(
                    orders, self.memory_depth[orders + 1], symmetric=False))
        for indices in pool:
            y_ = self.coefs[indices] * np.ones_like(input_)
            for index in indices:
                y_ *= self.Phi[index]
            y += y_

        output = Signal(y)
        output.__array_finalize__(input_)
        return output
예제 #28
0
파일: wiener.py 프로젝트: zkmartin/nls
    def G_n_i(self, n, i, x):
        y_i = np.zeros_like(x)

        # multiplicity is n - i
        indices_pool = self.kernels.get_homogeneous_indices(
            n - i, self.memory_depth[n - i - 1], symmetric=False)
        for indices in indices_pool:
            assert isinstance(indices, list) or isinstance(indices, tuple)
            # Determine indices
            lags = indices + indices[slice(n - 2 * i, n - i)]
            x_lags = indices[slice(n - 2 * i)]

            prod = self.kernels[lags]
            if prod == 0: continue

            for lag in x_lags:
                prod *= self._delay(x, lag)
            y_i += prod

        output = Signal(y_i * self._get_coef(n, i))
        output.__array_finalize__(x)
        return output
예제 #29
0
파일: app.py 프로젝트: zsalch/frescobaldi
import os
import sys

from PyQt5.QtCore import QSettings, QThread
from PyQt5.QtWidgets import QApplication

import appinfo

qApp = None  # instantiate() puts the QApplication obj. here
windows = []
documents = []

from signals import Signal, SignalContext

# signals
appInstantiated = Signal()  # Called when the QApplication is instantiated
appStarted = Signal()  # Called when the main event loop is entered
aboutToQuit = Signal()  # Use this and not qApp.aboutToQuit
mainwindowCreated = Signal()  # MainWindow
mainwindowClosed = Signal()  # MainWindow
documentCreated = Signal()  # Document
documentUrlChanged = Signal()  # Document
documentLoaded = Signal()  # Document
documentModificationChanged = Signal()  # Document
documentClosed = Signal()  # Document
documentSaved = Signal()  # Document
documentSaving = SignalContext()  # Document
viewCreated = Signal()  # View
viewSpaceCreated = Signal()  # ViewSpace (see viewmanager.py)
languageChanged = Signal()  # (no arguments)
settingsChanged = Signal()  # (no arguments)
예제 #30
0
파일: client.py 프로젝트: treverson/bitex-2
class BitExThreadedClient(WebSocketClient):
    signal_heartbeat = Signal()
    signal_logged = Signal()
    signal_error_login = Signal()
    signal_execution_report = Signal()
    signal_balance = Signal()  # U3
    signal_security_list = Signal()  # y
    signal_news = Signal()  # B
    signal_error = Signal()  #ERROR

    signal_deposit_refresh = Signal()
    signal_deposit_response = Signal()
    signal_process_deposit_response = Signal()

    signal_verify_customer_response = Signal()
    signal_verify_customer_update = Signal()

    signal_connection_open = Signal()
    signal_connection_closed = Signal()

    signal_book_bid_clear = Signal()
    signal_book_bid_new_order = Signal()
    signal_book_bid_update_order = Signal()
    signal_book_bid_delete_order = Signal()
    signal_book_bid_delete_thru = Signal()
    signal_book_offer_clear = Signal()
    signal_book_offer_new_order = Signal()
    signal_book_offer_update_order = Signal()
    signal_book_offer_delete_order = Signal()
    signal_book_offer_delete_thru = Signal()

    signal_trade_clear = Signal()
    signal_trade = Signal()

    signal_recv = Signal()
    signal_send = Signal()

    is_logged = False
    is_connected = False

    def closed(self, code, reason):
        print 'BitExThreadedClient::closed'
        self.is_connected = False
        self.is_logged = False
        self.signal_connection_closed(self, (code, reason))

    def opened(self):
        self.is_connected = True
        self.is_logged = False
        self.signal_connection_open(self)

    def send(self, payload, binary=False):
        if self.is_connected:
            self.signal_send(self, payload)
            super(BitExThreadedClient, self).send(payload, binary)

    def login(self, user, password):
        if not user or not password:
            raise ValueError('Invalid parameters')

        loginMsg = {
            'UserReqID': 'initial',
            'MsgType': 'BE',
            'Username': user,
            'Password': password,
            'UserReqTyp': '1'
        }
        self.send(json.dumps(loginMsg))

    def testRequest(self, request_id=None):
        if request_id:
            self.send(json.dumps({'MsgType': '1', 'TestReqID': request_id}))
        else:
            self.send(
                json.dumps({
                    'MsgType': '1',
                    'TestReqID': int(time.time() * 1000)
                }))

    def verifyCustomer(self,
                       client_id,
                       verify,
                       verification_data,
                       opt_request_id=None):
        if not opt_request_id:
            opt_request_id = random.randint(1, 10000000)

        msg = {
            'MsgType': 'B8',
            'VerifyCustomerReqID': opt_request_id,
            'ClientID': client_id,
            'Verify': verify,
            'VerificationData': verification_data
        }

        self.send(json.dumps(msg))

        return opt_request_id

    def processDeposit(self,
                       action,
                       opt_request_id=None,
                       opt_secret=None,
                       opt_depositId=None,
                       opt_reasonId=None,
                       opt_reason=None,
                       opt_amount=None,
                       opt_percent_fee=None,
                       opt_fixed_fee=None):
        if not opt_request_id:
            opt_request_id = random.randint(1, 10000000)

        msg = {
            'MsgType': 'B0',
            'ProcessDepositReqID': opt_request_id,
            'Action': action
        }

        if opt_secret:
            msg['Secret'] = opt_secret

        if opt_depositId:
            msg['DepositID'] = opt_depositId

        if opt_reasonId:
            msg['ReasonID'] = opt_reasonId

        if opt_reason:
            msg['Reason'] = opt_reason

        if opt_amount:
            msg['Amount'] = opt_amount

        if opt_percent_fee:
            msg['PercentFee'] = opt_percent_fee

        if opt_fixed_fee:
            msg['FixedFee'] = opt_fixed_fee

        self.send(json.dumps(msg))

        return opt_request_id

    def requestBalances(self, request_id=None, client_id=None):
        if not request_id:
            request_id = random.randint(1, 10000000)
        msg = {'MsgType': 'U2', 'BalanceReqID': request_id}
        if client_id:
            msg['ClientID'] = client_id
        self.send(json.dumps(msg))

        return request_id

    def requestMarketData(self,
                          request_id,
                          symbols,
                          entry_types,
                          subscription_type='1',
                          market_depth=0,
                          update_type='1'):
        if not symbols or not entry_types:
            raise ValueError('Invalid parameters')

        subscribe_msg = {
            'MsgType': 'V',
            'MDReqID': request_id,
            'SubscriptionRequestType': subscription_type,
            'MarketDepth': market_depth,
            'MDUpdateType': update_type,  #
            'MDEntryTypes': entry_types,  # bid , offer, trade
            'Instruments': symbols
        }
        self.send(json.dumps(subscribe_msg))

        return request_id

    def sendLimitedBuyOrder(self, symbol, qty, price, clientOrderId):
        if not symbol or not qty or not qty or not price or not clientOrderId:
            raise ValueError('Invalid parameters')

        if qty <= 0 or price <= 0:
            raise ValueError('Invalid qty or price')

        msg = {
            'MsgType': 'D',
            'ClOrdID': str(clientOrderId),
            'Symbol': symbol,
            'Side': '1',
            'OrdType': '2',
            'Price': price,
            'OrderQty': qty
        }
        self.send(json.dumps(msg))

    def sendLimitedSellOrder(self, symbol, qty, price, clientOrderId):
        if not symbol or not qty or not qty or not price or not clientOrderId:
            raise ValueError('Invalid parameters')

        if qty <= 0 or price <= 0:
            raise ValueError('Invalid qty or price')

        msg = {
            'MsgType': 'D',
            'ClOrdID': str(clientOrderId),
            'Symbol': symbol,
            'Side': '2',
            'OrdType': '2',
            'Price': price,
            'OrderQty': qty
        }
        self.send(json.dumps(msg))

    def sendMsg(self, msg):
        self.send(json.dumps(msg))

    def received_message(self, message):
        msg = json.loads(str(message))

        self.signal_recv(self, msg)

        if msg['MsgType'] == '0':
            self.signal_heartbeat(self, msg)
        elif msg['MsgType'] == 'BF':
            if msg['UserStatus'] == 1:
                self.is_logged = True
                self.signal_logged(self, msg)
            else:
                self.signal_error_login(self, msg)
        elif msg['MsgType'] == '8':
            self.signal_execution_report(self, msg)

        elif msg['MsgType'] == 'U3':
            self.signal_balance(self, msg)

        elif msg['MsgType'] == 'y':
            self.signal_security_list(self, msg)

        elif msg['MsgType'] == 'B':
            self.signal_news(self, msg)

        elif msg['MsgType'] == 'ERROR':
            self.signal_error(self, msg)

        elif msg['MsgType'] == 'B1':  #Process Deposit Response
            self.signal_process_deposit_response(self, msg)

        elif msg['MsgType'] == 'B9':  #Verification Customer Response
            self.signal_verify_customer_response(self, msg)

        elif msg['MsgType'] == 'B11':  #Verification Customer Update
            self.signal_verify_customer_update(self, msg)

        elif msg['MsgType'] == 'U19':  #Deposit Response
            self.signal_deposit_response(self, msg)

        elif msg['MsgType'] == 'U23':  #Deposit Refresh
            self.signal_deposit_refresh(self, msg)

        elif msg['MsgType'] == 'X':  # Market Data Incremental Refresh
            if msg['MDBkTyp'] == '3':  # Order Depth
                for entry in msg['MDIncGrp']:
                    if entry['MDEntryType'] == '0':
                        if entry['MDUpdateAction'] == '0':
                            self.signal_book_bid_new_order(self, entry)
                        elif entry['MDUpdateAction'] == '1':
                            self.signal_book_bid_update_order(self, entry)
                        elif entry['MDUpdateAction'] == '2':
                            self.signal_book_bid_delete_order(self, entry)
                        elif entry['MDUpdateAction'] == '3':
                            self.signal_book_bid_delete_thru(self, entry)
                    elif entry['MDEntryType'] == '1':
                        if entry['MDUpdateAction'] == '0':
                            self.signal_book_offer_new_order(self, entry)
                        elif entry['MDUpdateAction'] == '1':
                            self.signal_book_offer_update_order(self, entry)
                        elif entry['MDUpdateAction'] == '2':
                            self.signal_book_offer_delete_order(self, entry)
                        elif entry['MDUpdateAction'] == '3':
                            self.signal_book_offer_delete_thru(self, entry)
                    elif entry['MDEntryType'] == '2':
                        self.signal_trade(self, entry)

        elif msg['MsgType'] == 'W':  # Market Data Refresh
            if msg['MarketDepth'] != 1:  # Has Market Depth
                self.signal_book_bid_clear(self, "")
                self.signal_book_offer_clear(self, "")
                self.signal_trade_clear(self, "")

                for entry in msg['MDFullGrp']:
                    if entry['MDEntryType'] == '0':
                        self.signal_book_bid_new_order(self, entry)
                    elif entry['MDEntryType'] == '1':
                        self.signal_book_offer_new_order(self, entry)
                    elif entry['MDEntryType'] == '2':
                        self.signal_trade(self, entry)