پیتھون کے ساتھ ایونٹ سے چلنے والی بیک ٹیسٹنگ - حصہ II

مصنف:نیکی, تخلیق: 2019-03-23 09:13:33, تازہ کاری:

پچھلے مضمون میں ہم نے ایونٹ سے چلنے والے بیک ٹیسٹر کے تصور کی وضاحت کی۔ اس سلسلے کے باقی مضامین میں مجموعی نظام کو تشکیل دینے والی علیحدہ طبقاتی درجہ بندی میں سے ہر ایک پر توجہ دی جائے گی۔ اس مضمون میں ہم واقعات پر غور کریں گے اور ان کا استعمال اشیاء کے مابین معلومات کی منتقلی کے لئے کس طرح کیا جاسکتا ہے۔

جیسا کہ پچھلے مضمون میں تبادلہ خیال کیا گیا ہے ، تجارتی نظام دو جبکہ لوپس کا استعمال کرتا ہے - ایک بیرونی اور ایک اندرونی۔ اندرونی جبکہ لوپ میموری میں قطار سے واقعات کی گرفتاری کو سنبھالتا ہے ، جو پھر بعد کی کارروائی کے لئے مناسب جزو کو روٹ کیا جاتا ہے۔ اس انفراسٹرکچر میں چار قسم کے واقعات ہیں:

  • مارکیٹ ایونٹ - یہ اس وقت شروع ہوتا ہے جب بیرونی جبکہ لوپ ایک نیا heartbeat شروع ہوتا ہے۔ یہ اس وقت ہوتا ہے جب ڈیٹا ہینڈلر آبجیکٹ کو کسی بھی علامت کے لئے مارکیٹ کے اعداد و شمار کی ایک نئی تازہ کاری موصول ہوتی ہے جس کی فی الحال نگرانی کی جارہی ہے۔ اس کا استعمال حکمت عملی آبجیکٹ کو نئے تجارتی سگنل پیدا کرنے کے لئے کیا جاتا ہے۔ ایونٹ آبجیکٹ میں صرف ایک شناخت ہوتی ہے کہ یہ مارکیٹ کا واقعہ ہے ، جس کی کوئی دوسری ساخت نہیں ہے۔
  • سگنل ایونٹ - حکمت عملی آبجیکٹ نئے سگنل ایونٹس بنانے کے لئے مارکیٹ کے اعداد و شمار کا استعمال کرتا ہے۔ سگنل ایونٹ میں ایک ٹکر علامت ، ایک ٹائم اسٹیمپ ہوتا ہے جب یہ تیار کیا گیا تھا اور ایک سمت (لانگ یا شارٹ) ہوتی ہے۔ سگنل ایونٹس کو پورٹ فولیو آبجیکٹ کے ذریعہ تجارت کے طریقہ کار کے لئے مشورے کے طور پر استعمال کیا جاتا ہے۔
  • آرڈر ایونٹ - جب کسی پورٹ فولیو آبجیکٹ کو سگنل ایونٹس موصول ہوتے ہیں تو وہ خطرے اور پوزیشن سائزنگ کے لحاظ سے ، پورٹ فولیو کے وسیع تر سیاق و سباق میں ان کا اندازہ کرتا ہے۔ اس کے نتیجے میں آرڈر ایونٹس پیدا ہوتے ہیں جو ایک ایگزیکشن ہینڈلر کو بھیجے جائیں گے۔
  • FillEvent - جب ایک ایگزیکشن ہینڈلر کو آرڈر ایونٹ موصول ہوتا ہے تو اسے آرڈر پر ٹرانزیکشن کرنا پڑتا ہے۔ ایک بار جب آرڈر پر ٹرانزیکشن کیا جاتا ہے تو یہ ایک FillEvent تیار کرتا ہے ، جو خریداری یا فروخت کی لاگت کے ساتھ ساتھ ٹرانزیکشن کے اخراجات ، جیسے فیس یا سلائپج کی وضاحت کرتا ہے۔

والدین کلاس کو ایونٹ کہا جاتا ہے۔ یہ ایک بیس کلاس ہے اور کوئی فعالیت یا مخصوص انٹرفیس فراہم نہیں کرتی ہے۔ بعد کی عمل درآمد میں ایونٹ آبجیکٹ زیادہ پیچیدگی پیدا کرنے کا امکان رکھتے ہیں اور اس طرح ہم کلاس درجہ بندی تشکیل دے کر ایسے نظاموں کے ڈیزائن کو مستقبل کے ثبوت فراہم کر رہے ہیں۔

# event.py

class Event(object):
    """
    Event is base class providing an interface for all subsequent 
    (inherited) events, that will trigger further events in the 
    trading infrastructure.   
    """
    pass

مارکیٹ ایونٹ ایونٹ سے وراثت کرتا ہے اور خود کی شناخت سے زیادہ کچھ نہیں فراہم کرتا ہے کہ یہ مارکیٹ قسم کا واقعہ ہے۔

# event.py

class MarketEvent(Event):
    """
    Handles the event of receiving a new market update with 
    corresponding bars.
    """

    def __init__(self):
        """
        Initialises the MarketEvent.
        """
        self.type = 'MARKET'

ایک سگنل ایونٹ کو ایک ٹکر علامت، پیداوار کے لئے ایک ٹائم اسٹیمپ اور ایک سمت کی ضرورت ہوتی ہے تاکہ ایک پورٹ فولیو آبجیکٹ کو مشورہ دیا جاسکے.

# event.py

class SignalEvent(Event):
    """
    Handles the event of sending a Signal from a Strategy object.
    This is received by a Portfolio object and acted upon.
    """
    
    def __init__(self, symbol, datetime, signal_type):
        """
        Initialises the SignalEvent.

        Parameters:
        symbol - The ticker symbol, e.g. 'GOOG'.
        datetime - The timestamp at which the signal was generated.
        signal_type - 'LONG' or 'SHORT'.
        """
        
        self.type = 'SIGNAL'
        self.symbol = symbol
        self.datetime = datetime
        self.signal_type = signal_type

آرڈر ایونٹ ایک سگنل ایونٹ سے قدرے زیادہ پیچیدہ ہے کیونکہ اس میں سگنل ایونٹ کی مذکورہ بالا خصوصیات کے علاوہ ایک مقدار کا میدان بھی شامل ہے۔ مقدار پورٹ فولیو کی پابندیوں سے طے ہوتی ہے۔ اس کے علاوہ آرڈر ایونٹ میں پرنٹ_ آرڈر (()) طریقہ ہے ، جو اگر ضروری ہو تو کنسول میں معلومات کو آؤٹ پٹ کرنے کے لئے استعمال ہوتا ہے۔

# event.py

class OrderEvent(Event):
    """
    Handles the event of sending an Order to an execution system.
    The order contains a symbol (e.g. GOOG), a type (market or limit),
    quantity and a direction.
    """

    def __init__(self, symbol, order_type, quantity, direction):
        """
        Initialises the order type, setting whether it is
        a Market order ('MKT') or Limit order ('LMT'), has
        a quantity (integral) and its direction ('BUY' or
        'SELL').

        Parameters:
        symbol - The instrument to trade.
        order_type - 'MKT' or 'LMT' for Market or Limit.
        quantity - Non-negative integer for quantity.
        direction - 'BUY' or 'SELL' for long or short.
        """
        
        self.type = 'ORDER'
        self.symbol = symbol
        self.order_type = order_type
        self.quantity = quantity
        self.direction = direction

    def print_order(self):
        """
        Outputs the values within the Order.
        """
        print "Order: Symbol=%s, Type=%s, Quantity=%s, Direction=%s" % \
            (self.symbol, self.order_type, self.quantity, self.direction)

فل ایونٹ سب سے زیادہ پیچیدگی والا واقعہ ہے۔ اس میں ایک آرڈر کی تکمیل کے وقت کا ٹائم اسٹیمپ ، آرڈر کی علامت اور تبادلے پر اس پر عملدرآمد کیا گیا ، لین دین کردہ حصص کی مقدار ، خریداری کی اصل قیمت اور کمیشن شامل ہے۔

کمیشن کا حساب انٹرایکٹو بروکرز کمیشن کا استعمال کرتے ہوئے کیا جاتا ہے۔ امریکی API کے احکامات کے لئے یہ کمیشن کم از کم 1.30 امریکی ڈالر فی آرڈر ہے ، جس میں تجارت کا سائز 500 اکائیوں سے کم یا زیادہ ہے اس پر منحصر ہے کہ 0.013 امریکی ڈالر یا 0.08 امریکی ڈالر فی شیئر کی فلیٹ شرح ہے۔

# event.py

class FillEvent(Event):
    """
    Encapsulates the notion of a Filled Order, as returned
    from a brokerage. Stores the quantity of an instrument
    actually filled and at what price. In addition, stores
    the commission of the trade from the brokerage.
    """

    def __init__(self, timeindex, symbol, exchange, quantity, 
                 direction, fill_cost, commission=None):
        """
        Initialises the FillEvent object. Sets the symbol, exchange,
        quantity, direction, cost of fill and an optional 
        commission.

        If commission is not provided, the Fill object will
        calculate it based on the trade size and Interactive
        Brokers fees.

        Parameters:
        timeindex - The bar-resolution when the order was filled.
        symbol - The instrument which was filled.
        exchange - The exchange where the order was filled.
        quantity - The filled quantity.
        direction - The direction of fill ('BUY' or 'SELL')
        fill_cost - The holdings value in dollars.
        commission - An optional commission sent from IB.
        """
        
        self.type = 'FILL'
        self.timeindex = timeindex
        self.symbol = symbol
        self.exchange = exchange
        self.quantity = quantity
        self.direction = direction
        self.fill_cost = fill_cost

        # Calculate commission
        if commission is None:
            self.commission = self.calculate_ib_commission()
        else:
            self.commission = commission

    def calculate_ib_commission(self):
        """
        Calculates the fees of trading based on an Interactive
        Brokers fee structure for API, in USD.

        This does not include exchange or ECN fees.

        Based on "US API Directed Orders":
        https://www.interactivebrokers.com/en/index.php?f=commission&p=stocks2
        """
        full_cost = 1.3
        if self.quantity <= 500:
            full_cost = max(1.3, 0.013 * self.quantity)
        else: # Greater than 500
            full_cost = max(1.3, 0.008 * self.quantity)
        full_cost = min(full_cost, 0.5 / 100.0 * self.quantity * self.fill_cost)
        return full_cost

سیریز کے اگلے مضمون میں ہم ایک ہی کلاس انٹرفیس کے ذریعے ، تاریخی بیک ٹیسٹنگ اور براہ راست تجارت دونوں کی اجازت دینے والے مارکیٹ ڈیٹا ہینڈلر کلاس درجہ بندی کو کس طرح تیار کرنے پر غور کرنے جارہے ہیں۔


مزید