В процессе загрузки ресурсов... загрузка...

Новая версия динамического баланса

Автор:Доброта, Создано: 2018-08-28 12:05:37, Обновлено: 2019-12-03 17:26:27

Новая версия динамического балансаwww.fmz.comНа прошлой неделе я представил очень эффективную и высокодоходную торговую стратегию, которую я назвал "Динамическая балансовая стратегия". Это очень классическая торговая стратегия, пришедшая от великого наставника Уоррена Баффета, Бенджамина Грэхема, который однажды упомянул в книге <<Интеллигентный инвестор>> торговую модель, в которой акции и облигации динамически сбалансированы.

Первоначальную стратегию можно посмотреть на сайте:https://fmzquant.quora.com/Blockchain-Quantitative-Investment-Series-Dynamic-Balance-Strategy

Сегодня наша команда опытных программистов сделала программирование этой стратегии еще короче и понятнее.

var Coin = ''
var Fiat = ''
var RefreshLoop = 0
var Account = ''
var Depth = ''
var Orders = ''
var BuyWeighted = 0
var SellWeighted = 0
var MidPrice = 0
var InitialBalance = exchange.GetAccount().Balance + exchange.GetAccount().Stocks * exchange.GetDepth().Bids[0].Price

function CancelPendingOrders() {
    for (var j = 0; j < Orders.length; j++) {
          exchange.CancelOrder(Orders[j].Id, Orders[j])}
}

function UpdateAll() {
    Account = exchange.GetAccount()
    Depth = exchange.GetDepth()
    Orders = exchange.GetOrders()
    //Log("UpdateAll")
}

function UpdatePrice() {
    //MidPrice = (Depth.Asks[0].Price+Depth.Bids[0].Price)/2
    BuyWeighted = Depth.Asks[0].Price * (1+SPREAD/100)
    SellWeighted = Depth.Bids[0].Price * (1-SPREAD/100)
    //Log("UpdatePrice")
}

function onTick(){
    // Refresh account balance and market data
    //Log("UpdateAll")
    UpdateAll()
    var Buy = Depth.Asks[0].Price
    var Sell = Depth.Bids[0].Price
    
    // Calculate the weighted price
    //Log("UpdatePrice")
    UpdatePrice()
    
    // Check current order that exist
    if (Orders.length==2){
        return
    }
    if (Orders.length>2){
        CancelPendingOrders()
    }
    // Processing a single order
    if (Orders.length==1){
        Order = Orders[0]
        Price=Order.Price
        if (Order.Type==0){
            if (Price/(1-SPREAD/100) > Sell){
                return
            }else{
                CancelPendingOrders()
                UpdateAll()
            }
        }else{
            if (Price/(1+SPREAD/100) < Buy){
                return
            }else{
                CancelPendingOrders()
                UpdateAll()
            }
        }
    }
    
    // Calculate the value of the position held
    var ValueByBuy = Account.Stocks * BuyWeighted
    var ValueBySell = Account.Stocks * SellWeighted
    Log(Coin + " Value By Weighted Ask - " + Fiat +" Balance : " + (ValueByBuy-Account.Balance))
    Log(Fiat + " Balance - " + Coin +" Value By Weighted Bid : " +(Account.Balance-ValueBySell))
    //Log(ValueByBuy)
    //Log(ValueBySell)
    
    // The value of the currency is higher than the price of coin. sell the coin.
    if (ValueByBuy > Account.Balance){
        ToBeSold = (ValueByBuy - Account.Balance)/2/BuyWeighted
        if (ToBeSold > AMOUNT_MINIMUM){
            ToBeSold = _N(Math.floor(ToBeSold / AMOUNT_INCREMENT) * AMOUNT_INCREMENT)
            Log("Will be sold " + Coin + " Quantity:" + ToBeSold)
            exchange.Sell(BuyWeighted,ToBeSold)
        }
    }
    // The value of the currency is smaller than the coin. buy the coin.
    if (ValueBySell < Account.Balance){
        ToBeBought = (Account.Balance - ValueBySell)/2/SellWeighted
        if (ToBeBought > AMOUNT_MINIMUM){
            ToBeBought = _N(Math.floor(ToBeBought / AMOUNT_INCREMENT) * AMOUNT_INCREMENT)
            Log("Will be brought " + Coin + " Quantity:" + ToBeBought)
            exchange.Buy(SellWeighted,ToBeBought)
        }
    }
    Log(Fiat + " Quantity:" + Account.Balance)
    Log(Coin + " Quantity:" + Account.Stocks)
    
    RefreshLoop = RefreshLoop+1
    if (RefreshLoop>60) {
        var Profit = _N(Account.Stocks*Sell) + _N(Account.Balance) - _N(InitialBalance)
        LogProfit(Profit)
        RefreshLoop = 0
    }
}
function main(){
    var Pair = exchange.GetCurrency()
    LogReset()
    LogProfitReset()
    LogProfit(0)
    UpdateAll()
    CancelPendingOrders()
    Coin = Pair.split("_")[0]
    Fiat = Pair.split("_")[1]
    while (true){
        try {
            onTick()
        } catch (err) {
            Log(err)
        }
        Sleep(DELAY*1000)
    }
}

Больше

Изобретатели количественного измерения - мечтыХорошо!