রিসোর্স লোড হচ্ছে... লোডিং...

ভারসাম্যপূর্ণ অপেক্ষমান অর্ডার কৌশল (শিক্ষা কৌশল)

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-১২-১৯ 17:19:44, আপডেটঃ ২০২৩-০৯-২০ 10:01:27

img

ভারসাম্যপূর্ণ অপেক্ষমান অর্ডার কৌশল (শিক্ষা কৌশল)

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

  • কৌশল লজিক ইনক্যাপসুলেশন রানটাইমে কিছু ডেটা এবং ট্যাগ ভেরিয়েবলের সাথে কৌশল লজিককে ক্যাপসুল করুন (বস্তু হিসাবে ক্যাপসুল করা) ।

  • কৌশল প্রক্রিয়াকরণের সূচনা কোড প্রাথমিক অ্যাকাউন্টের তথ্য মুনাফা গণনার জন্য প্রাথমিক রান রেকর্ড করা হয়। প্রাথমিক রানটাইমে, আপনি পরামিতি অনুযায়ী ডেটা পুনরুদ্ধার করতে চান কিনা তা চয়ন করতে পারেন।

  • কৌশল ইন্টারঅ্যাকশন প্রক্রিয়াকরণের জন্য কোড বিরতি এবং পুনরায় শুরু করার একটি সহজ ইন্টারেক্টিভ প্রসেসিং ডিজাইন করা হয়েছে।

  • কৌশলগত মুনাফা গণনার জন্য কোড মুদ্রা মানক গণনার পদ্ধতি ব্যবহার করা হয় মুনাফা গণনার জন্য।

  • কৌশলটিতে মূল তথ্যের ধারাবাহিকতার প্রক্রিয়া ডেটা পুনরুদ্ধারের জন্য যন্ত্রপাতি ডিজাইন করা।

  • কৌশল প্রক্রিয়াকরণের তথ্য প্রদর্শনের জন্য কোড স্ট্যাটাস বার ডেটা প্রদর্শন।

কৌশল কোড

var Shannon = {
    // member
    e : exchanges[0],
    arrPlanOrders : [],
    distance : BalanceDistance,
    account : null,
    ticker : null, 
    initAccount : null,
    isAskPending : false,
    isBidPending : false,

    // function 
    CancelAllOrders : function (e) {
        while(true) {
            var orders = _C(e.GetOrders)
            if(orders.length == 0) {
                return 
            }
            Sleep(500)
            for(var i = 0; i < orders.length; i++) {
                e.CancelOrder(orders[i].Id, orders[i])
                Sleep(500)
            }
        }
    },

    Balance : function () {
        if (this.arrPlanOrders.length == 0) {
            this.CancelAllOrders(this.e)
            var acc = _C(this.e.GetAccount)
            this.account = acc
            var askPendingPrice = (this.distance + acc.Balance) / acc.Stocks
            var bidPendingPrice = (acc.Balance - this.distance) / acc.Stocks
            var askPendingAmount = this.distance / 2 / askPendingPrice
            var bidPendingAmount = this.distance / 2 / bidPendingPrice

            this.arrPlanOrders.push({tradeType : "ask", price : askPendingPrice, amount : askPendingAmount}) 
            this.arrPlanOrders.push({tradeType : "bid", price : bidPendingPrice, amount : bidPendingAmount})
        } else if(this.isAskPending == false && this.isBidPending == false) {
            for(var i = 0; i < this.arrPlanOrders.length; i++) {
                var tradeFun = this.arrPlanOrders[i].tradeType == "ask" ? this.e.Sell : this.e.Buy
                var id = tradeFun(this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount)
                if(id) {
                    this.isAskPending = this.arrPlanOrders[i].tradeType == "ask" ? true : this.isAskPending
                    this.isBidPending = this.arrPlanOrders[i].tradeType == "bid" ? true : this.isBidPending
                } else {
                    Log("Pending order failed, clear!")
                    this.CancelAllOrders(this.e)
                    return 
                }
            }
        }

        if(this.isBidPending || this.isAskPending) {
            var orders = _C(this.e.GetOrders)
            Sleep(1000)
            var ticker = _C(this.e.GetTicker)
            this.ticker = ticker
            if(this.isAskPending) {
                var isFoundAsk = false 
                for (var i = 0; i < orders.length; i++) {
                    if(orders[i].Type == ORDER_TYPE_SELL) {
                        isFoundAsk = true
                    }
                }
                if(!isFoundAsk) {
                    Log("Selling order filled, cancel the order, reset")
                    this.CancelAllOrders(this.e)
                    this.arrPlanOrders = []
                    this.isAskPending = false 
                    this.isBidPending = false 
                    LogProfit(this.CalcProfit(ticker))
                    return 
                }
            }
            if(this.isBidPending) {
                var isFoundBid = false 
                for(var i = 0; i < orders.length; i++) {
                    if(orders[i].Type == ORDER_TYPE_BUY) {
                        isFoundBid = true
                    }
                }
                if(!isFoundBid) {
                    Log("Buying order filled, cancel the order, reset")
                    this.CancelAllOrders(this.e)
                    this.arrPlanOrders = []
                    this.isAskPending = false 
                    this.isBidPending = false 
                    LogProfit(this.CalcProfit(ticker))
                    return 
                }
            }        
        }
    }, 
    ShowTab : function() {
        var tblPlanOrders = {
            type : "table", 
            title : "Plan pending orders", 
            cols : ["direction", "price", "amount"], 
            rows : []
        }
        for(var i = 0; i < this.arrPlanOrders.length; i++) {
            tblPlanOrders.rows.push([this.arrPlanOrders[i].tradeType, this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount])
        }

        var tblAcc = {
            type : "table", 
            title : "Account information", 
            cols : ["type", "Stocks", "FrozenStocks", "Balance", "FrozenBalance"], 
            rows : []            
        }
        tblAcc.rows.push(["Initial", this.initAccount.Stocks, this.initAccount.FrozenStocks, this.initAccount.Balance, this.initAccount.FrozenBalance])
        tblAcc.rows.push(["This", this.account.Stocks, this.account.FrozenStocks, this.account.Balance, this.account.FrozenBalance])
        
        return "Time:" + _D() + "\n `" + JSON.stringify([tblPlanOrders, tblAcc]) + "`" + "\n" + "ticker:" + JSON.stringify(this.ticker)
    },
    CalcProfit : function(ticker) {
        var acc = _C(this.e.GetAccount)
        this.account = acc
        return (this.account.Balance - this.initAccount.Balance) + (this.account.Stocks - this.initAccount.Stocks) * ticker.Last
    },
    Init : function() {
        this.initAccount = _C(this.e.GetAccount)
        if(IsReset) {
            var acc = _G("account")
            if(acc) {
                this.initAccount = acc 
            } else {
                Log("Failed to restore initial account information! Running in initial state!")
                _G("account", this.initAccount)
            }
        } else {
            _G("account", this.initAccount)
            LogReset(1)
            LogProfitReset()
        }
    },
    Exit : function() {
        Log("Cancel all pending orders before stopping...")
        this.CancelAllOrders(this.e)
    }
}

function main() {
    // Initialization
    Shannon.Init()

    // Main loop
    while(true) {
        Shannon.Balance()        
        LogStatus(Shannon.ShowTab())
        // Interaction
        var cmd = GetCommand()
        if(cmd) {
            if(cmd == "stop") {
                while(true) {
                    LogStatus("Pause", Shannon.ShowTab())
                    cmd = GetCommand()
                    if(cmd) {
                        if(cmd == "continue") {
                            break
                        }
                    }
                    Sleep(1000)
                }
            }
        }
        Sleep(5000)
    }
}

function onexit() {
    Shannon.Exit()
}

ব্যাকটেস্টিং

img img img img

অপ্টিমাইজেশন এবং সম্প্রসারণ

  • একটি ভার্চুয়াল মুলতুবি অর্ডার প্রক্রিয়া যোগ করা যেতে পারে। কিছু এক্সচেঞ্জের মুলতুবি অর্ডারের উপর সীমিত মূল্য রয়েছে, তাই অর্ডারটি আসলে স্থাপন করা নাও হতে পারে। আপনাকে মূল্যটি আসল মুলতুবি অর্ডারের কাছাকাছি না হওয়া পর্যন্ত অপেক্ষা করতে হবে।
  • ফিউচার ট্রেডিং যোগ করুন।
  • একটি মাল্টি-প্রজাতি এবং মাল্টি-বিনিময় সংস্করণ প্রসারিত করুন।

কৌশলগুলি শুধুমাত্র শিক্ষামূলক উদ্দেশ্যে এবং বাস্তব বট ট্রেডিংয়ে সতর্কতার সাথে ব্যবহার করা উচিত। কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/225746


সম্পর্কিত

আরো