یہ مضمون تجارتی فریم ورک کو سیکھنے کے لیے حجم بڑھانے والی حکمت عملی کو ظاہر کرتا ہے، جو بنیادی طور پر روایتی ثالثی مارکیٹ سازی کی حکمت عملی سے مختلف ہے۔ اس حکمت عملی کا بنیادی مقصد قیمت کے فرق کے ثالثی کے ذریعے منافع حاصل کرنے کے بجائے ایک ہی قیمت پر خرید و فروخت کے ذریعے تجارتی حجم کو بڑھانا اور تبادلے کی چھوٹ یا سطحی چھوٹ حاصل کرنا ہے۔
اس مضمون میں فراہم کردہ کوڈ صرف ایک حوالہ فریم ورک ہے اور اس میں کوئی حقیقی وقت میں آپریشن کا تجربہ نہیں ہے۔ اس مضمون میں حکمت عملی کا نفاذ صرف تکنیکی سیکھنے اور تحقیقی مقاصد کے لیے ہے اور اصل مارکیٹ کے ماحول میں اس کی مکمل تصدیق نہیں کی گئی ہے۔ جب قارئین اس مضمون کے مواد کا حوالہ دیتے ہیں، تو انہیں کافی بیک ٹیسٹنگ کی تصدیق اور خطرے کی تشخیص کرنی چاہیے، اور اسے ریئل ٹائم ٹریڈنگ کے لیے براہ راست استعمال نہیں کرنا چاہیے۔
ڈیجیٹل کرنسی مارکیٹ میں، مارکیٹ بنانے کی حکمت عملی نہ صرف مارکیٹ کی لیکویڈیٹی کو بہتر بنانے اور لین دین کو فروغ دینے کا ایک آلہ ہے، بلکہ بہت سی مقداری تجارتی حکمت عملیوں کا ایک اہم جزو بھی ہے۔ مارکیٹ بنانے والے بازار کے مختلف ماحول میں خرید و فروخت کے حوالے پوسٹ کرکے اور لیکویڈیٹی فراہم کرکے منافع کماتے ہیں۔ پیشہ ورانہ مارکیٹ سازوں کے کوڈ کا نفاذ اکثر انتہائی پیچیدہ ہوتا ہے، جس میں اعلی درجے کے افعال شامل ہوتے ہیں جیسے کہ ہائی فریکوئنسی تاخیر کی اصلاح، پیچیدہ رسک کنٹرول سسٹم، اور ملٹی ایکسچینج آربیٹریج۔ اس بار، ہم برش والیوم کاؤنٹر ٹریڈنگ حکمت عملی کے بنیادی تصورات کا مطالعہ کریں گے اور انوینٹر کوانٹیٹیو (FMZ) پلیٹ فارم پر سیکھنے کے ایک آسان فریم ورک کو کیسے نافذ کیا جائے۔
اس مضمون کا مرکزی حصہ اصل مصنف زینان کے “مارکیٹ بنانے کی حکمت عملی کا آئیڈیا اور تحریری طریقہ” سے آیا ہے۔ کچھ حصوں کو بہتر بنایا گیا ہے اور fmz پلیٹ فارم پر دوبارہ تیار کیا گیا ہے۔ آج کے نقطہ نظر سے، لکھنے کے کچھ طریقے پرانے ہو سکتے ہیں، لیکن یہ اب بھی ہر ایک کے لیے کوڈ کی ساخت اور کاؤنٹر ٹریڈنگ کے بنیادی خیالات کو سمجھنا متاثر کن ہے:
مارکیٹ سازی کی حکمت عملی سے مراد تاجر (مارکیٹ بنانے والے) ایک ہی وقت میں مارکیٹ میں خرید و فروخت کے آرڈر دیتے ہیں، اس طرح مارکیٹ کے استحکام کو برقرار رکھنے کے لیے لیکویڈیٹی فراہم کرتے ہیں۔ یہ حکمت عملی نہ صرف مارکیٹ کی گہرائی کو برقرار رکھنے میں مدد کرتی ہے بلکہ دوسرے تاجروں کے لیے ہم منصب بھی فراہم کرتی ہے۔ مختلف قیمتوں کی حدود میں خرید و فروخت کے حوالے فراہم کرکے، مارکیٹ بنانے والے قیمت کے اتار چڑھاو سے منافع حاصل کرتے ہیں۔
کرپٹو کرنسی مارکیٹ کے لیے مارکیٹ بنانے والوں کا کردار بہت اہم ہے، خاص طور پر کم تجارتی حجم اور زیادہ اتار چڑھاؤ والی مارکیٹوں میں۔ لیکویڈیٹی فراہم کر کے، مارکیٹ بنانے والے مارکیٹ کی پھسلن کو کم کرنے میں مدد کرتے ہیں اور تاجروں کو تجارت کے لیے آسان قیمتیں فراہم کرتے ہیں۔
روایتی مارکیٹ بنانے کی حکمت عملی کا بنیادی اصول لیکویڈیٹی فراہم کر کے بولی مانگنے کے پھیلاؤ کو حاصل کرنا ہے۔ مارکیٹ میکر کی طرف سے پوسٹ کردہ خرید آرڈر کی قیمت فروخت کے آرڈر کی قیمت سے کم ہے، اور منافع لین دین کے پھیلاؤ کے ذریعے حاصل کیا جاتا ہے۔ مثال کے طور پر، جب مارکیٹ میں سپاٹ قیمت بڑھ جاتی ہے، تو مارکیٹ بنانے والا زیادہ قیمت پر فروخت کرتا ہے اور کم قیمت پر خریدتا ہے، جس سے پھیلاؤ کمایا جاتا ہے۔ آمدنی کے اہم ذرائع میں شامل ہیں:
تاہم، مارکیٹ بنانے والوں کو بھی مارکیٹ کے اتار چڑھاؤ کے خطرے کا سامنا کرنا پڑتا ہے، خاص طور پر ڈیجیٹل کرنسی مارکیٹ کے انتہائی غیر مستحکم ماحول میں۔ مارکیٹ میں تیزی سے اتار چڑھاو کی وجہ سے مارکیٹ سازوں کی طرف سے خرید و فروخت کے آرڈرز اصل قیمت سے نمایاں طور پر ہٹ سکتے ہیں، جس کے نتیجے میں نقصان ہو سکتا ہے۔
کریپٹو کرنسی مارکیٹ میں، مارکیٹ بنانے والے عام طور پر مارکیٹ کے حالات، تجارتی حجم، اتار چڑھاؤ وغیرہ کی بنیاد پر مارکیٹ بنانے کی مختلف حکمت عملیوں کا انتخاب کرتے ہیں۔ مارکیٹ بنانے کی حکمت عملیوں کی عام اقسام میں شامل ہیں:
غیر فعال مارکیٹ بنانے کی حکمت عملی:مارکیٹ بنانے والے مارکیٹ کی گہرائی، تاریخی اتار چڑھاؤ اور دیگر عوامل کی بنیاد پر خرید و فروخت کے آرڈر دیتے ہیں اور مارکیٹ کے لین دین کا انتظار کرتے ہیں۔ اس حکمت عملی کی خصوصیت کم تعدد اور مضبوطی ہے، اور مارکیٹ بنانے والے منافع کے حصول کے لیے مارکیٹ کے اتار چڑھاو پر انحصار کرتے ہیں۔
فعال مارکیٹ بنانے کی حکمت عملی: اس حکمت عملی کے تحت، مارکیٹ بنانے والے ڈیل کے امکان کو بڑھانے کے لیے مارکیٹ کے حالات کے مطابق خرید و فروخت کے آرڈرز کی قیمت اور مقدار کو حقیقی وقت میں ایڈجسٹ کرتے ہیں۔ مارکیٹ بنانے والے عام طور پر آرڈرز میں اضافہ کرتے ہیں جب قیمت موجودہ مارکیٹ کی قیمت کے قریب ہوتی ہے تاکہ مارکیٹ کے اتار چڑھاؤ سے بہتر فائدہ اٹھایا جا سکے۔
حجم بڑھانے کی حکمت عملی: حکمت عملی کی قسم جس پر یہ مضمون فوکس کرتا ہے۔حجم بڑھانے کی حکمت عملییہ ایک ہی قیمت پر خرید و فروخت کرکے تجارتی حجم بڑھانے کی حکمت عملی ہے۔ مارکیٹ بنانے کی روایتی حکمت عملیوں کے برعکس، اس حکمت عملی کا بنیادی مقصد قیمتوں میں فرق کمانا نہیں ہے، بلکہ بڑی تعداد میں لین دین کے ذریعے تبادلے کی چھوٹ، سطحی چھوٹ یا لیکویڈیٹی کان کنی کے انعامات حاصل کرنا ہے۔
حجم دھونے کی حکمت عملی میں، مارکیٹ بنانے والے ایک ہی قیمت پر خرید و فروخت کے آرڈر دیتے ہیں۔ جب آرڈرز پر عمل درآمد ہوتا ہے، اگرچہ قیمت میں فرق کا کوئی منافع نہیں ہوتا، تجارتی حجم کو تیزی سے جمع کیا جا سکتا ہے۔ اس حکمت عملی کے منافع کا ماڈل مارکیٹ کے ثالثی کے بجائے مکمل طور پر ایکسچینج کے ترغیبی طریقہ کار پر منحصر ہے۔
اہم خصوصیات:
ایک ہی قیمت کی تجارت:روایتی مارکیٹ بنانے کی حکمت عملیوں سے مختلف، قیمت خرید اور فروخت کی قیمت یکساں ہے، اور قیمت میں کوئی فرق منافع پیدا نہیں ہوتا ہے۔
حجم پر مبنی:اس حکمت عملی کا بنیادی مقصد قیمت کے ثالثی کے بجائے تجارتی حجم کو تیزی سے جمع کرنا ہے۔
مراعات پر انحصار:منافع مکمل طور پر ایکسچینج کی چھوٹ کی پالیسی، VIP سطح کی چھوٹ یا مارکیٹ میکر کے ترغیبی پروگراموں پر منحصر ہیں۔
اہم اختلافات: روایتی مارکیٹ سازی کی حکمت عملیوں کے مقابلے میں، واش ٹریڈنگ کی حکمت عملی حقیقی مارکیٹ لیکویڈیٹی فراہم کر کے منافع کماتی نہیں ہے، بلکہ ایکسچینج سے پالیسی انعامات حاصل کرنے کے لیے مصنوعی طور پر تجارتی حجم پیدا کر کے۔ اس حکمت عملی کو کچھ دائرہ اختیار میں تعمیل کے خطرات کا سامنا کرنا پڑ سکتا ہے اور عملی طور پر لاگو ہونے پر اس کا احتیاط سے جائزہ لینے کی ضرورت ہے۔
کوڈ کا تجزیہ کرنے سے، ہم یہ جان سکتے ہیں کہ اس حکمت عملی میں قیمت خرید اور فروخت کی قیمت بالکل ایک جیسی ہے:
def make_duiqiao_dict(self, trade_amount):
mid_price = self.mid_price # 中间价
trade_price = round(mid_price, self.price_precision) # 精准交易价格
trade_dict = {
'trade_price': trade_price, # 买卖都使用同一个价格
'amount': trade_amount
}
return trade_dict
1. تجارتی حجم برش کرنے کی حکمت عملی
2. فیس کی واپسی کا طریقہ کار
✅ قابل اطلاق منظرنامے۔
❌ لاگو نہیں ہے۔
⚠️ خطرے کی یاد دہانی
یہ مضمون جناب زنان کے کوڈ فریم ورک کا حوالہ دے گا تاکہ حجم بڑھانے والی حکمت عملی کا ایک سادہ نفاذ متعارف کرایا جا سکے، جس میں اس بات پر توجہ مرکوز کی جائے گی کہ تبادلے کے ماحول میں ایک ہی قیمت کی خرید و فروخت کی حکمت عملی کے ذریعے تجارتی حجم کو کیسے جمع کیا جائے۔ حکمت عملی کا فریم ورک دو اہم طبقات پر مشتمل ہے:MidClass اورMarketMakerیہ دونوں طبقے تبادلے کے درمیانی سطح کے تعامل اور دستک کی حکمت عملی کے مخصوص عمل کے لیے ذمہ دار ہیں۔
اس حکمت عملی کا فن تعمیر ایک تہہ دار ڈیزائن کو اپناتا ہے، جو ایکسچینج انٹرفیس اور مارکیٹ بنانے کی حکمت عملی کو الگ کرتا ہے تاکہ اس بات کو یقینی بنایا جا سکے کہ نظام میں اچھی توسیع پذیری اور لچک ہے۔ فن تعمیر کے اہم اجزاء میں شامل ہیں:
MidClassایکسچینج کی درمیانی پرت مارکیٹ ڈیٹا، اکاؤنٹ کی معلومات، آرڈر اسٹیٹس وغیرہ حاصل کرنے کے لیے ایکسچینج انٹرفیس کے ساتھ تعامل کے لیے ذمہ دار ہے۔ یہ پرت بیرونی تبادلے کے ساتھ تمام تعاملات کو سمیٹتی ہے تاکہ اس بات کو یقینی بنایا جا سکے کہ تجارتی منطق اور تبادلے کے انٹرفیس کو جوڑا گیا ہے۔MarketMaker:مارکیٹ بنانے کی حکمت عملی کی کلاس، جو دستک سے تجارت کی حکمت عملی پر عمل درآمد کرنے، زیر التواء آرڈر تیار کرنے، آرڈر کی حیثیت کی جانچ کرنے، حکمت عملی کی حیثیت کو اپ ڈیٹ کرنے وغیرہ کے لیے ذمہ دار ہے۔ یہ مخصوص مارکیٹ سازی اور دستک سے تجارت کی کارروائیاں فراہم کرنے کے لیے ایکسچینج کی درمیانی پرت کے ساتھ تعامل کرتی ہے۔MidClassایکسچینج کی درمیانی پرت کے طور پر، اس کی بنیادی ذمہ داری ایکسچینج کے ساتھ تعامل کو ہینڈل کرنا، تمام بیرونی API کالوں کو سمیٹنا، اور اس کے لیے ایک مختصر انٹرفیس فراہم کرنا ہے۔MarketMakerاستعمال کریں۔ اس کے فن تعمیر میں درج ذیل کلیدی افعال شامل ہیں:
مارکیٹ ڈیٹا کا حصول:
اکاؤنٹ کی معلومات کا انتظام:
آرڈر مینجمنٹ:
ڈیٹا اسٹوریج اور اپ ڈیٹ:
میں ان افعال کو سمیٹ کرMidClassاوپر کی مثال میں، آپ اس بات کو یقینی بنا سکتے ہیں کہ تجارتی حکمت عملی کی کلاس (جیسےMarketMaker) تبادلے کے ساتھ تعامل کرنے کے بارے میں فکر کیے بغیر تجارتی حکمت عملیوں کے نفاذ پر توجہ دیں۔ یہ ڈھانچہ سسٹم کی برقراری اور اسکیل ایبلٹی کو بہتر بناتا ہے، جس سے مختلف ایکسچینجز کے لیے سپورٹ شامل کرنا یا موجودہ فنکشنز کو بہتر بنانا آسان ہو جاتا ہے۔
MarketMakerیہ کراس ٹریڈنگ حکمت عملی کی بنیادی کلاس ہے، جو مارکیٹ سازی کی کارروائیوں اور کراس ٹریڈنگ لین دین کو انجام دینے کے لیے ذمہ دار ہے۔ اس کے فن تعمیر میں درج ذیل اہم ماڈیولز شامل ہیں:
ابتدا:
MidClassتبادلے کی بنیادی معلومات حاصل کریں، جیسے تجارتی جوڑے، درستگی، مارکیٹ کی گہرائی وغیرہ۔ڈیٹا ریفریش:
دستک کی حکمت عملی پر عمل درآمد:
MarketMakerاسے مارکیٹ میں جمع کرایا جائے گا اور اسی وقت خرید و فروخت کے احکامات پر عمل درآمد کیا جائے گا۔ مقصد ایک ہی قیمت پر خرید و فروخت کرکے تجارتی حجم کو تیزی سے جمع کرنا ہے۔MarketMakerیہ اس بات کو یقینی بنانے کے لیے کہ زیر التواء آرڈر پر بروقت کارروائی کی جا سکتی ہے، آرڈر کی حیثیت کو مسلسل چیک کرے گا۔ اگر آرڈر پر عمل درآمد نہیں ہو پاتا، تو یہ آرڈر مکمل ہونے تک زیر التواء آرڈر کی قیمت یا مقدار کو ایڈجسٹ کرے گا۔اسٹیٹس اپ ڈیٹ:
MarketMakerحکمت عملی پر عمل درآمد کے طریقہ کار کو مارکیٹ کے مختلف ماحول کے مطابق ڈھالنے کے لیے متحرک طور پر ایڈجسٹ کیا جائے گا۔کراس ٹریڈنگ حکمت عملی کا نفاذ درست مارکیٹ ڈیٹا اور تیزی سے عمل درآمد پر منحصر ہے۔MarketMakerریئل ٹائم مارکیٹ کی صورتحال کی نگرانی کرکے اور جوابی آرڈر کے طریقہ کار کو استعمال کرتے ہوئے (ایک ہی قیمت پر خرید و فروخت)، تجارتی حجم کو تیزی سے جمع کرکے اسٹریٹجک اہداف حاصل کیے جاسکتے ہیں۔
موجود MarketMakerکلاس شروع کرنے کے طریقہ کار میں، پہلے ایکسچینج کی درستگی کی معلومات حاصل کریں اور حکمت عملی کے پیرامیٹرز کو شروع کریں، جیسے کہ لین دین کے حجم کی درستگی، قیمت کی درستگی، وغیرہ۔
self.precision_info = self.exchange_mid.get_precision() # 获取精度信息
self.price_precision = self.precision_info['price_precision'] # 价格精度
self.amount_precision = self.precision_info['amount_precision'] # 交易量精度
کراس ٹریڈنگ حکمت عملی کا بنیادی مقصد کراس ٹریڈنگ آرڈرز کی ایک لغت تیار کرنا ہے، بشمول خرید و فروخت کی قیمتیں اور مقدار۔ کوڈ درمیانی قیمت کا حساب لگا کر کراس ٹریڈنگ آرڈرز کی لغت تیار کرتا ہے۔
def make_duiqiao_dict(self, trade_amount):
mid_price = self.mid_price # 中间价
trade_price = round(mid_price, self.price_precision) # 精准交易价格
trade_dict = {
'trade_price': trade_price,
'amount': trade_amount
}
return trade_dict
کراس ٹریڈنگ آرڈرز کی تیار کردہ لغت کے مطابق، کراس ٹریڈنگ ٹرانزیکشن کو انجام دیا جاتا ہے۔create_orderطریقہ، ایک ہی وقت میں خرید آرڈر اور فروخت کے آرڈرز رکھیں۔
def make_trade_by_dict(self, trade_dict):
if self.position_amount > trade_dict['amount'] and self.can_buy_amount > trade_dict['amount']:
buy_id = self.exchange_mid.create_order('buy', trade_dict['trade_price'], trade_dict['amount']) # 挂买单
sell_id = self.exchange_mid.create_order('sell', trade_dict['trade_price'], trade_dict['amount']) # 挂卖单
self.traded_pairs['dui_qiao'].append({
'buy_id': buy_id, 'sell_id': sell_id, 'init_time': time.time(), 'amount': trade_dict['amount']
})
باقاعدگی سے آرڈر کی حیثیت کو چیک کریں اور نامکمل آرڈرز پر کارروائی کریں۔GetOrderطریقہ، آرڈر کی حیثیت حاصل کریں، اور آرڈر کی حیثیت کی بنیاد پر آرڈر منسوخ کرنے کا فیصلہ کریں۔ دستک آرڈر کی پروسیسنگ منطق میں بنیادی طور پر درج ذیل اقدامات شامل ہیں:
آرڈر کی حیثیت حاصل کریں۔:
آرڈر کی حیثیت کا فیصلہ:
0(ORDER_STATE_PENDING): مکمل نہیں ہوا (پینڈنگ آرڈر)۔1(ORDER_STATE_CLOSED): مکمل (مکمل تجارت)2(ORDER_STATE_CANCELED): منسوخ کر دیا گیا۔3(ORDER_STATE_UNKNOWN): حیثیت نامعلوم ہے۔آرڈر اسٹیٹس پروسیسنگ:
0)، پھر پولنگ کے اوقات کے مطابق (current_time % 5 == 0) فیصلہ کرتا ہے کہ آیا آرڈر کو منسوخ کرنا ہے۔1)، اور دوسرا آرڈر مکمل نہیں ہوا ہے (اسٹیٹس یہ ہے۔0)، پھر فیصلہ کریں کہ آیا پولنگ کے اوقات کی بنیاد پر نامکمل آرڈر کو منسوخ کرنا ہے۔1)، ٹرانزیکشن والیوم کو اپ ڈیٹ کیا جاتا ہے اور آرڈر کو ریکارڈ سے ہٹا دیا جاتا ہے۔0واقعی نہیں۔1، یہ نامعلوم حیثیت کے طور پر ریکارڈ کیا جاتا ہے اور لاگ ان ہوتا ہے۔اپ ڈیٹ ریکارڈ:
اس آرٹیکل میں پیش کردہ حجم بڑھانے کی حکمت عملی بنیادی طور پر تجارتی فریم ورک کے آرکیٹیکچرل ڈیزائن کو سیکھنے کے لیے استعمال کی گئی ہے، اور اس کی اصل اطلاق کی قدر محدود ہے۔ اگر قارئین حقیقی مارکیٹ بنانے کی حکمت عملیوں میں دلچسپی رکھتے ہیں، تو ہم بعد میں مزید عملی حکمت عملی کا مواد متعارف کرائیں گے:
1. مارکیٹ بنانے کی حکمت عملی
2. متحرک مارکیٹ بنانے کی حکمت عملی
3. ملٹی لیول مارکیٹ بنانے کی حکمت عملی
یہ حکمت عملی حقیقی منافع کی منطق اور رسک مینجمنٹ پر زیادہ توجہ مرکوز کرے گی، جو مقداری تاجروں کے لیے زیادہ قیمتی حوالہ فراہم کرے گی۔
واش ٹریڈنگ کی حکمت عملی ایکسچینج کی ترغیبی پالیسی پر انحصار کرتی ہے۔ اگر پالیسی بدل جاتی ہے تو حکمت عملی غلط ہو سکتی ہے۔ لہذا، حکمت عملی کو پالیسی کی تبدیلیوں سے نمٹنے کے قابل ہونے کی ضرورت ہے، جیسے کہ متحرک طور پر فیس کی شرح کی نگرانی کرنا یا واحد انحصار کے خطرے کو کم کرنے کے لیے متعدد منافع کے ماڈل متعارف کرانا۔ اس کے علاوہ، واش ٹریڈنگ کی حکمت عملی کو مارکیٹ میں ہیرا پھیری اور انضباطی خطرات کا سامنا سمجھا جا سکتا ہے۔ اصل ایپلی کیشنز میں، تاجروں کو متعلقہ قوانین اور ضوابط پر پوری توجہ دینے کی ضرورت ہے تاکہ حکمت عملی کی تعمیل کو یقینی بنایا جا سکے اور ریگولیٹری مسائل کی وجہ سے ہونے والے نقصانات سے بچا جا سکے۔
مجھے امید ہے کہ قارئین بنیادی فریم ورک کے بارے میں اپنی سمجھ کی بنیاد پر اپنے تجارتی تصورات اور مارکیٹ کی سمجھ کی بنیاد پر اپنی حکمت عملیوں کو مزید بہتر اور بہتر بنا سکتے ہیں۔ مقداری تجارت کی توجہ مسلسل سیکھنے، مشق اور بہتری میں مضمر ہے۔ میری خواہش ہے کہ آپ سب مقداری تجارت کے راستے پر مسلسل ترقی کرتے رہیں!
”`python import time, json
class MidClass: def init(self, exchange_instance): “’ 初始化交易所中间层
Args:
exchange_instance: FMZ的交易所结构
'''
self.init_timestamp = time.time() # 记录初始化时间
self.exchange = exchange_instance # 保存交易所对象
self.exchange_name = self.exchange.GetName() # 获取交易所名称
self.trading_pair = self.exchange.GetCurrency() # 获取交易对名称(如 BTC_USDT)
def get_precision(self):
'''
获取交易对的精度信息
Returns:
返回包含精度信息的字典,失败时返回 None
'''
symbol_code = self.exchange.GetCurrency()
ticker = self.exchange.GetTicker(symbol_code) # 回测系统需要
exchange_info = self.exchange.GetMarkets()
data = exchange_info.get(symbol_code)
if not data:
Log("获取市场信息失败", GetLastError())
return None
# 获取该交易对的精度信息
self.precision_info = {
'tick_size': data['TickSize'], # 价格精度
'amount_size': data['AmountSize'], # 数量精度
'price_precision': data['PricePrecision'], # 价格小数位精度
'amount_precision': data['AmountPrecision'], # 数量小数位精度
'min_qty': data['MinQty'], # 最小下单数量
'max_qty': data['MaxQty'] # 最大下单数量
}
return self.precision_info
def get_account(self):
'''
获取账户信息
Returns:
获取信息成功返回 True,获取信息失败返回 False
'''
self.balance = '---' # 账户余额
self.amount = '---' # 账户持仓量
self.frozen_balance = '---' # 冻结余额
self.frozen_stocks = '---' # 冻结持仓量
self.init_balance = None
self.init_stocks = None
self.init_equity = None
try:
account_info = self.exchange.GetAccount() # 获取账户信息
self.balance = account_info['Balance'] # 更新账户余额
self.amount = account_info['Stocks'] # 更新持仓量
self.frozen_balance = account_info['FrozenBalance'] # 更新冻结余额
self.frozen_stocks = account_info['FrozenStocks'] # 更新冻结持仓量
self.equity = self.balance + self.frozen_balance + (self.amount + self.frozen_stocks) * self.last_price
if not self.init_balance or not self.init_stocks or not self.init_equity:
if _G("init_balance") and _G("init_balance") > 0 and _G("init_stocks") and _G("init_stocks") > 0:
self.init_balance = round(_G("init_balance"), 2)
self.init_stocks = round(_G("init_stocks"), 2)
self.init_equity = round(_G("init_equity"), 2)
else:
self.init_balance = round(self.balance + self.frozen_balance, 2)
self.init_stocks = self.amount + self.frozen_stocks
self.init_equity = round(self.init_balance + (self.init_stocks * self.last_price), 2)
_G("init_balance", self.init_balance)
_G("init_stocks", self.init_stocks)
_G("init_equity", self.init_equity)
Log('获取初始eqity', self.init_equity)
self.profit = self.equity - self.init_equity
self.profitratio = round((self.equity - self.init_equity)/self.init_equity, 4) * 100
return True
except:
return False # 获取账户信息失败
def get_ticker(self):
'''
获取市价信息(如买一价、卖一价、最高价、最低价等)
Returns:
获取信息成功返回 True,获取信息失败返回 False
'''
self.high_price = '---' # 最高价
self.low_price = '---' # 最低价
self.sell_price = '---' # 卖一价
self.buy_price = '---' # 买一价
self.last_price = '---' # 最新成交价
self.volume = '---' # 成交量
try:
ticker_info = self.exchange.GetTicker() # 获取市价信息
self.high_price = ticker_info['High'] # 更新最高价
self.low_price = ticker_info['Low'] # 更新最低价
self.sell_price = ticker_info['Sell'] # 更新卖一价
self.buy_price = ticker_info['Buy'] # 更新买一价
self.last_price = ticker_info['Last'] # 更新最新成交价
self.volume = ticker_info['Volume'] # 更新成交量
return True
except:
return False # 获取市价信息失败
def get_depth(self):
'''
获取深度信息(买卖盘的挂单列表)
Returns:
获取信息成功返回 True,获取信息失败返回 False
'''
self.ask_orders = '---' # 卖盘挂单列表
self.bid_orders = '---' # 买盘挂单列表
try:
depth_info = self.exchange.GetDepth() # 获取深度信息
self.ask_orders = depth_info['Asks'] # 更新卖盘挂单列表
self.bid_orders = depth_info['Bids'] # 更新买盘挂单列表
return True
except:
return False # 获取深度信息失败
def get_ohlc_data(self, period=PERIOD_M5):
'''
获取K线信息
Args:
period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,
PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。
'''
self.ohlc_data = self.exchange.GetRecords(period) # 获取K线数据
def create_order(self, order_type, price, amount):
'''
提交一个挂单信息
Args:
order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单
price:挂单价格
amount:挂单数量
Returns:
挂单Id号,可用以取消挂单
'''
if order_type == 'buy':
try:
order_id = self.exchange.Buy(price, amount) # 提交买单
except:
return False # 买单提交失败
elif order_type == 'sell':
try:
order_id = self.exchange.Sell(price, amount) # 提交卖单
except:
return False # 卖单提交失败
return order_id # 返回订单ID
def get_orders(self):
'''
获取未完成的订单列表
Returns:
未完成的订单列表
'''
self.open_orders = self.exchange.GetOrders() # 获取未完成订单
return self.open_orders
def cancel_order(self, order_id):
'''
取消一个挂单信息
Args:
order_id:希望取消的挂单ID号
Returns:
取消挂单成功返回 True,取消挂单失败返回 False
'''
return self.exchange.CancelOrder(order_id) # 取消订单
def refresh_data(self):
'''
刷新信息(账户、市价、深度、K线)
Returns:
刷新信息成功返回 'refresh_data_finish!' 否则返回相应刷新失败的信息提示
'''
if not self.get_ticker(): # 刷新市价信息
return 'false_get_ticker'
if not self.get_account(): # 刷新账户信息
return 'false_get_account'
if not self.get_depth(): # 刷新深度信息
return 'false_get_depth'
try:
self.get_ohlc_data() # 刷新K线信息
except:
return 'false_get_K_line_info'
return 'refresh_data_finish!' # 刷新成功
class MarketMaker: def init(self, mid_class): “’ 初始化做市策略
Args:
mid_class: 交易所中间层对象
'''
self.exchange_mid = mid_class # 交易所中间层对象
self.precision_info = self.exchange_mid.get_precision() # 获取精度信息
self.done_amount = {'dui_qiao': 0} # 已完成交易量
self.price_precision = self.precision_info['price_precision'] # 价格精度
self.amount_precision = self.precision_info['amount_precision'] # 交易量精度
self.traded_pairs = {'dui_qiao': []} # 已挂单的交易对
self.pending_orders = [] # 未完成的订单状态
self.pending_order_count = 0 # 挂单次数
self.buy_amount = 0
self.sell_amount = 0
self.fee = 0
self.fee_rate = 0.08 / 100
self.chart = {
"__isStock": True,
"tooltip": {"xDateFormat": "%Y-%m-%d %H:%M:%S, %A"},
"title": {"text": "挂单数量"},
"xAxis": {"type": "datetime"},
"yAxis": {
"title": {"text": "挂单数量"},
"opposite": False
},
"series": [
{"name": "挂单买量", "id": "挂单买量", "data": []},
{"name": "挂单卖量", "id": "挂单卖量", "dashStyle": "shortdash", "data": []}
]
}
def refresh_data(self):
'''
刷新数据(账户、市价、深度、K线)
'''
self.exchange_mid.refresh_data() # 刷新交易所数据
self.position_amount = 0 if isinstance(self.exchange_mid.amount, str) else self.exchange_mid.amount # 持仓量
self.available_balance = 0 if isinstance(self.exchange_mid.balance, str) else self.exchange_mid.balance # 账户余额
Log('检查ticker', self.exchange_mid.buy_price)
self.can_buy_amount = self.available_balance / float(self.exchange_mid.buy_price) # 可买的数量
self.mid_price = (self.exchange_mid.sell_price + self.exchange_mid.buy_price) / 2 # 中间价
def make_duiqiao_dict(self, trade_amount):
'''
生成对敲挂单字典
Args:
trade_amount: 每次交易量
Returns:
对敲挂单字典列表
'''
Log('3制作对敲挂单字典')
mid_price = self.mid_price # 中间价
trade_price = round(mid_price, self.price_precision) # 精准交易价格
trade_dict = {
'trade_price': trade_price,
'amount': trade_amount
}
Log('返回盘口挂单字典:', trade_dict)
return trade_dict
def make_trade_by_dict(self, trade_dict):
'''
根据交易字典执行交易
Args:
trade_dict: 交易字典
'''
Log('4按照字典开始交易')
self.refresh_data() # 刷新数据
if trade_dict:
Log('当前账户资金: 币数余额: ', self.position_amount, '资金余额: ', self.can_buy_amount)
Log('检查开仓: 币数限制: ', self.position_amount > trade_dict['amount'], '资金限制: ', self.can_buy_amount > trade_dict['amount'])
if self.position_amount > trade_dict['amount'] and self.can_buy_amount > trade_dict['amount']:
buy_id = self.exchange_mid.create_order('buy', trade_dict['trade_price'], trade_dict['amount']) # 挂买单
sell_id = self.exchange_mid.create_order('sell', trade_dict['trade_price'], trade_dict['amount']) # 挂卖单
self.traded_pairs['dui_qiao'].append({
'buy_id': buy_id, 'sell_id': sell_id, 'init_time': time.time(), 'amount': trade_dict['amount']
})
self.last_time = time.time() # 更新上次交易时间
def handle_pending_orders(self):
'''
处理未完成的订单
'''
pending_orders = self.exchange_mid.get_orders() # 获取未完成订单
if len(pending_orders) > 0:
for order in pending_orders:
self.exchange_mid.cancel_order(order['Id']) # 取消未完成订单
def check_order_status(self, current_time):
'''
检查订单状态
current_time: 轮询检查次数
'''
Log('1开始订单信息检查')
Log(self.traded_pairs['dui_qiao'])
self.buy_pending = 0
self.sell_pending = 0
for traded_pair in self.traded_pairs['dui_qiao'].copy():
Log('检查订单:', traded_pair['buy_id'], traded_pair['sell_id'])
try:
buy_order_status = self.exchange_mid.exchange.GetOrder(traded_pair['buy_id']) # 获取买单状态
sell_order_status = self.exchange_mid.exchange.GetOrder(traded_pair['sell_id']) # 获取卖单状态
except:
Log(traded_pair, '取消')
self.exchange_mid.cancel_order(traded_pair['buy_id']) # 取消买单
self.exchange_mid.cancel_order(traded_pair['sell_id']) # 取消卖单
self.traded_pairs['dui_qiao'].remove(traded_pair) # 移除订单
return
Log('检查订单:', traded_pair['buy_id'], buy_order_status, traded_pair['sell_id'], sell_order_status, [sell_order_status['Status'], buy_order_status['Status']])
if [sell_order_status['Status'], buy_order_status['Status']] == [0, 0]:
self.buy_pending += 1
self.sell_pending += 1
if current_time % 5 == 0:
Log('检查挂单,取消挂单(两未完)', buy_order_status['Status'], sell_order_status['Status'], current_time % 5)
self.exchange_mid.cancel_order(traded_pair['buy_id']) # 取消买单
self.exchange_mid.cancel_order(traded_pair['sell_id']) # 取消卖单
self.pending_order_count += 1 # 挂单次数加1
self.traded_pairs['dui_qiao'].remove(traded_pair) # 移除订单
elif {sell_order_status['Status'], buy_order_status['Status']} == {1, 0}:
if buy_order_status['Status'] == ORDER_STATE_PENDING:
self.buy_pending += 1
if sell_order_status['Status'] == ORDER_STATE_PENDING:
self.sell_pending += 1
if current_time % 5 == 0:
Log('检查挂单,取消挂单(一未完)', buy_order_status['Status'], sell_order_status['Status'])
self.done_amount['dui_qiao'] += traded_pair['amount'] # 更新交易量
if buy_order_status['Status'] == ORDER_STATE_PENDING:
self.sell_amount += traded_pair['amount']
self.fee += sell_order_status['Amount'] * self.fee_rate * sell_order_status['Price']
Log('取消该买订单,增加未完成买列表', traded_pair['buy_id'])
self.exchange_mid.cancel_order(traded_pair['buy_id']) # 取消买单
self.pending_orders.append(['buy', buy_order_status['Status']]) # 记录未完成订单
Log('清除前:', self.traded_pairs['dui_qiao'])
Log('清除id:', traded_pair)
self.traded_pairs['dui_qiao'].remove(traded_pair) # 移除订单
Log('清除后:', self.traded_pairs['dui_qiao'])
elif sell_order_status['Status'] == ORDER_STATE_PENDING:
self.buy_amount += traded_pair['amount']
self.fee += buy_order_status['Amount'] * self.fee_rate * buy_order_status['Price']
Log('取消该卖订单,增加未完成卖列表', traded_pair['sell_id'])
self.exchange_mid.cancel_order(traded_pair['sell_id']) # 取消卖单
self.pending_orders.append(['sell', sell_order_status['Status']]) # 记录未完成订单
Log('清除前:', self.traded_pairs['dui_qiao'])
Log('清除id:', traded_pair)
self.traded_pairs['dui_qiao'].remove(traded_pair) # 移除订单
Log('清除后:', self.traded_pairs['dui_qiao'])
elif [sell_order_status['Status'], buy_order_status['Status']] == [1, 1]:
Log('两订单都已完成')
self.buy_amount += traded_pair['amount']
self.sell_amount += traded_pair['amount']
self.fee += buy_order_status['Amount'] * self.fee_rate * buy_order_status['Price']
self.fee += sell_order_status['Amount'] * self.fee_rate * sell_order_status['Price']
Log('完成状态:', buy_order_status['Status'], sell_order_status['Status'], traded_pair['amount'])
self.done_amount['dui_qiao'] += 2 * traded_pair['amount'] # 更新交易量
self.traded_pairs['dui_qiao'].remove(traded_pair) # 移除订单
else:
Log('两订单处于未知状态:', buy_order_status, sell_order_status)
Log('未知订单状态:', buy_order_status['Status'], sell_order_status['Status'])
Log('未知订单信息:', traded_pair)
def update_status(self):
self.exchange_mid.refresh_data()
t