وسائل لوڈ ہو رہے ہیں... لوڈنگ...

ڈیجیٹل کرنسی کے جوڑے کی تجارت کی حکمت عملی کا ماخذ اور ایف ایم زیڈ پلیٹ فارم کا تازہ ترین API

مصنف:گھاس, تخلیق: 2024-07-10 16:36:54, تازہ کاری: 2024-07-12 15:53:41

img

پیش گوئی

ایک پچھلے مضمون میں ہم نے جوڑے کی تجارت کے اصولوں اور جانچ پڑتال کے بارے میں بات کی تھی۔https://www.fmz.com/digest-topic/10457یہاں ایف ایم زیڈ پلیٹ فارم پر مبنی عملی ماخذ کوڈ دیا گیا ہے ، حکمت عملی نسبتا simple آسان اور واضح ہے اور ابتدائی سیکھنے کے لئے موزوں ہے۔ ایف ایم زیڈ پلیٹ فارم نے حال ہی میں کچھ اے پی آئی کو اپ گریڈ کیا ہے ، جو کثیر لین دین کے لئے زیادہ دوستانہ ہے۔ اس مضمون میں اس پالیسی کا جاوا اسکرپٹ ماخذ کوڈ تفصیل سے بتایا گیا ہے۔ اگرچہ یہ صرف ایک سو لائنوں پر مشتمل ہے ، لیکن اس میں ایک مکمل پالیسی کی ضرورت کے تمام پہلوؤں کو شامل کیا گیا ہے۔ مخصوص اے پی آئی کو اے پی آئی دستاویزات میں دیکھا جاسکتا ہے ، جس میں بہت تفصیل سے بتایا گیا ہے۔ پالیسی کا عوامی پتہ:https://www.fmz.com/strategy/456143آپ کو یہ بھی دیکھنا چاہئے کہ آپ کی ویب سائٹ کو کیسے ڈاؤن لوڈ کیا جائے۔

ایف ایم زیڈ پلیٹ فارم کا استعمال

اگر آپ ایف ایم زیڈ پلیٹ فارم سے واقف نہیں ہیں تو ، ہم آپ کو اس سبق کو پڑھنے کی سفارش کرتے ہیں:https://www.fmz.com/bbs-topic/4145اس کے علاوہ ، اس کے بارے میں مزید تفصیلات ہیں کہ پلیٹ فارم کی بنیادی خصوصیات کیا ہیں اور روبوٹ کو کیسے شروع سے شروع کیا جائے۔

اسٹریٹجک فریم ورک

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

function main(){
    while(true){
        //策略内容
        Sleep(Interval * 1000) //Sleep
    }
}

تاریخی ریکارڈ

روبوٹ کو مختلف وجوہات کی بناء پر بار بار دوبارہ شروع کیا جاتا ہے ، جیسے غلطیوں ، پیرامیٹرز کی تازہ کاری ، پالیسیوں کی تازہ کاری ، وغیرہ۔ یہاں یہ دکھایا گیا ہے کہ آمدنی کا حساب لگانے کے لئے ابتدائی حقوق کو کیسے بچایا جائے گا۔ _G() فنکشن مختلف قسم کے اعداد و شمار کو اسٹور کرسکتا ہے۔ _G(key ، value) value کی قدر کو اسٹور کرسکتا ہے ، جسے _G(key) کے ذریعہ بلایا جاسکتا ہے ، جہاں کی ایک تار ہے۔

let init_eq = 0 //定义初始权益
if(!_G('init_eq')){  //如果没有储存_G('init_eq')返回null
    init_eq = total_eq
    _G('init_eq', total_eq) //由于没有储存,初始权益为当前权益,并在这里储存
}else{
    init_eq = _G('init_eq') //如果储存,读取初始权益的值
}

حکمت عملی کی غلطی

API کے ذریعہ پوزیشن ، مارکیٹ وغیرہ کے اعداد و شمار حاصل کرنے پر ، مختلف وجوہات کی بناء پر ، غلطیاں واپس آسکتی ہیں۔ یہ براہ راست اس میں ڈیٹا کو کال کرنے سے پالیسی غلطی کو روکنے کا سبب بنتی ہے ، جس کے لئے غلطی کی روک تھام کا طریقہ کار درکار ہوتا ہے۔ _C ((() فنکشن غلطی کے بعد خود بخود دوبارہ کوشش کرتا ہے ، جب تک کہ صحیح ڈیٹا واپس نہ آئے۔ یا واپس آنے کے بعد چیک کریں کہ آیا موجودہ ڈیٹا قابل استعمال ہے۔

let pos = _C(exchange.GetPosition, pair)

let ticker_A = exchange.GetTicker(pair_a)
let ticker_B = exchange.GetTicker(pair_b)
if(!ticker_A || !ticker_B){
    continue //如果数据不可用,就跳出这次循环
}

ملٹی کرنسی کے ساتھ ہم آہنگ API

جیسے کہ گیٹ پوزیشن ، گیٹ ٹکر ، گیٹ ریکارڈز جیسے افعال کو ایک ٹرانزیکشن جوڑی کے پیرامیٹرز میں شامل کیا جاسکتا ہے اور اس سے متعلقہ اعداد و شمار حاصل کیے جاسکتے ہیں ، بغیر کسی تبادلہ سے منسلک ٹرانزیکشن جوڑی کو ترتیب دینے کی ضرورت ہے ، جس سے متعدد ٹرانزیکشنز کی پالیسیوں کے ساتھ مطابقت پیدا ہوتی ہے۔https://www.fmz.com/digest-topic/10451اس کے علاوہ، آپ کو اپنے میزبان کو اپ گریڈ کرنے کی ضرورت ہے اگر آپ کا میزبان بہت پرانا ہے.

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

  • Pair_A ٹریڈنگ کرنسی A: ٹریڈنگ کے لئے جوڑی A کی ضرورت ہوتی ہے ، جس کے لئے آپ کو اپنی تجارت کا جوڑا منتخب کرنے کی ضرورت ہوتی ہے ، پچھلے مضمون کا تعارف اور جائزہ لیں۔
  • Pair_B ٹرانزیکشن کرنسی B: ٹرانزیکشن جوڑے B جن کے ساتھ تجارت کی ضرورت ہوتی ہے
  • Quote بیس کرنسی: فیوچر ایکسچینج کی ضمانت والی کرنسی ، عام طور پر USDT
  • پی سی ٹی گرڈ سائز: کس طرح زیادہ سے زیادہ ہاؤسنگ سے انحراف، حکمت عملی کے اصولوں کے بارے میں تفصیلات کے لئے مضمون دیکھیں، طریقہ کار کی فیس اور سلائڈ پوائنٹس کی وجہ سے، بہت چھوٹا نہیں ہونا چاہئے
  • Trade_Value ٹرانزیکشن ویلیو: ہر گرڈ سائز سے انحراف کے لئے تجارت کی قیمت
  • آئس_ویلیو آئس مینڈک کی قیمت: اگر ٹرانزیکشن کی قیمت بہت بڑی ہے تو ، آپ آئس مینڈک کی قیمت کے ساتھ تجارت کھول سکتے ہیں ، عام طور پر اس کی قیمت کے طور پر مقرر کیا جاسکتا ہے
  • Max_Value زیادہ سے زیادہ ہولڈنگ: ایک کرنسی میں زیادہ سے زیادہ ہولڈنگ، زیادہ سے زیادہ ہولڈنگ کے خطرے سے بچنے کے لئے
  • N اوسط قیمت کے پیرامیٹرز: پیرامیٹرز جو اوسط قیمت کے مقابلے کا حساب لگاتے ہیں ، یونٹ گھنٹے ہیں ، جیسے 100 کا مطلب 100h ہے
  • Interval نیند کا وقت ((سیکنڈ): حکمت عملی کے ہر دورانیے کے وقفے میں نیند کا وقت

مکمل حکمت عملی تبصرہ

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

function GetPosition(pair){
    let pos = _C(exchange.GetPosition, pair)
    if(pos.length == 0){ //返回为空代表没有持仓
        return {amount:0, price:0, profit:0}
    }else if(pos.length > 1){ //策略要设置为单向持仓模式
        throw '不支持双向持仓'
    }else{ //为了方便,多仓持仓量为正,空仓持仓量为负
        return {amount:pos[0].Type == 0 ? pos[0].Amount : -pos[0].Amount, price:pos[0].Price, profit:pos[0].Profit}
    }
}

function GetRatio(){
    let kline_A = exchange.GetRecords(Pair_A+"_"+Quote+".swap", 60*60, N) //小时K线
    let kline_B = exchange.GetRecords(Pair_B+"_"+Quote+".swap", 60*60, N)
    let total = 0
    for(let i= Math.min(kline_A.length,kline_B.length)-1; i >= 0; i--){ //反过来计算,避免K线长度不够
        total += kline_A[i].Close / kline_B[i].Close
    }
    return total / Math.min(kline_A.length,kline_B.length)
}

function GetAccount(){
    let account = _C(exchange.GetAccount)
    let total_eq = 0
    if(exchange.GetName == 'Futures_OKCoin'){ //由于这里的API并不兼容,目前仅OKX期货交易所获取到总权益
        total_eq = account.Info.data[0].totalEq //其他交易所的宗权益Info中也包含,可以自己对着交易所API文档找找
    }else{
        total_eq = account.Balance //其它交易所暂时使用可用余额,会造成计算收益错误,但不影响策略使用
    }
    let init_eq = 0
    if(!_G('init_eq')){
        init_eq = total_eq
        _G('init_eq', total_eq)
    }else{
        init_eq = _G('init_eq')
    }
    LogProfit(total_eq - init_eq)
    return total_eq
}

function main(){
    var precision = exchange.GetMarkets() //这里获取精度
    var last_get_ratio_time = Date.now()
    var ratio = GetRatio()
    var total_eq = GetAccount()
    while(true){
        let start_loop_time = Date.now()
        if(Date.now() - last_get_ratio_time > 10*60*1000){ //每10分钟更新下均价和账户信息
            ratio = GetRatio()
            total_eq = GetAccount()
            last_get_ratio_time = Date.now()
        }
        let pair_a = Pair_A+"_"+Quote+".swap" //交易对的设置形如BTC_USDT.swap
        let pair_b = Pair_B+"_"+Quote+".swap"
        let CtVal_a = "CtVal" in precision[pair_a] ? precision[pair_a].CtVal : 1 //有的交易所用张来代表数量,如一张代表0.01个币,因此需要换算下
        let CtVal_b = "CtVal" in precision[pair_b] ? precision[pair_b].CtVal : 1 //不含这个字段的不用张
        let position_A = GetPosition(pair_a)
        let position_B = GetPosition(pair_b)
        let ticker_A = exchange.GetTicker(pair_a)
        let ticker_B = exchange.GetTicker(pair_b)
        if(!ticker_A || !ticker_B){ //如果返回数据异常,跳出这次循环
            continue
        }
        let diff = (ticker_A.Last / ticker_B.Last - ratio) / ratio //计算偏离的比例
        let aim_value = - Trade_Value * diff / Pct //目标持有的仓位
        let id_A = null
        let id_B = null
        //以下是具体的开仓逻辑
        if( -aim_value + position_A.amount*CtVal_a*ticker_A.Last > Trade_Value && position_A.amount*CtVal_a*ticker_A.Last > -Max_Value){
            id_A = exchange.CreateOrder(pair_a, "sell", ticker_A.Buy, _N(Ice_Value / (ticker_A.Buy * CtVal_a), precision[pair_a].AmountPrecision))
        }
        if( -aim_value - position_B.amount*CtVal_b*ticker_B.Last > Trade_Value && position_B.amount*CtVal_b*ticker_B.Last < Max_Value){
            id_B = exchange.CreateOrder(pair_b, "buy", ticker_B.Sell, _N(Ice_Value / (ticker_B.Sell * CtVal_b), precision[pair_b].AmountPrecision))
        }
        if( aim_value - position_A.amount*CtVal_a*ticker_A.Last > Trade_Value && position_A.amount*CtVal_a*ticker_A.Last < Max_Value){
            id_A = exchange.CreateOrder(pair_a, "buy", ticker_A.Sell, _N(Ice_Value / (ticker_A.Sell * CtVal_a), precision[pair_a].AmountPrecision))
        }
        if( aim_value + position_B.amount*CtVal_b*ticker_B.Last > Trade_Value &&  position_B.amount*CtVal_b*ticker_B.Last > -Max_Value){
            id_B = exchange.CreateOrder(pair_b, "sell", ticker_B.Buy, _N(Ice_Value / (ticker_B.Buy * CtVal_b), precision[pair_b].AmountPrecision))
        }
        if(id_A){
            exchange.CancelOrder(id_A) //这里直接撤销
        }
        if(id_B){
            exchange.CancelOrder(id_B)
        }
        let table = {
            type: "table",
            title: "交易信息",
            cols: ["初始权益", "当前权益", Pair_A+"仓位", Pair_B+"仓位", Pair_A+"持仓价", Pair_B+"持仓价", Pair_A+"收益", Pair_B+"收益", Pair_A+"价格", Pair_B+"价格", "当前比价", "平均比价", "偏离均价", "循环延时"],
            rows: [[_N(_G('init_eq'),2), _N(total_eq,2), _N(position_A.amount*CtVal_a*ticker_A.Last, 1), _N(position_B.amount*CtVal_b*ticker_B.Last,1),
                _N(position_A.price, precision[pair_a].PircePrecision), _N(position_B.price, precision[pair_b].PircePrecision),
                _N(position_A.profit, 1), _N(position_B.profit, 1), ticker_A.Last, ticker_B.Last,
                _N(ticker_A.Last / ticker_B.Last,6), _N(ratio, 6), _N(diff, 4), (Date.now() - start_loop_time)+"ms"
            ]]
        }
        LogStatus("`" + JSON.stringify(table) + "`") //这个函数会在机器人页面显示包含以上信息的表格
        Sleep(Interval * 1000) //休眠时间为ms
    }
}

مزید

سیڈیانشوئیاہیلو ، دوبارہ جانچ کریں exchange.GetMarkets (() صرف ایک ٹریڈنگ جوڑی کے اعداد و شمار کو حاصل کریں ، کس طرح سیٹ اپ متعدد حاصل کرنے کے لئے ، مثال کے طور پر دو ٹریڈنگ جوڑوں کے اعداد و شمار کو حاصل کریں۔

77924998کیا آپ کے پاس کوئی پائیتھون ورژن ہے؟

پھلیاں 888/upload/asset/21c799a2c667c13fcb0bd.png کچھ گندا

ایجاد کاروں کی مقدار - خوابریٹیسٹ فی الحال گیٹ مارکیٹس فنکشن کی حمایت نہیں کرتا ہے ، اس کی حمایت تھوڑی دیر کے لئے انتظار کر سکتے ہیں۔

چاؤ ژانگتازہ ترین میزبانوں میں اپ گریڈ کریں