4
ফোকাস
1271
অনুসারী

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

তৈরি: 2021-11-03 15:40:56, আপডেট করা হয়েছে: 2023-09-15 21:02:48
comments   6
hits   2501

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX কৌশল ডিজাইনের উদাহরণ

অনেক ব্যবহারকারীর চাহিদার প্রতিক্রিয়ায়, FMZ প্ল্যাটফর্ম সম্প্রতি বিকেন্দ্রীভূত বিনিময় dYdX সমর্থন করেছে। কৌশল সহ বন্ধুরা আনন্দের সাথে dYdX খনি করতে পারে। এটা ঠিক তাই হয় যে আমি অনেক দিন আগে একটি এলোমেলো ট্রেডিং কৌশল লিখতে চেয়েছিলাম এটা কোন ব্যাপার না যে আমি অর্থ উপার্জন করি বা হারাই আমার দক্ষতা অনুশীলন করা এবং কৌশল ডিজাইন শেখানো। তাই এর পরে, আসুন কৌশলটির কার্যকারিতা সম্পর্কে চিন্তা করবেন না।

প্রথমে আপনাকে কিছু খনন দেখাই

এই নিবন্ধে কৌশলগত খনির স্ক্রিনশট।

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

যে বন্ধুদের ভাল মাইনিং কৌশল ধারনা আছে তাদেরও একটি বার্তা দিতে স্বাগতম!

র্যান্ডম ট্রেডিং কৌশল ডিজাইন

আসুন কিছু “এলোমেলো চিন্তা” আছে! এমন একটি কৌশল ডিজাইন করার পরিকল্পনা করুন যা সূচক বা দাম না দেখেই অর্ডার দেওয়া দীর্ঘ বা সংক্ষিপ্ত নয়, এবং এটি সবই সম্ভাবনার বিষয়ে। তারপরে আমরা দীর্ঘ এবং সংক্ষিপ্ত অবস্থান নির্ধারণ করতে 1 থেকে 100 পর্যন্ত র্যান্ডম সংখ্যা ব্যবহার করি।

দীর্ঘ শর্ত: এলোমেলো সংখ্যা 1~50। সংক্ষিপ্ত বিক্রয় শর্ত: এলোমেলো সংখ্যা 51~100।

দীর্ঘ এবং ছোট উভয় সংখ্যাই 50। এর পরে, আসুন কীভাবে অবস্থানটি বন্ধ করা যায় সে সম্পর্কে চিন্তা করি যেহেতু এটি জুয়া, সেখানে একটি জয়ী বা হারানো মান থাকতে হবে। তারপরে ট্রেডিংয়ে, আমাদের জয়ী এবং হারানোর মান হিসাবে নির্দিষ্ট টেক-প্রফিট এবং স্টপ-লস সেট করা উচিত। আপনি যদি লাভ বন্ধ করেন তবে আপনি জিতবেন, যদি আপনি ক্ষতি বন্ধ করেন তবে আপনি হারবেন। স্টপ প্রফিট এবং স্টপ লসের উপযুক্ত স্তরের জন্য, এটি আসলে লাভ এবং ক্ষতির অনুপাতকে প্রভাবিত করে, ওহ হ্যাঁ! এটি জয়ের হারকেও প্রভাবিত করে! (এই নকশা কৌশলটি কি কার্যকর? এটি একটি ইতিবাচক গাণিতিক প্রত্যাশা হওয়ার গ্যারান্টি দেওয়া যেতে পারে? প্রথমে এটি করুন এবং তারপর এটি সম্পর্কে কথা বলুন! যাইহোক, এটি শেখার এবং গবেষণা!)

লেনদেন মূল্যহীন নয় যেমন স্লিপেজ এবং হ্যান্ডলিং ফি আমাদের এলোমেলো ট্রেডিং জয়ের হারকে 50% এর কম করার জন্য যথেষ্ট। এই চিন্তা, আমি কিভাবে ডিজাইন চালিয়ে যেতে হবে? পজিশন বাড়ানোর জন্য একটি মাল্টিপল ডিজাইন করা ভালো, যেহেতু এটি একটি বাজি, তাই পরপর 10 বার র্যান্ডম লেনদেনে হারানোর সম্ভাবনা খুব বেশি হওয়া উচিত নয়। তাই আমি প্রথম লেনদেনের জন্য অর্ডারের পরিমাণ ডিজাইন করতে চাই, যতটা সম্ভব ছোট। তারপর বাজি হারলে, অর্ডারের পরিমাণ বাড়ান এবং এলোমেলো অর্ডার দেওয়া চালিয়ে যান।

ঠিক আছে, কৌশলটি ডিজাইনের মতোই সহজ।

ডিজাইন সোর্স কোড:

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 স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

ওহ হ্যাঁ! কৌশলটির একটি নাম প্রয়োজন, আসুন এটিকে বলি “আকার অনুমান করুন (dYdX সংস্করণ)“।

ব্যাকটেস্ট

ব্যাকটেস্ট শুধুমাত্র রেফারেন্সের জন্য, >_<! মূল উদ্দেশ্য হ’ল কৌশলটিতে কোনও বাগ আছে কিনা তা পরীক্ষা করা এবং ব্যাকটেস্ট করার জন্য বিনান্স ফিউচার ব্যবহার করা।

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

ব্যাকটেস্ট শেষ হয়েছে এবং কোন বাগ নেই। কিন্তু আমার মনে হচ্ছে আমি ব্যাকটেস্ট সিস্টেমটি সঠিকভাবে ফিট করছি না…T_T, আমি রিয়েল টাইমে এটি চেষ্টা করব।

বাস্তব অফার চলমান

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

dYdX স্ট্র্যাটেজি ডিজাইনের উদাহরণ - স্টোকাস্টিক ট্রেডিং স্ট্র্যাটেজি

এই কৌশল শুধুমাত্র শেখার এবং রেফারেন্স জন্য.দশ মিলিয়ন~দশ মিলিয়নবাস্তব সময়ে এটি ব্যবহার করবেন না! !