ডিজিটাল মুদ্রা চুক্তি সহজেই রোবটকে অনুসরণ করে

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ 2021-04-07 21:30:05, আপডেটঃ 2023-09-24 19:35:33

img

ডিজিটাল মুদ্রা চুক্তি সহজেই রোবটকে অনুসরণ করে

গত নিবন্ধে আমরা একটি সহজ স্টপ চেকিং রোবট বাস্তবায়ন করেছি, আজ আমরা একটি চুক্তি সংস্করণ সহজ চেকিং রোবট বাস্তবায়ন করেছি।

ডিজাইন

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

কৌশল বাস্তবায়ন

কৌশলগত পরামিতিঃ

img

সমর্থন পুনঃনিরীক্ষা, আপনি সরাসরি ডিফল্ট সেটিং পুনঃনিরীক্ষা পর্যবেক্ষণ ব্যবহার করতে পারেন।

এই কৌশলটির উত্স কোডঃ

/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/

function test() {
    // 测试函数
    var ts = new Date().getTime()    
    if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
        Sleep(1000 * 60 * 10)
        var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var longPosAmount = nowPosAmount.long
        var shortPosAmount = nowPosAmount.short
        var x = Math.random()
        if (x > 0.7) {
            exchange.SetDirection("buy")
            exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "参考账户测试平仓#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "参考账户测试平仓#FF0000")
        }
    }
}

function getPosAmount(pos, ct) {
    var longPosAmount = 0
    var shortPosAmount = 0
    _.each(pos, function(ele) {
        if (ele.ContractType == ct && ele.Type == PD_LONG) {
            longPosAmount = ele.Amount
        } else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
            shortPosAmount = ele.Amount
        }
    })
    return {long: longPosAmount, short: shortPosAmount}
}

function trade(e, ct, type, delta) {
    var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
    var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
    if (delta > 0) {
        // 开仓
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // 平仓
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("未检测到持仓")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "错误"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "没有跟单的交易所"
    }
    var exName = exchange.GetName()
    // 检测参考交易所
    if (!exName.includes("Futures_")) {
        throw "仅支持期货跟单"
    }
    Log("开始监控", exName, "交易所", "#FF0000")
    
    // 检测跟单交易所
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "跟单的期货交易所和参考交易所不同!"
        }
    }
    
    // 设置交易对、合约
    _.each(exchanges, function(e) {
        if (!IsVirtual()) {
            e.SetCurrency(refCurrency)
            if (isSimulate) {
                if (e.GetName() == "Futures_OKCoin") {
                    e.IO("simulate", true)
                }
            }
        }
        e.SetContractType(refCt)
    })

    var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
    while(true) {
        if (IsVirtual()) {    // 回测时才模拟
            test()            // 测试函数,模拟参考账户主动交易,触发跟单账户跟单        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "持仓",
            cols : ["名称", "标签", "多仓", "空仓", "账户资产(Stocks)", "账户资产(Balance)"],
            rows : []
        }
        _.each(exchanges, function(e) {
            var pos = getPosAmount(_C(e.GetPosition), refCt)
            var acc = _C(e.GetAccount)
            tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
        })
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
        
        // 计算仓位变动量
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // 检测变动
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // 检测到仓位变动
            for (var i = 1 ; i < exchanges.length ; i++) {
                // 执行多头动作
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行多头跟单,变动量:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // 执行空头动作
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行空头跟单,变动量:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // 执行跟单操作后,更新
        initRefPosAmount = nowRefPosAmount
    }
}

পরীক্ষা

যেহেতু OKEX V5 ইন্টারফেস আপডেট করার পরে OKEX এর অ্যানালগ ড্রাইভ ব্যবহার করা সম্ভব, তাই আমি দুটি OKEX এর অ্যানালগ ড্রাইভ API KEY ব্যবহার করে খুব সুবিধাজনকভাবে পরীক্ষা করেছি।

প্রথম যোগ করা এক্সচেঞ্জ অবজেক্টটি একটি রেফারেন্স এক্সচেঞ্জ, এবং প্রতিটি এক্সচেঞ্জ এই এক্সচেঞ্জ অ্যাকাউন্টটি অনুসরণ করে কাজ করে। ওকেএক্স অ্যানালগ পৃষ্ঠায়, এক্সচেঞ্জ অ্যাকাউন্টের রেফারেন্সের মাধ্যমে 3 টি ইটিএইচ-এর জন্য কোয়ার্টারাল মুদ্রা বিট চুক্তিগুলি ম্যানুয়ালি সক্রিয় করুন।

img

আপনি দেখতে পাচ্ছেন যে বাস্তব প্লেটটি রেফারেন্স এক্সচেঞ্জ অ্যাকাউন্টের হোল্ডিংয়ের পরিবর্তন সনাক্ত করে এবং তারপরে অপারেশনটি অনুসরণ করে।

img

আমরা এখনই খোলা দুটি চুক্তির স্থিতিশীলতা পুনরায় পরীক্ষা করব, এবং স্থিতিশীলতার পরে অবস্থানগুলি নিম্নরূপঃ

img

তবে এই চুক্তিতে দুইটি চুক্তি স্থগিত করা হয়েছে।

img

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

এই পাতাটি আলাপঃপ্রতিবন্ধী পাতা।https://www.fmz.com/strategy/270012

স্বাগতম।


সম্পর্কিত

আরো

pw1013দুইটি ভিন্ন এক্সচেঞ্জ একসাথে কাজ করতে পারে না

মিংসি১০০৫ইনভেন্টররা কবে পেয়ারিং মুদ্রা জিততে পারবে? মুদ্রা অ্যান এবং ওয়াইটি ফেরত খুব কম, উচ্চ ফ্রিকোয়েন্সির রোবট, খুব ক্ষতিগ্রস্ত।

অ্যাকল্সিআমি আশা করি যে আমরা একটি পেমেন্ট সংস্করণ আছে.

lau99আপনি কি চাইবেন যে, বিএনএ ইউএসডিটি চিরস্থায়ী চুক্তির সংস্করণ, নির্বাহীর এপিআই?

জাউসোনআমি আশা করি টোকিন ইউএসডিটি এর স্থায়ী চুক্তির সংস্করণ আছে

কিউলভ ২৩আপনার শেয়ারের জন্য অনেক ধন্যবাদ, এটা শেখার মতো।

ছোট্ট স্বপ্নযেহেতু এক্সচেঞ্জের চুক্তির স্পেসিফিকেশন আলাদা হতে পারে, তাই নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে কপিরাইট কোডটি সংশোধন করা যেতে পারে।

pw1013আমি বিবক্স এক্সচেঞ্জ ব্যবহার করি, এটিতে ৮০% কমিশন রিটার্ন রয়েছে এবং এফএমজেড সম্পূর্ণরূপে সমর্থিত।

pw1013আমি এখন bibox ফিউচার ব্যবহার করি, আমি যদি অন্য কারও okx এক্সচেঞ্জের সাথে সংযোগ করতে চাই তবে আমি কোথায় পরিবর্তন করতে পারি?

ছোট্ট স্বপ্নএটি সম্ভব, কোড পরিবর্তন করুন।

ছোট্ট স্বপ্নএই এক্সচেঞ্জটি পর্যালোচনা করার জন্য, আমাদের সাথে এখনও কেউ যোগাযোগ করেনি।