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

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

میں تخلیق کیا: 2021-04-07 21:30:05, تازہ کاری: 2024-12-05 21:59:36
comments   11
hits   4373

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

پچھلے مضامین میں، ہم نے ایک سادہ اسپاٹ کاپی ٹریڈنگ روبوٹ کو لاگو کیا، آج ہم ایک سادہ کاپی ٹریڈنگ روبوٹ کا کنٹریکٹ ورژن نافذ کریں گے۔

ڈیزائن کے خیالات

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

حکمت عملی پر عمل درآمد

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

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

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

حکمت عملی کا ماخذ کوڈ:

/*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 کیز استعمال کیں۔

پہلی ایکسچینج آبجیکٹ جو شامل کیا گیا ہے وہ ریفرنس ایکسچینج ہے، اور کاپی ایکسچینج اس ایکسچینج اکاؤنٹ کو کام کرنے کے لیے فالو کرے گا۔ OKEX سمولیشن ٹریڈنگ پیج پر، ایکسچینج اکاؤنٹ کی بنیاد پر 3 ETH سہ ماہی سکے پر مبنی معاہدے دستی طور پر رکھیں۔

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

یہ دیکھا جا سکتا ہے کہ حقیقی مارکیٹ ریفرنس ایکسچینج اکاؤنٹ کی پوزیشنوں میں تبدیلیوں کا پتہ لگاتی ہے اور پھر کارروائیوں کی پیروی کرتی ہے۔

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

آئیے ان دو کنٹریکٹ پوزیشنز کو بند کرنے کی کوشش کریں جو ہم نے ابھی کھولی ہیں بند کرنے کے بعد کی پوزیشنیں تصویر میں دکھائی گئی ہیں۔

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

ریئل ٹائم آپریشن پر عمل کریں اور 2 معاہدے بند کریں۔

ڈیجیٹل کرنسی کا معاہدہ سادہ کاپی ٹریڈنگ روبوٹ

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

حکمت عملی کا پتہ: https://www.fmz.com/strategy/270012

ایک پیغام چھوڑنے میں خوش آمدید۔