avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

میں تخلیق کیا: 2021-11-03 15:40:56, تازہ کاری: 2023-09-15 21:02:48
comments   6
hits   2500

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال

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

آئیے پہلے آپ کو کچھ کان کنی دکھاتے ہیں۔

اس مضمون میں اسٹریٹجک کان کنی کا اسکرین شاٹ۔

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

جن دوستوں کے پاس کان کنی کی حکمت عملی کے اچھے آئیڈیاز ہیں ان کا بھی ایک پیغام چھوڑنے کا خیرمقدم ہے!

اسٹاکسٹک تجارتی حکمت عملی ڈیزائن

آئیے “جنگلی طور پر سوچیں”! میں ایک ایسی حکمت عملی وضع کرنے کا ارادہ رکھتا ہوں جو اشارے یا قیمتوں کو دیکھے بغیر آرڈرز کو لمبا یا مختصر کرنے سے زیادہ کچھ نہیں ہے، اور آپ کو صرف امکانات کی پیش گوئی کرنا ہے۔ پھر ہم طویل اور مختصر کا تعین کرنے کے لیے بے ترتیب نمبر 1 سے 100 کا استعمال کرتے ہیں۔

طویل حالات: بے ترتیب نمبر 1~50۔ مختصر فروخت کی شرائط: بے ترتیب نمبر 51~100۔

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

ٹریڈنگ لاگت سے پاک نہیں ہے جیسے کہ پھسلن اور ہینڈلنگ فیس ہماری رینڈم ٹریڈنگ جیت کی شرح کو 50% سے کم کرنے کے لیے کافی ہیں۔ مجھے اس کو ذہن میں رکھ کر ڈیزائننگ کیسے جاری رکھنی چاہیے؟ ایک سے زیادہ پوزیشن میں اضافہ ڈیزائن کرنا بہتر ہے چونکہ یہ ایک جوا ہے، اس لیے لگاتار 10 میں سے 8 بے ترتیب لین دین کے ہارنے کا امکان بہت زیادہ نہیں ہونا چاہیے۔ اس لیے میں پہلے لین دین کو ڈیزائن کرنا چاہتا ہوں تاکہ آرڈر کا سائز بہت چھوٹا ہو، جتنا ممکن ہو چھوٹا ہو۔ پھر اگر آپ شرط ہار جاتے ہیں تو آرڈر کی مقدار میں اضافہ کریں اور بے ترتیب آرڈرز جاری رکھیں۔

ٹھیک ہے، حکمت عملی کا ڈیزائن اتنا آسان ہے۔

ڈیزائن سورس کوڈ:

var openPrice = 0 
var ratio = 1
var totalEq = null 
var nowEq = null 

function cancelAll() {
    while (1) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            break
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(500)
        }
        Sleep(500)
    }
}

function main() {
    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }

    exchange.SetContractType(ct)

    var initPos = _C(exchange.GetPosition)
    if (initPos.length != 0) {
        throw "策略启动时有持仓!"
    }
    
    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    
    if (!IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = _C(exchange.GetAccount).Balance   // equity
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    } else {
        totalEq = _C(exchange.GetAccount).Balance
    }
    
    while (1) {
        if (openPrice == 0) {
            // 更新账户信息,计算收益
            var nowAcc = _C(exchange.GetAccount)
            nowEq = IsVirtual() ? nowAcc.Balance : nowAcc.Balance  // equity
            LogProfit(nowEq - totalEq, nowAcc)
            
            var direction = Math.floor((Math.random()*100)+1)   // 1~50 , 51~100
            var depth = _C(exchange.GetDepth)
            if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                Sleep(1000)
                continue 
            }
            if (direction > 50) {
                // long
                openPrice = depth.Bids[1].Price
                exchange.SetDirection("buy")
                exchange.Buy(Math.abs(openPrice) + slidePrice, amount * ratio)
            } else {
                // short
                openPrice = -depth.Asks[1].Price
                exchange.SetDirection("sell")
                exchange.Sell(Math.abs(openPrice) - slidePrice, amount * ratio)
            }       
            Log("下", direction > 50 ? "买单" : "卖单", ",价格:", Math.abs(openPrice))
            continue
        }

        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            var pos = _C(exchange.GetPosition)
            if (pos.length == 0) {
                openPrice = 0
                continue
            }
            
            // 平仓检测
            while (1) {
                var depth = _C(exchange.GetDepth)
                if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                    Sleep(1000)
                    continue 
                }
                var stopLossPrice = openPrice > 0 ? Math.abs(openPrice) - stopLoss : Math.abs(openPrice) + stopLoss 
                var stopProfitPrice = openPrice > 0 ? Math.abs(openPrice) + stopProfit : Math.abs(openPrice) - stopProfit
                var winOrLoss = 0 // 1 win , -1 loss 
                
                // 画线
                $.PlotLine("bid", depth.Bids[0].Price)
                $.PlotLine("ask", depth.Asks[0].Price)
                
                // 止损
                if (openPrice > 0 && depth.Bids[0].Price < stopLossPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
                    winOrLoss = -1
                } else if (openPrice < 0 && depth.Asks[0].Price > stopLossPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = -1
                }
                
                // 止盈
                if (openPrice > 0 && depth.Bids[0].Price > stopProfitPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)  
                    winOrLoss = 1
                } else if (openPrice < 0 && depth.Asks[0].Price < stopProfitPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = 1
                }
                
                // 检测挂单
                Sleep(2000)
                var orders = _C(exchange.GetOrders)                
                if (orders.length == 0) {
                    pos = _C(exchange.GetPosition)
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }                    
                } else {
                    // 撤销挂单
                    cancelAll()
                    Sleep(2000)
                    pos = _C(exchange.GetPosition)
                    // 撤销后更新持仓,需要再次检查
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }    
                }
                
                var tbl = {
                    "type" : "table", 
                    "title" : "info", 
                    "cols" : ["totalEq", "nowEq", "openPrice", "bid1Price", "ask1Price", "ratio", "pos.length"], 
                    "rows" : [], 
                }
                tbl.rows.push([totalEq, nowEq, Math.abs(openPrice), depth.Bids[0].Price, depth.Asks[0].Price, ratio, pos.length])
                tbl.rows.push(["pos", "type", "amount", "price", "--", "--", "--"])
                for (var j = 0 ; j < pos.length ; j++) {
                    tbl.rows.push([j, pos[j].Type, pos[j].Amount, pos[j].Price, "--", "--", "--"])
                }
                LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
            }
        } else {
            // 撤销挂单
            // 重置openPrice
            cancelAll()
            openPrice = 0
        }
        Sleep(1000)
    }
}

حکمت عملی کے پیرامیٹرز:

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

اوہ ہاں! حکمت عملی کو ایک نام کی ضرورت ہے، آئیے اسے “Gues the Size (dYdX ورژن)” کہتے ہیں۔

بیک ٹیسٹنگ

بیک ٹیسٹنگ صرف حوالہ کے لیے ہے۔_<! بنیادی مقصد یہ چیک کرنا ہے کہ آیا حکمت عملی میں کوئی کیڑے موجود ہیں اور بائنانس فیوچر بیک ٹیسٹنگ کا استعمال کریں۔

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

بیک ٹیسٹنگ مکمل ہے، کوئی کیڑے نہیں۔ لیکن مجھے ایسا لگتا ہے کہ میں بیک ٹیسٹنگ سسٹم کو اوور فٹ کر سکتا ہوں…T_T، مجھے اسے حقیقی وقت میں آزمانے دیں۔

حقیقی تجارت

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

dYdX حکمت عملی ڈیزائن کی مثال - Stochastic Trading Strategy

یہ حکمت عملی صرف سیکھنے اور حوالہ کے لیے ہے۔10 ملین~10 ملیناسے حقیقی طور پر استعمال نہ کریں! !