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

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

مصنف:FMZ~Lydia, تخلیق: 2024-07-11 14:57:15, تازہ کاری: 2024-07-12 15:55:53

img

پیش لفظ

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

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

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

حکمت عملی کا فریم ورک

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

function main(){
    while(true){
        //strategy content
        Sleep(Interval * 1000) //Sleep
    }
}

تاریخی اعداد و شمار ریکارڈ کریں

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

let init_eq = 0 //defining initial equity
if(!_G('init_eq')){  //If there is no storage, _G('init_eq') returns null.
    init_eq = total_eq
    _G('init_eq', total_eq) //Since there is no storage, the initial equity is the current equity and is stored here
}else{
    init_eq = _G('init_eq') //If stored, read the value of the initial equity
}

حکمت عملی غلطی برداشت

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 //If the data is not available, exit the loop.
}

کثیر کرنسی ہم آہنگ API

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

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

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

مکمل حکمت عملی نوٹ

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

function GetPosition(pair){
    let pos = _C(exchange.GetPosition, pair)
    if(pos.length == 0){ //Returns null to indicate no position
        return {amount:0, price:0, profit:0}
    }else if(pos.length > 1){ //The strategy should be set to unidirectional position mode
        throw 'Bidirectional positions are not supported'
    }else{ //For convenience, long positions are positive and short positions are negative
        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) //Hourly K-line
    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--){ //Calculate in reverse to avoid the K-line being too short.
        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'){ //Since the API here is not compatible, only OKX Futures Exchange obtains the total equity currently.
        total_eq = account.Info.data[0].totalEq //The equity information of other exchanges is also included. You can look for it yourself in the exchange API documentation.
    }else{
        total_eq = account.Balance //Temporary use of available balances on other exchanges will cause errors in calculating returns, but will not affect the use of strategies.
    }
    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() //Get the precision here
    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){ //Update the average price and account information every 10 minutes
            ratio = GetRatio()
            total_eq = GetAccount()
            last_get_ratio_time = Date.now()
        }
        let pair_a = Pair_A+"_"+Quote+".swap" //The trading pair is set as BTC_USDT.swap
        let pair_b = Pair_B+"_"+Quote+".swap"
        let CtVal_a = "CtVal" in precision[pair_a] ? precision[pair_a].CtVal : 1 //Some exchanges use sheets to represent quantity, such as one sheet represents 0.01 coin, so you need to convert.
        let CtVal_b = "CtVal" in precision[pair_b] ? precision[pair_b].CtVal : 1 //No need to include this field
        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){ //If the returned data is abnormal, jump out of this loop
            continue
        }
        let diff = (ticker_A.Last / ticker_B.Last - ratio) / ratio //Calculate the ratio of deviation
        let aim_value = - Trade_Value * diff / Pct //Target holding position
        let id_A = null
        let id_B = null
        //The following is the specific logic of opening a position
        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) //Cancel directly here
        }
        if(id_B){
            exchange.CancelOrder(id_B)
        }
        let table = {
            type: "table",
            title: "trading Information",
            cols: ["initial equity", "current equity", Pair_A+"position", Pair_B+"position", Pair_A+"holding price", Pair_B+"holding price", Pair_A+"profits", Pair_B+"profits", Pair_A+"price", Pair_B+"price", "current price comparison", "average price comparison", "deviation from average price", "loop delay"],
            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) + "`") //This function will display a table containing the above information on the robot page.
        Sleep(Interval * 1000) //Sleep time in ms
    }
}

مزید