Địa chỉ chiến lược:https://www.fmz.com/strategy/345
Trong bài viết này, chúng ta hãy thực hành chuyển đổi một chiến lược JavaScript đơn giản. Thông qua chuyển đổi chiến lược, chúng ta có thể trở nên quen thuộc hơn với cuộc gọi của giao diện nền tảng FMZ Quant Trading Platform, và hiểu sự khác biệt nhỏ giữa các ngôn ngữ khác nhau trong chiến lược phát triển nền tảng. Trên thực tế, sự khác biệt giữa phiên bản JavaScript và phiên bản Python rất nhỏ, bởi vì các cuộc gọi giao diện về cơ bản giống nhau.
Mô tả trích từ phiên bản JavaScript:
Điều này đòi hỏi phải mở một vị trí. Ví dụ, nếu tài khoản có 5000 nhân dân tệ và một loại tiền tệ, nếu giá trị của đồng tiền lớn hơn số dư tài khoản 5000 nhân dân tệ và sự khác biệt giá vượt quá giá ngưỡng, ví dụ, nếu đồng tiền hiện có giá trị 6000 nhân dân tệ, sau đó bán (6000-5000)/6000/2 tiền tệ, cho thấy rằng đồng tiền đã tăng giá và chúng tôi có thể chuyển đổi tiền trở lại. Nếu đồng tiền đã mất giá, ví dụ, 4000 nhân dân tệ, sau đó chúng tôi mua (5000-4000)/4000/2 tiền tệ. Nếu đồng tiền giảm, mua một số. Nếu nó tăng trở lại, bán lại, giống như số dư, hai bên có các phòng hộ khác nhau, vì vậy tôi gọi nó là chiến lược cân bằng.
Nguyên tắc của chiến lược rất đơn giản. Mã của phiên bản JavaScript không dài, chỉ hơn 70 dòng. Chiến lược ngôn ngữ Python với ngữ pháp ngắn gọn hơn được cấy ghép, và mã ngắn hơn nhiều, rất phù hợp cho người mới bắt đầu học. Có rất nhiều mã được chia sẻ bởi các nhà phát triển trên nền tảng giao dịch FMZ Quant, và ngôn ngữ hỗ trợJavaScript
/C++
/Python
Do đó, làm chủ nhiều ngôn ngữ phát triển hơn không chỉ hữu ích cho các chiến lược học tập, nghiên cứu và phát triển, mà còn quen thuộc với các giao diện API khác nhau của nền tảng.
'''backtest
start: 2019-12-01 00:00:00
end: 2020-02-01 11:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT","stocks":1}]
'''
InitAccount = None
def CancelPendingOrders():
ret = False
while True:
orders = _C(exchange.GetOrders)
if len(orders) == 0 :
return ret
for j in range(len(orders)):
exchange.CancelOrder(orders[j].Id)
ret = True
if j < len(orders) - 1:
Sleep(Interval)
return ret
def onTick():
acc = _C(exchange.GetAccount)
ticker = _C(exchange.GetTicker)
spread = ticker.Sell - ticker.Buy
diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2
ratio = diffAsset / acc.Balance
LogStatus("ratio:", ratio, _D())
if abs(ratio) < threshold:
return False
if ratio > 0 :
buyPrice = _N(ticker.Sell + spread, ZPrecision)
buyAmount = _N(diffAsset / buyPrice, XPrecision)
if buyAmount < MinStock:
return False
exchange.Buy(buyPrice, buyAmount, diffAsset, ratio)
else :
sellPrice = _N(ticker.Buy - spread, ZPrecision)
sellAmount = _N(-diffAsset / sellPrice, XPrecision)
if sellAmount < MinStock:
return False
exchange.Sell(sellPrice, sellAmount, diffAsset, ratio)
return True
def main():
global InitAccount, LoopInterval
InitAccount = _C(exchange.GetAccount)
LoopInterval = max(LoopInterval, 1)
while True:
if onTick():
Sleep(1000)
CancelPendingOrders()
Log(_C(exchange.GetAccount))
Sleep(LoopInterval * 1000)
Mã bắt đầu bằng
'''backtest
start: 2019-12-01 00:00:00
end: 2020-02-01 11:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT","stocks":1}]
'''
Nó đề cập đến cấu hình backtesting, có nghĩa là cấu hình backtesting (cài đặt) được lưu dưới dạng mã và được cấu hình tự động theo cài đặt trong quá trình backtesting. Ghi chú:https://www.fmz.com/bbs-topic/859
Các thông số của chiến lược này hoàn toàn phù hợp với phiên bản JavaScript. Mã chiến lược cũng được cấy ghép câu theo câu. Cấu trúc chương trình không thay đổi. Bạn có thể so sánh các chiến lược được viết trong các ngôn ngữ khác nhau câu theo câu.
Cấu hình tham số
Số liệu thống kê
Địa chỉ chiến lược:https://www.fmz.com/strategy/183374
Chiến lược chỉ dành cho tham khảo, học tập và kiểm tra lại. Nếu bạn quan tâm, bạn có thể tối ưu hóa và nâng cấp nó.