پچھلے مضمون میں ہم نے ایونٹ سے چلنے والے بیک ٹیسٹر کے تصور کی وضاحت کی۔ اس سلسلے کے باقی مضامین میں مجموعی نظام کو تشکیل دینے والی علیحدہ طبقاتی درجہ بندی میں سے ہر ایک پر توجہ دی جائے گی۔ اس مضمون میں ہم واقعات پر غور کریں گے اور ان کا استعمال اشیاء کے مابین معلومات کی منتقلی کے لئے کس طرح کیا جاسکتا ہے۔
جیسا کہ پچھلے مضمون میں تبادلہ خیال کیا گیا ہے ، تجارتی نظام دو جبکہ لوپس کا استعمال کرتا ہے - ایک بیرونی اور ایک اندرونی۔ اندرونی جبکہ لوپ میموری میں قطار سے واقعات کی گرفتاری کو سنبھالتا ہے ، جو پھر بعد کی کارروائی کے لئے مناسب جزو کو روٹ کیا جاتا ہے۔ اس انفراسٹرکچر میں چار قسم کے واقعات ہیں:
والدین کلاس کو ایونٹ کہا جاتا ہے۔ یہ ایک بیس کلاس ہے اور کوئی فعالیت یا مخصوص انٹرفیس فراہم نہیں کرتی ہے۔ بعد کی عمل درآمد میں ایونٹ آبجیکٹ زیادہ پیچیدگی پیدا کرنے کا امکان رکھتے ہیں اور اس طرح ہم کلاس درجہ بندی تشکیل دے کر ایسے نظاموں کے ڈیزائن کو مستقبل کے ثبوت فراہم کر رہے ہیں۔
# 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
سیریز کے اگلے مضمون میں ہم ایک ہی کلاس انٹرفیس کے ذریعے ، تاریخی بیک ٹیسٹنگ اور براہ راست تجارت دونوں کی اجازت دینے والے مارکیٹ ڈیٹا ہینڈلر کلاس درجہ بندی کو کس طرح تیار کرنے پر غور کرنے جارہے ہیں۔