پیتھون کی سادہ گرڈ حکمت عملی

مصنف:چھوٹا سا خواب, تخلیق: 2020-01-04 14:28:04, تازہ کاری: 2023-10-17 21:27:38

img

پیتھون کی سادہ گرڈ حکمت عملی

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

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

اسٹریٹجک خیالات کی وضاحت براہ راست اسٹریٹجک کوڈ کے تبصرے میں ہے۔

حکمت عملی کا کوڈ

'''backtest
start: 2019-07-01 00:00:00
end: 2020-01-03 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]
'''

import json

# 参数
beginPrice = 5000   # 网格区间开始价格
endPrice = 8000     # 网格区间结束价格
distance = 20       # 每个网格节点的价格距离
pointProfit = 50    # 每个网格节点的利润差价
amount = 0.01       # 每个网格节点的挂单量
minBalance = 300    # 账户最小资金余额(买入时)

# 全局变量
arrNet = []
arrMsg = []
acc = None

def findOrder (orderId, NumOfTimes, ordersList = []) :
    for j in range(NumOfTimes) :
        orders = None
        if len(ordersList) == 0:
            orders = _C(exchange.GetOrders)
        else :
            orders = ordersList
        for i in range(len(orders)):
            if orderId == orders[i]["Id"]:
                return True
        Sleep(1000)
    return False

def cancelOrder (price, orderType) :
    orders = _C(exchange.GetOrders)
    for i in range(len(orders)) : 
        if price == orders[i]["Price"] and orderType == orders[i]["Type"]: 
            exchange.CancelOrder(orders[i]["Id"])
            Sleep(500)

def checkOpenOrders (orders, ticker) :
    global arrNet, arrMsg
    for i in range(len(arrNet)) : 
        if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "pending" :
            orderId = exchange.Sell(arrNet[i]["coverPrice"], arrNet[i]["amount"], arrNet[i], ticker)
            if orderId :
                arrNet[i]["state"] = "cover"
                arrNet[i]["id"] = orderId                
            else :
                # 撤销
                cancelOrder(arrNet[i]["coverPrice"], ORDER_TYPE_SELL)
                arrMsg.append("挂单失败!" + json.dumps(arrNet[i]) + ", time:" + _D())

def checkCoverOrders (orders, ticker) :
    global arrNet, arrMsg
    for i in range(len(arrNet)) : 
        if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "cover" :
            arrNet[i]["id"] = -1
            arrNet[i]["state"] = "idle"
            Log(arrNet[i], "节点平仓,重置为空闲状态。", "#FF0000")


def onTick () :
    global arrNet, arrMsg, acc

    ticker = _C(exchange.GetTicker)    # 每次获取当前最新的行情
    for i in range(len(arrNet)):       # 遍历所有网格节点,根据当前行情,找出需要挂单的位置,挂买单。
        if i != len(arrNet) - 1 and arrNet[i]["state"] == "idle" and ticker.Sell > arrNet[i]["price"] and ticker.Sell < arrNet[i + 1]["price"]:
            acc = _C(exchange.GetAccount)
            if acc.Balance < minBalance :     # 如果钱不够了,只能跳出,什么都不做了。
                arrMsg.append("资金不足" + json.dumps(acc) + "!" + ", time:" + _D())
                break

            orderId = exchange.Buy(arrNet[i]["price"], arrNet[i]["amount"], arrNet[i], ticker) # 挂买单
            if orderId : 
                arrNet[i]["state"] = "pending"   # 如果买单挂单成功,更新网格节点状态等信息
                arrNet[i]["id"] = orderId
            else :
                # 撤单
                cancelOrder(arrNet[i]["price"], ORDER_TYPE_BUY)    # 使用撤单函数撤单
                arrMsg.append("挂单失败!" + json.dumps(arrNet[i]) + ", time:" + _D())
    Sleep(1000)
    orders = _C(exchange.GetOrders)    
    checkOpenOrders(orders, ticker)    # 检测所有买单的状态,根据变化做出处理。
    Sleep(1000)
    orders = _C(exchange.GetOrders)    
    checkCoverOrders(orders, ticker)   # 检测所有卖单的状态,根据变化做出处理。

    # 以下为构造状态栏信息,可以查看FMZ API 文档。
    tbl = {
        "type" : "table", 
        "title" : "网格状态",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [], 
    }    

    for i in range(len(arrNet)) : 
        tbl["rows"].append([i, json.dumps(arrNet[i])])

    errTbl = {
        "type" : "table", 
        "title" : "记录",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [], 
    }

    orderTbl = {
     	"type" : "table", 
        "title" : "orders",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [],    
    }

    while len(arrMsg) > 20 : 
        arrMsg.pop(0)

    for i in range(len(arrMsg)) : 
        errTbl["rows"].append([i, json.dumps(arrMsg[i])])    

    for i in range(len(orders)) : 
        orderTbl["rows"].append([i, json.dumps(orders[i])])

    LogStatus(_D(), "\n", acc, "\n", "arrMsg length:", len(arrMsg), "\n", "`" + json.dumps([tbl, errTbl, orderTbl]) + "`")


def main ():         # 策略执行从这里开始
    global arrNet
    for i in range(int((endPrice - beginPrice) / distance)):        # for 这个循环根据参数构造了网格的数据结构,是一个列表,储存每个网格节点,每个网格节点的信息如下:
        arrNet.append({
            "price" : beginPrice + i * distance,                    # 该节点的价格
            "amount" : amount,                                      # 订单数量
            "state" : "idle",    # pending / cover / idle           # 节点状态
            "coverPrice" : beginPrice + i * distance + pointProfit, # 节点平仓价格
            "id" : -1,                                              # 节点当前相关的订单的ID
        })
        
    while True:    # 构造好网格数据结构后,进入策略主要循环
        onTick()   # 主循环上的处理函数,主要处理逻辑
        Sleep(500) # 控制轮询频率

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

حکمت عملی کے اعداد و شمار کی نمائش، استعمالLogStatusفنکشن اعداد و شمار کو اصل وقت میں اسٹیٹ بار پر ظاہر کرتا ہے۔

    tbl = {
        "type" : "table", 
        "title" : "网格状态",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [], 
    }    

    for i in range(len(arrNet)) : 
        tbl["rows"].append([i, json.dumps(arrNet[i])])

    errTbl = {
        "type" : "table", 
        "title" : "记录",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [], 
    }

    orderTbl = {
     	"type" : "table", 
        "title" : "orders",
        "cols" : ["节点索引", "详细信息"], 
        "rows" : [],    
    }

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

دوبارہ ٹیسٹ کریں

img

img

حکمت عملی کا پتہ

حکمت عملی کا پتہ

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


متعلقہ

مزید

ہزار سال پرانے اسکوئرز# بل منسوخ کریں cancelOrder ((arrNet[i]["price"، ORDER_TYPE_BUY) # منسوخ کرنے کی تقریب کا استعمال کرتے ہوئے منسوخ کریں اس قیمت کے ساتھ انڈیکس کے لئے آرڈر منسوخ کرنے کا کیا استعمال ہے؟ ایف ایم زیڈ کی اے پی آئی میں صرف آئی ڈی دکھایا گیا ہے ، اور اوکے ایکسچینج کی موجودہ دستاویزات میں صرف آئی ڈی یا کسٹم آئی ڈی ہے...

چھیڑنابہت اچھا!

ہزار سال پرانے اسکوئرز😂 اوہ، میں نے اوپر def دیکھا، معاف کیجئے گا، معاف کیجئے گا

چھوٹا سا خوابیہ cancellOrder نہیں exchange.CancelOrder، یہ میری اپنی مرضی کے مطابق فعل ہے۔