2
پر توجہ دیں
319
پیروکار

ازگر کثیر کرنسی مقداری حکمت عملی کا فریم ورک: ڈیزائن آئیڈیاز اور نفاذ کی تفصیل

میں تخلیق کیا: 2025-08-29 13:10:54, تازہ کاری: 2025-08-31 09:11:53
comments   0
hits   626

تعارف:

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

اس فریم ورک میں درج ذیل خصوصیات ہیں:

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

ہمیں امید ہے کہ یہ مضمون آپ کو ملٹی کرنسی مقداری تجارت کے ساتھ تیزی سے شروع کرنے میں مدد کرے گا۔ ہم ڈویلپرز کو اس تجربے کی بنیاد پر اختراعات اور بہتر بنانے کے لیے بھی خوش آمدید کہتے ہیں، اور مزید جامع اور ذاتی تجارتی حکمت عملی تیار کرتے ہیں۔ آئیے ہم مل کر مقداری تجارت کے راستے کی تلاش جاری رکھیں!

ابتدائی حکمت عملی

تجارتی حکمت عملی کے ابتدائی مرحلے میں، ہم سب سے پہلے عالمی متغیرات کی وضاحت کرتے ہیں۔SYMBOLSQUOTOINTERVAL، ہدف ٹرانزیکشن کرنسی، بنیادی کرنسی اور وقفہ وقت کی نمائندگی کرتا ہے،Infoحکمت عملی کے عمل کے دوران درکار تمام اہم ڈیٹا کو ذخیرہ کرنے کے لیے متغیرات کا استعمال کیا جاتا ہے۔InitInfoفنکشن اس ڈیٹا کو شروع کرتا ہے، بشمول اکاؤنٹ کی معلومات، ٹائم مینجمنٹ، ہر ٹریڈنگ کرنسی کے لیے مارکیٹ ڈیٹا، آرڈر کی معلومات، پوزیشن کی معلومات، وغیرہ۔ یہ ابتدائی اقدامات اس بات کو یقینی بناتے ہیں کہ حکمت عملی کے چلتے وقت ڈیٹا کا ایک واضح ڈھانچہ اور ابتدائی حالت ہو، جو بعد میں حکمت عملی پر عمل درآمد کی بنیاد رکھتا ہے۔

import time
import json 

SYMBOLS = 'LINK,ETH,TRB'
QUOTO = 'USDT'
INTERVAL = 5

# 全局变量,储存数据
# SYMBOLS代表要交易的币种,格式如"BTC,ETH,LTC"
# QUOTO为基础货币,永续合约常见的有USDT,USDC
# INTERVAL代表循环的间隔
Info = {
    'trade_symbols': SYMBOLS.split(','),  # 交易币种
    'base_coin': QUOTO,                   # 基础货币
    'ticker': {},                         # 行情数据
    'order': {},                          # 订单信息
    'account': {},                        # 账户信息
    'precision': {},                      # 精度信息
    'position': {},                       # 仓位信息
    'time': {},                           # 时间相关数据
    'count': {},                          # 计数器
    'interval': INTERVAL                  # 循环的间隔时间
}

# 初始化策略
def InitInfo():

    # 初始化账户信息,初始余额为0
    Info['account'] = {
        'init_balance': 0,  # 初始余额
        'wallet_balance': 0,  # 钱包余额
        'margin_balance': 0,  # 保证金余额
        'margin_used': 0,  # 已用保证金
        'margin_free': 0,  # 可用保证金
        'profit': 0,  # 总收益
        'profit_rate': 0,  # 收益率
        'unrealised_profit': 0,  # 未实现收益
    }

    # 初始化时间数据,控制更新的时间
    Info['time'] = {
        'update_ticker_time': 0,    # 更新行情的时间
        'update_pos_time': 0,       # 更新仓位的时间
        'update_profit_time': 0,    # 更新利润的时间
        'update_account_time': 0,   # 更新账户信息的时间
        'update_status_time': 0,    # 更新状态的时间
        'last_loop_time': 0,        # 上一次主循环的时间
        'loop_delay': 0,             # 循环延迟
        'start_time': time.time()
    }

    # 初始化每个交易币种的数据
    for symbol in Info['trade_symbols']:
        Info['ticker'][symbol] = {'last': 0, 'ask': 0, 'bid': 0}  # 行情
        Info['order'][symbol] = {                                 # 订单信息
            'buy': {'id': 0, 'price': 0, 'amount': 0},
            'sell': {'id': 0, 'price': 0, 'amount': 0}
        }
        Info['position'][symbol] = {                              # 仓位信息
            'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
        }
        Info['precision'][symbol] = {}  # 精度信息初始化为空
        Info['position'][symbol] = {                              # 仓位信息
            'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
        }

مارکیٹ کی معلومات حاصل کریں اور درستگی کا تعین کریں۔

یہ قدم اس بات کو یقینی بناتا ہے کہ ہم جن کرنسیوں پر کارروائی کرتے ہیں ان کی قیمتوں، مقداروں اور دیگر پہلوؤں کی درستگی کے ساتھ ساتھ آرڈر کی مقدار، ایکسچینج کے معیارات پر پورا اترتی ہے۔ مختلف تجارتی جوڑوں (جیسے BTC/USD یا ETH/USDT) کی قیمتوں اور مقداروں کے لیے مختلف کم از کم درستگی کے تقاضے ہوتے ہیں، لہذا ہمیں غیر تعمیل شدہ آرڈرز سے بچنے کے لیے ایکسچینج کے API سے یہ درست معلومات حاصل کرنے کی ضرورت ہے۔ مثال کے طور پر، ETH/USDT دو اعشاریہ مقامات کی اجازت دے سکتا ہے، جبکہ BTC/USDT آٹھ اعشاریہ مقامات کی اجازت دے سکتا ہے۔

مقصد:

  • آرڈر ڈیٹا کی درستگی کو یقینی بنانے کے لیے ہر کرنسی کے لیے قیمت اور مقدار کی درستگی حاصل کریں۔
  • درستگی کی غلطیوں کی وجہ سے آرڈر کی ناکامی کو روکیں۔
# 获取精度信息
def GetPrecision():
    # 获取交易所的市场信息
    for presym in Info['trade_symbols']:
        curcontract = presym + '_USDT.swap'
        exchange.GetTicker(curcontract)
    exchange_info = exchange.GetMarkets()
    
    # 遍历市场中的所有交易对
    for pair, data in exchange_info.items():
        symbol = pair.split('_')[0]  # 永续合约交易对的格式为 BTC_USDT.swap
        
        # 检查该交易对是否为我们要交易的币种,基础货币是否匹配,且是永续合约
        if symbol in Info['trade_symbols'] and pair.split('.')[0].endswith(Info['base_coin']) and pair.endswith('swap'):
            # 获取该交易对的精度信息
            Info['precision'][symbol] = {
                'tick_size': data['TickSize'],                  # 价格精度
                'amount_size': data['AmountSize'],              # 数量精度
                'price_precision': data['PricePrecision'],      # 价格小数位精度
                'amount_precision': data['AmountPrecision'],    # 数量小数位精度
                'min_qty': data['MinQty'],                      # 最小下单数量
                'max_qty': data['MaxQty'],                      # 最大下单数量
                'min_notional': data['MinNotional'],            # 最小交易额
                'ctVal': data['CtVal']                          # 合约价值,如1张代表0.01个币
            }
            
            # 检查合约价值的计价货币是否为symbol,避免币本位情况
            if data['CtValCcy'] != symbol:
                raise Exception("不支持币本位")

GetPrecisionفنکشن

  • APIs کے ذریعے ایکسچینجز سے مارکیٹ کی معلومات حاصل کریں، بشمول تجارتی جوڑوں کے لیے درست ترتیبات۔
  • اہل تجارتی جوڑوں کے لیے، معلومات ریکارڈ کریں جیسے قیمت کی درستگی، مقدار کی درستگی، کم سے کم اور زیادہ سے زیادہ لین دین کی مقدار، اور معاہدے کی قدر۔
  • چیک کرتا ہے کہ آیا یہ سکے کے مارجنڈ ٹرانزیکشن ہے اور اگر ایسا ہے تو استثناء دیتا ہے۔

اقتباسات حاصل کریں۔

API کے ذریعے موجودہ مارکیٹ ڈیٹا تک رسائی حاصل کریں، جیسے کہ تازہ ترین قیمت، بہترین بولی، بہترین پوچھنا، اور آرڈر بک کی گہرائی۔ یہ معلومات بعد کے تجارتی فیصلوں کے لیے اہم ہے۔ حکمت عملی پر منحصر ہے، یہ ڈیٹا کینڈل سٹک چارٹس (OHLC ڈیٹا) یا ٹک بہ ٹک ڈیٹا پر مبنی ہو سکتا ہے۔

مقصد:

  • موجودہ مارکیٹ کا تازہ ترین تجارتی ڈیٹا حاصل کریں تاکہ حکمت عملی اس ڈیٹا کی بنیاد پر خرید و فروخت کے فیصلے کر سکے۔
  • تکنیکی اشارے کے حسابات کے لیے حقیقی وقت اور تاریخی ڈیٹا کے حصول پر مشتمل ہے۔
# 更新行情信息
def UpdateTicker():
    
    # 记录当前更新时间戳
    Info['time']['update_ticker_time'] = time.time() * 1000 # 使用time.time()获取当前时间的时间戳
    
    # 遍历获取到的行情数据
    for ticpre in Info['trade_symbols']:
        
        curcontract = ticpre + '_' + QUOTO + '.swap'
        data = exchange.GetTicker(curcontract)
        
        if not data:
            Log("获取行情失败", GetLastError())
            return
        # 提取交易币种,永续合约格式如 'BTC_USDT.swap',这里取币种名 'BTC'
        symbol = data['Symbol'].split('_')[0]
        
        # 过滤掉不是基础货币(Info['base_coin'])的交易对或不是永续合约的交易对
        if not data['Symbol'].split('.')[0].endswith(Info['base_coin']) or symbol not in Info['trade_symbols'] or not data['Symbol'].endswith('swap'):
            continue
        
        # 更新行情的卖出价、买入价和最后成交价
        Info['ticker'][symbol]['ask'] = float(data['Sell'])  # 卖出价
        Info['ticker'][symbol]['bid'] = float(data['Buy'])   # 买入价
        Info['ticker'][symbol]['last'] = float(data['Last']) # 最后成交价
  1. مارکیٹ ڈیٹا حاصل کریں۔

    • استعمال کریںexchange.GetTickersتمام تجارتی جوڑوں کے لیے ریئل ٹائم مارکیٹ کی معلومات حاصل کریں۔tickerمتغیر تمام لین دین کے جوڑے کی معلومات کو محفوظ کرتا ہے۔
  2. ہینڈلنگ میں خرابی

    • اگر مارکیٹ کا ڈیٹا کامیابی سے حاصل نہیں کیا جا سکتا ہے، تو پروگرام گزر جاتا ہے۔Logفنکشن لاگ اور آؤٹ پٹGetLastErrorغلطی کا پیغام واپس آ گیا۔
  3. اپ ڈیٹ کا وقت

    • استعمال کریںtime.timeموجودہ وقت کے ٹائم اسٹیمپ کو ریکارڈ کرنے کے لیے، جو اس وقت کو نشان زد کرنے کے لیے استعمال ہوتا ہے جب مارکیٹ کو اپ ڈیٹ کیا جاتا ہے۔
  4. ڈیٹا فلٹرنگ

    • مارکیٹ ڈیٹا سے ٹریڈنگ کرنسی کا نام نکالیں۔
    • ایسے تجارتی جوڑوں کو فلٹر کریں جو ضروریات کو پورا نہیں کرتے ہیں، جیسے تجارتی جوڑے جو بنیادی کرنسی میں آباد نہیں ہیں یا تجارتی جوڑے جو دائمی معاہدے نہیں ہیں۔
  5. مارکیٹ ڈیٹا کو اپ ڈیٹ کریں۔

    • قابل تجارتی کرنسیوں کے لیے، ان کی خرید قیمت، فروخت کی قیمت، اور آخری تجارت کی قیمت کو اپ ڈیٹ کریں۔

اس فنکشن کے ذریعے، سسٹم ریئل ٹائم میں ٹارگٹ ٹریڈنگ کرنسی کی تازہ ترین مارکیٹ کی معلومات حاصل اور اپ ڈیٹ کر سکتا ہے۔

اکاؤنٹ کی پوزیشن کی معلومات حاصل کریں۔

اپنے اکاؤنٹ کے بیلنس اور کرنٹ ہولڈنگز (کرنسی، مقدار، لاگت وغیرہ) کو بازیافت کرنے کے لیے API کا استعمال کریں۔ یہ قدم دستیاب فنڈز کا اندازہ لگانے، خطرے کا حساب لگانے اور عہدوں کے انتظام کے لیے اہم ہے۔ مثال کے طور پر، آپ کی موجودہ ہولڈنگ اس بات کا تعین کرے گی کہ آیا آپ کی پوزیشن کو بڑھانا ہے یا کم کرنا ہے۔

مقصد:

  • یقینی بنائیں کہ لین دین کو انجام دینے کے لیے آپ کے اکاؤنٹ میں کافی فنڈز یا کھلی جگہیں موجود ہیں۔
  • اکاؤنٹ میں موجودہ پوزیشن اور فنڈز کی بنیاد پر لین دین کے سائز اور سمت کا تعین کریں۔
# 更新账户信息
def UpdateAccount():
   
    # 如果上次更新时间距现在不到1分钟,直接返回
    if time.time() - Info['time']['update_account_time'] < 60:
        return
    
    # 记录账户信息更新时间
    Info['time']['update_account_time'] = time.time() * 1000
    
    # 获取账户信息
    account = exchange.GetAccount()
    
    # 如果账户信息获取失败,记录日志并返回
    if account is None:
        Log("更新账户失败")
        return
    
    # 计算账户信息
    Info['account']['margin_used'] = round(account['Equity'] - account['Balance'], 2)  # 使用的保证金
    Info['account']['margin_balance'] = round(account['Equity'], 2)  # 当前账户余额
    Info['account']['margin_free'] = round(account['Balance'], 2)  # 可用余额
    Info['account']['wallet_balance'] = round(account['Equity'] - account['UPnL'], 2)  # 钱包余额
    Info['account']['unrealised_profit'] = round(account['UPnL'], 2)  # 未实现盈亏

    # 初始化账户初始余额
    if not Info['account']['init_balance']:
        if _G("init_balance") and _G("init_balance") > 0:
            Info['account']['init_balance'] = round(_G("init_balance"), 2)
        else:
            Info['account']['init_balance'] = Info['account']['margin_balance']
            _G("init_balance", Info['account']['init_balance'])
    
    # 计算账户利润及利润率
    Info['account']['profit'] = round(Info['account']['margin_balance'] - Info['account']['init_balance'], 2)
    Info['account']['profit_rate'] = round((100 * Info['account']['profit']) / Info['account']['init_balance'], 2)

    # 计算仓位总价值和杠杆率
    Info['count']['total'] = round(Info['count']['long'] + Info['count']['short'], 2)
    Info['count']['leverage'] = round(Info['count']['total'] / Info['account']['margin_balance'], 2)


# 更新仓位信息
def UpdatePosition():
    
    # 获取永续合约的仓位信息
    pos = exchange.GetPositions(Info['base_coin'] + ".swap")
    
    # 记录仓位信息更新时间
    Info['time']['update_pos_time'] = time.time() * 1000

    # 初始化仓位信息
    position_info = {symbol: {'amount': 0, 'hold_price': 0, 'unrealised_profit': 0} for symbol in Info['trade_symbols']}

    # 遍历仓位信息,更新相应币种的仓位
    for data in pos:
        symbol = data['Symbol'].split("_")[0]
        
        # 过滤掉不符合条件的币种
        if not data['Symbol'].split(".")[0].endswith(Info['base_coin']) or symbol not in Info['trade_symbols']:
            continue
        
        # 如果仓位不为零,则需要单向持仓
        if position_info[symbol]['amount'] != 0:
            raise Exception("需要单向持仓")
        
        # 更新仓位信息
        position_info[symbol] = {
            'amount': data['Amount'] * Info['precision'][symbol]['ctVal'] if data['Type'] == 0 else -data['Amount'] * Info['precision'][symbol]['ctVal'],
            'hold_price': data['Price'],
            'unrealised_profit': data['Profit']
        }

    # 初始化仓位统计数据
    Info['count'] = {'long': 0, 'short': 0, 'total': 0, 'leverage': 0}

    # 遍历更新后的仓位信息
    for symbol, info in position_info.items():
        deal_volume = abs(info['amount'] - Info['position'][symbol]['amount'])
        direction = 1 if info['amount'] - Info['position'][symbol]['amount'] > 0 else -1
        
        # 如果仓位发生变化,记录成交信息
        if deal_volume:
            deal_price = Info['order'][symbol]['buy']['price'] if direction == 1 else Info['order'][symbol]['sell']['price']
            Log(
                symbol,
                "仓位更新:",
                round(Info['position'][symbol]['value'], 1),
                " -> ",
                round(info['amount'] * Info['ticker'][symbol]['last'], 1),
                ", 买" if direction == 1 else ", 卖",
                ", 成交价:",
                deal_price,
                ", 成本价:",
                round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']),
            )

        # 更新仓位信息
        Info['position'][symbol]['amount'] = info['amount']
        Info['position'][symbol]['hold_price'] = info['hold_price']
        Info['position'][symbol]['value'] = round(Info['position'][symbol]['amount'] * Info['ticker'][symbol]['last'], 2)
        Info['position'][symbol]['unrealised_profit'] = info['unrealised_profit']

        # 统计多头和空头仓位价值
        if Info['position'][symbol]['amount'] > 0:
            Info['count']['long'] += abs(Info['position'][symbol]['value'])
        else:
            Info['count']['short'] += abs(Info['position'][symbol]['value'])
  1. UpdateAccountفنکشن

    • وقفہ چیک کریں۔: ہر بار جب آپ اپنا اکاؤنٹ اپ ڈیٹ کرتے ہیں، تو یقینی بنائیں کہ آخری اپ ڈیٹ 1 منٹ سے زیادہ دور ہے تاکہ زیادہ کثرت سے اپ ڈیٹ ہونے سے بچا جا سکے۔
    • اکاؤنٹ کی معلومات کو اپ ڈیٹ کریں۔: بلاؤexchange.GetAccountاکاؤنٹ کی معلومات حاصل کریں اور اکاؤنٹ کے مختلف پیرامیٹرز کا حساب لگائیں، جیسےmargin_usedwallet_balanceunrealised_profitانتظار کرو
    • بیلنس شروع کریں۔: اکاؤنٹ کا ابتدائی بیلنس شروع کریں جب اسے پہلی بار چلایا جائے اور اسے عالمی متغیر میں محفوظ کریں۔Info['account']['init_balance']درمیانی
    • منافع کا حساب لگانا: موجودہ بیلنس اور ابتدائی بیلنس کی بنیاد پر منافع اور منافع کے مارجن کا حساب لگاتا ہے۔
  2. UpdatePositionفنکشن

    • پوزیشن کی معلومات حاصل کریں۔: بلاؤexchange.GetPositions()موجودہ پوزیشن کی حیثیت حاصل کریں۔
    • پوزیشن کو اپ ڈیٹ کریں۔:حاصل شدہ پوزیشن ڈیٹا کی بنیاد پر ہدف کرنسی کی پوزیشن کی معلومات کو اپ ڈیٹ کریں (جیسےamounthold_priceunrealised_profitانتظار کرو)۔
    • لیوریج کا حساب لگاناموجودہ لانگ اور شارٹ پوزیشن ویلیوز اور مارجن بیلنس کی بنیاد پر مجموعی لیوریج ریشو کا حساب لگاتا ہے۔

ان دو فنکشنز کے ذریعے، حکمت عملی اکاؤنٹ کی حیثیت اور پوزیشن کی تبدیلیوں کو مسلسل مانیٹر کر سکتی ہے، جو بعد میں ٹریڈنگ کے فیصلوں کے لیے ریئل ٹائم ڈیٹا سپورٹ فراہم کرتی ہے۔

تجارت

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

مقصد:

  • خرید و فروخت کی کارروائیوں کو مکمل کرنے کے لیے API کے ذریعے تجارتی ہدایات جاری کریں۔
  • یقینی بنائیں کہ آرڈر کی قسم اور مقدار حکمت عملی کے تقاضوں اور تبادلے کے ضوابط کی تعمیل کرتی ہے۔
# 订单函数
def Order(symbol, direction, price, amount, msg):
    pair = f"{symbol}_{Info['base_coin']}.swap"  # 构造交易对名称
    ret = exchange.CreateOrder(pair, direction, price, amount, msg)  # 执行下单操作
    
    # 判断是否下单成功
    if ret:
        Info['order'][symbol][direction]['id'] = ret  # 记录订单ID
        Info['order'][symbol][direction]['price'] = price  # 记录下单价格
    else:
        Log(f"{symbol} {direction} {price} {amount} 下单异常")  # 输出异常信息

# 交易函数
def Trade(symbol, direction, price, amount, msg):
    
    # 根据最小价格变动调整价格
    price = round(price - (price % Info['precision'][symbol]['tick_size']), Info['precision'][symbol]['price_precision'])
    
    # 计算调整后的交易数量
    amount = amount / Info['precision'][symbol]['ctVal']  # 计算真实合约数量
    amount = round(amount - (amount % Info['precision'][symbol]['amount_size']), Info['precision'][symbol]['amount_precision'])

    # 限制最大交易数量
    if Info['precision'][symbol]['max_qty'] > 0:
        amount = min(amount, Info['precision'][symbol]['max_qty'])
    
    new_order = False
    
    # 如果新价格与之前的订单价格差异大于0.0001,则重新下单

    if Info['order'][symbol][direction]['price'] > 0 and abs(price - Info['order'][symbol][direction]['price']) / price > 0.0001:
        Log('已持订单,订单价格发生变化')
        new_order = True
    
    # 如果交易数量为0或者当前订单ID为0,则撤单
    if amount <= 0 or Info['order'][symbol][direction]['id'] == 0:
        Log('新订单产生')
        new_order = True
    
    # 如果需要新订单
    if new_order:
        # 如果有原有订单,撤销它
        if Info['order'][symbol][direction]['id'] != 0:
            exchange.CancelOrder(Info['order'][symbol][direction]['id'])
            Info['order'][symbol][direction]['id'] = 0
            Info['order'][symbol][direction]['price'] = 0
            Log('撤单成功:', symbol)
        
        
        # 如果更新仓位或ticker的延迟太高,则不下单
        if (time.time() * 1000 - Info['time']['update_pos_time'] > 2 * Info['interval'] * 1000 or 
            time.time() * 1000 - Info['time']['update_ticker_time'] > 2 * Info['interval'] * 1000):
            Log(time.time() * 1000, Info['time']['update_pos_time'], time.time() * 1000 - Info['time']['update_pos_time'])
            Log(time.time() * 1000, Info['time']['update_ticker_time'], time.time() * 1000 - Info['time']['update_ticker_time'])
            Log('延迟过高')
            return
        
        # 如果订单金额或数量过低,不执行下单操作
        if price * amount <= Info['precision'][symbol]['min_notional'] or amount < Info['precision'][symbol]['min_qty']:
            Log(f"{symbol} 下单量太低", price * amount)
            return
        
        # 执行下单操作
        Log('order下单:', symbol)
        Order(symbol, direction, price, amount, msg)
  1. Orderفنکشن

    • آرڈر بنانے کے لیے ذمہ دار ہے۔ اگر کامیاب ہو، تو یہ آرڈر کی شناخت اور قیمت کو ریکارڈ کرے گا۔ اگر ناکام ہو گیا تو، یہ ایک غلطی کا پیغام دے گا۔
  2. Tradeفنکشن

    • مارکیٹ کی قیمت اور مقدار کی بنیاد پر اس بات کا تعین کرنے کے لیے ایڈجسٹ کریں کہ آیا آرڈر کو منسوخ کرنا ہے اور آرڈر پر عمل درآمد کی غلطیوں یا بار بار ہونے والی کارروائیوں سے بچنے کے لیے نیا رکھنا ہے۔
  3. CancelOrderفنکشن

    • یہ ایک حسب ضرورت آرڈر کینسلیشن آپریشن ہے، جو موجودہ زیر التواء آرڈر کو منسوخ کرنے کا ذمہ دار ہے۔

اسٹیٹس ڈسپلے

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

مقصد:

  • صارف کی نگرانی کی سہولت کے لیے حکمت عملی کے آپریشن کی اہم معلومات بروقت دکھائیں۔
  • یہ ظاہر کرنے کے لیے فیڈ بیک میکانزم فراہم کرتا ہے کہ آیا لین دین کامیابی کے ساتھ انجام پایا تھا یا اگر کوئی خرابیاں تھیں۔
# 更新状态函数
def UpdateStatus():
    
    # 如果距离上次更新的时间小于4秒,则直接返回
    if time.time() * 1000 - Info['time']['update_status_time'] < 4000:
        return
    
    # 更新状态时间
    Info['time']['update_status_time'] = time.time() * 1000

    # 账户信息表格
    table1 = {
        "type": "table",
        "title": "账户信息",
        "cols": [
            "初始余额", "钱包余额", "保证金余额", "已用保证金", "可用保证金",
            "总收益", "收益率", "未实现收益", "总持仓", "已用杠杆", "循环延时"
        ],
        "rows": [
            [
                Info['account']['init_balance'],  # 初始余额
                Info['account']['wallet_balance'],  # 钱包余额
                Info['account']['margin_balance'],  # 保证金余额
                Info['account']['margin_used'],  # 已用保证金
                Info['account']['margin_free'],  # 可用保证金
                Info['account']['profit'],  # 总收益
                str(Info['account']['profit_rate']) + "%",  # 收益率
                round(Info['account']['unrealised_profit'], 2),  # 未实现收益
                round(Info['count']['total'], 2),  # 总持仓
                Info['count']['leverage'],  # 已用杠杆
                str(Info['time']['loop_delay']) + "ms",  # 循环延时
            ],
        ],
    }
    
    # 交易对信息表格
    table2 = {
        "type": "table",
        "title": "交易对信息",
        "cols": [
            "币种", "方向", "数量", "持仓价格", "持仓价值", 
            "现价", "挂单买价", "挂单卖价", "未实现盈亏"
        ],
        "rows": [],
    }

    # 遍历每个交易对,填充交易对信息
    for symbol in Info['trade_symbols']:
        table2['rows'].append([
            symbol,  # 币种
            "LONG" if Info['position'][symbol]['amount'] > 0 else "SHORT",  # 方向
            round(Info['position'][symbol]['amount'], Info['precision'][symbol]['amount_precision'] + 2),  # 数量
            round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']),  # 持仓价格
            round(Info['position'][symbol]['value'], 2),  # 持仓价值
            round(Info['ticker'][symbol]['last'], Info['precision'][symbol]['price_precision']),  # 现价
            Info['order'][symbol]['buy']['price'],  # 挂单买价
            Info['order'][symbol]['sell']['price'],  # 挂单卖价
            round(Info['position'][symbol]['unrealised_profit'], 2),  # 未实现盈亏
        ])

    # 输出状态日志
    LogStatus(
        f"初始化时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(Info['time']['start_time']))}\n",
        f"`{json.dumps(table1)}`\n" + f"`{json.dumps(table2)}`\n",
        f"最后执行时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}\n"
    )

    # 每10秒钟更新一次账户信息
    if time.time() * 1000 - Info['time']['update_profit_time'] > 10 * 1000:
        UpdateAccount()  # 更新账户信息
        LogProfit(round(Info['account']['profit'], 3), '&')  # 输出收益日志
        Info['time']['update_profit_time'] = time.time() * 1000  # 更新收益时间

لین دین کی منطق

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

مقصد:

  • مارکیٹ کے ڈیٹا اور اکاؤنٹ کی حیثیت کی بنیاد پر ذہین تجارتی فیصلے کریں۔
  • مارکیٹ کے مختلف حالات کو سنبھالیں اور اس بات کو یقینی بنائیں کہ حکمت عملی مختلف مارکیٹ کے ماحول میں معقول طریقے سے کام کر سکتی ہے۔

فریم ورک کے قابل عمل ہونے کو ظاہر کرنے کے لیے، اس مضمون میں تجارتی حکمت عملی سادہ منطق کا استعمال کرتی ہے۔ ہر آرڈر کی قیمت 50 USDT مقرر کی گئی ہے، اور تجارتی عمل درآمد پر، متعلقہ خرید و فروخت کی مقدار کا حساب موجودہ مارکیٹ کی بولی اور قیمتوں کی بنیاد پر کیا جاتا ہے۔ اس حکمت عملی کے نفاذ کے اصول بہت بنیادی ہیں، جن کا مقصد یہ ظاہر کرنا ہے کہ لائیو تجارتی ماحول میں ملٹی کرنسی فیوچر ٹریڈنگ حکمت عملی کے فریم ورک کو کیسے لاگو کیا جائے۔ سادگی اور آپریٹیبلٹی کو یقینی بنانے کے لیے، ایک رکنے کی شرط رکھی گئی ہے: جب تجارتی جوڑے کی کھلی سود کی کل قیمت 2,000 USDT تک پہنچ جاتی ہے، تو مزید آرڈر بند ہو جاتے ہیں۔ یہ ہمیں آسانی سے حکمت عملی کے بنیادی ڈھانچے کو ظاہر کرنے کی اجازت دیتا ہے اور کس طرح فریم ورک ایکسچینجز سے مارکیٹ ڈیٹا کے ساتھ تعامل کرتا ہے۔

def MakeOrder():
    
    # 遍历所有交易对
    for symbol in Info['trade_symbols']:
        
        # 获取买价(挂单买价)
        buy_price = Info['ticker'][symbol]['bid']
        
        # 计算买入数量,根据买入金额除以买价
        buy_amount = 50 / buy_price

        # 获取卖价(挂单卖价)
        sell_price = Info['ticker'][symbol]['ask']
        
        # 计算买入数量,根据买入金额除以买价
        sell_amount = 50 / sell_price

        
        # 如果当前持仓的总价值小于2000,则进行买入操作
        if Info['position'][symbol]['value'] < 2000:
            Log('进入交易')
            Log('设定价格:', Info['ticker'][symbol]['bid'])
            Trade(symbol, "buy", buy_price, buy_amount, symbol)  # 执行买入操作
        
        #if Info['position'][symbol]['value'] < 3000:
        #    Trade(symbol, "sell", sell_price, sell_amount, symbol)  # 执行买入操作

مین لوپ

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

مقصد:

  • حکمت عملی کے مسلسل اور مستحکم عمل کو یقینی بنائیں، حقیقی وقت میں مارکیٹ ڈیٹا حاصل کریں اور تجارتی فیصلے کریں۔
  • ہر سائیکل حکمت عملی پر عمل درآمد کے حقیقی وقت اور درستگی کو یقینی بناتا ہے۔
def OnTick():
    try:
        # 更新市场行情信息
        UpdateTicker()
        # 更新持仓信息
        UpdatePosition()
        # 执行下单操作
        MakeOrder()
        # 更新状态信息
        UpdateStatus()
    except Exception as error:
        # 记录循环中发生的错误
        Log("循环出错: " + str(error))

def main():
    LogReset(0)  
    apiBase = "https://testnet.binancefuture.com"  # 币安期货仿真交易所        
    exchange.SetBase(apiBase)  # 设置仿真交易所基站
    # 初始化信息
    exchange.IO('dual', False)  # 单向持仓
    InitInfo()
    GetPrecision()
    
    while True:  # 无限循环
        loop_start_time = time.time() * 1000  # 获取当前时间(毫秒)
        
        # 检查上次循环时间与设定的间隔时间是否已过
        if time.time() * 1000 - Info['time']['last_loop_time'] > Info['interval'] * 1000:
            OnTick()  # 调用 OnTick 函数
            
            # 更新最后一次循环时间
            Info['time']['last_loop_time'] = time.time() * 1000
            # 计算当前循环的延迟时间
            Info['time']['loop_delay'] = time.time() * 1000 - loop_start_time
        
        # 暂停5毫秒,避免过度消耗CPU资源
        Sleep(5000)

کوڈ کی وضاحت:

  1. OnTickفنکشنیہ فنکشن بنیادی کام ہے جو ہر بار مین لوپ کے اندر انجام دیا جاتا ہے۔ یہ مارکیٹ کی معلومات، پوزیشن کی معلومات، تجارت کو انجام دینے، اور حکمت عملی کی حیثیت کو اپ ڈیٹ کرنے کا ذمہ دار ہے۔ تمام ٹریڈنگ اور انفارمیشن اپ ڈیٹ اس فنکشن کے اندر انجام دیے جاتے ہیں۔ عملدرآمد کے دوران کسی بھی غلطی کو پکڑ لیا اور لاگ ان کیا جاتا ہے.

  2. mainفنکشن:مین فنکشن متعلقہ معلومات کو شروع کرتا ہے، ایکسچینج بیس سٹیشن سیٹ کرتا ہے اور ایک لامحدود لوپ شروع کرتا ہے۔ ہر لوپ میں، پروگرام چیک کرتا ہے کہ آیا مقررہ وقت کا وقفہ گزر چکا ہے۔ اگر ایسا ہے توOnTickحکمت عملی پر عمل درآمد کے لیے فنکشن بلایا جائے گا۔ اگر وقت کا وقفہ ابھی تک نہیں آیا ہے، تو پروگرام انتظار کرے گا اور لوپ کو جاری رکھے گا تاکہ اس بات کو یقینی بنایا جا سکے کہ حکمت عملی کو پہلے سے طے شدہ وقت کے وقفے کے مطابق عمل میں لایا جائے۔

  3. تاخیر کا کنٹرول: ہر ایک لوپ کے بعد، پروگرام CPU بوجھ کو کم کرنے کے لیے 5 ملی سیکنڈ کے لیے رک جاتا ہے۔ یہ اعلی تعدد لوپس کی وجہ سے کمپیوٹنگ وسائل کے ضرورت سے زیادہ استعمال سے بچنے کے لیے ہے۔

آپریشن منطق

  • ابتدائی مرحلہ: پہلے API اور دیگر ضروری پیرامیٹرز سیٹ کریں، پھر معلومات شروع کریں اور کرنسی کی درستگی حاصل کریں۔
  • مین لوپ مرحلہ:ایک لامحدود لوپ درج کریں، ہر لوپ وقت کے وقفہ کو چیک کرے گا تاکہ یہ یقینی بنایا جا سکے کہ پالیسی پر عمل درآمد کے لیے وقت کا وقفہ پہلے سے طے شدہ ترتیبات کو پورا کرتا ہے۔
  • پھانسی کا مرحلہ:وقت کے وقفہ کی شرط پوری ہونے کے بعد،OnTickاس فنکشن کو تمام حکمت عملی کی کارروائیوں کو انجام دینے کے لیے بلایا جائے گا، بشمول مارکیٹ کی معلومات کی تازہ کاری، تجارتی عمل درآمد وغیرہ۔

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

خلاصہ کریں۔

اس حکمت عملی کا فریم ورک ماڈیولریٹی اور اسکیل ایبلٹی کو ذہن میں رکھتے ہوئے ڈیزائن کیا گیا ہے۔ ہر قدم پر واضح ذمہ داریاں ہوتی ہیں، مستقبل میں توسیع اور اصلاح کی سہولت فراہم کرتے ہوئے مضبوطی کو یقینی بنانا۔ ایکسچینج APIs کا فائدہ اٹھا کر، حکمت عملی کو ہموار کیا جا سکتا ہے اور بیک ٹیسٹنگ اور ریئل ٹائم ٹریڈنگ کے ساتھ زیادہ مطابقت رکھتا ہے۔

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

اپینڈکسPython ملٹی کرنسی فریم ورک کا پتہ