Phiên bản mới của Dynamic Balancewww.fmz.comtuần trước tôi đã giới thiệu một chiến lược giao dịch rất hiệu quả và lợi nhuận cao, được gọi là chiến lược cân bằng động. đây là một chiến lược giao dịch rất cổ điển đến từ Warren Buffett cố vấn vĩ đại, Benjamin Graham, một lần được đề cập trong cuốn sách <
Chiến lược ban đầu có thể được xem tại:https://fmzquant.quora.com/Blockchain-Quantitative-Investment-Series-Dynamic-Balance-Strategy
Ngày nay, nhóm lập trình viên giàu kinh nghiệm của chúng tôi đã làm cho phần mã hóa chiến lược này thậm chí còn ngắn hơn và dễ hiểu hơn.
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)
}
}
Những nhà phát minh định lượng - những giấc mơ nhỏTốt lắm!