[TOC]
Đây là một hướng dẫn cơ bản cho người mới bắt đầu, cho một phiên bản đầy đủ của tài liệu API của chúng tôi, kiểm tra trênFMZ APICó rất nhiều thông số kỹ thuật rõ ràng mà không được đề cập trong hướng dẫn này để bạn khám phá.
Sau khi học toàn bộ hướng dẫn, bạn sẽ biết cách FMZ hoạt động và có thể viết một số chiến lược cơ bản.
Nền tảng FMZ là gì?
FMZ là một nền tảng giao dịch tự động cho các nhà giao dịch tiền điện tử với hỗ trợ cho nhiều thị trường trao đổi bitcoin / et / altcoin.
FMZ có thể làm gì cho anh?
Bạn có thể tìm hiểu cách viết bot của bạn từ chiến lược của chúng tôi
FMZ hỗ trợ sàn giao dịch Cryptocurrency nào?
FMZ hỗ trợ hầu hết các sàn giao dịch phổ biến, chẳng hạn nhưBinance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, vv bạn cũng có thể giao dịch tương lai trênOKEX
vàBitMEX
Xem danh sách hỗ trợ đầy đủ trênAPIBạn chỉ cần viết một chiến lược và chạy nó trên tất cả các sàn giao dịch mà không có bất kỳ thay đổi.
FMZ hỗ trợ ngôn ngữ lập trình nào?
FMZ hỗ trợ JavaScript, Python, C ++ (JavaScript và Python được khuyến cáo) để mã hóa các chiến lược của bạn.
API KEY của anh có an toàn không?
Đúng vậy, các API-KEY của bạn được lưu sau khi mã hóa.
https
.Danh sách tính năng hiện tại:
Để chạy một bot, bạn cần có một chiến lược, thêm một trao đổi, triển khai một docker đầu tiên. docker là thực thi của chiến lược của bạn chạy trên máy tính hoặc máy chủ của riêng bạn.
Một cái nhìn nhanh về trang chính
Thêm trao đổi
Thêm vàohttps://www.fmz.com/m/add-platform, hoặc nhấpPlatform
nhãn.
Chìa khóa truy cập và khóa bí mật của bạn có thể được áp dụng tại sàn giao dịch tiền điện tử. API-KEY được sử dụng để giao dịch và lấy thông tin riêng tư từ sàn giao dịch. Chúng tôi không lưu bất kỳ API-KEY hoặc mật khẩu nào trên máy chủ của chúng tôi.
Bạn có thể đăng ký trên FMZtrao đổi mô phỏngvà thêm nó để thử nghiệm.
triển khai một docker
FMZ không chạy bot cho bạn, bạn cần phải triển khai một docker của chính mình như là người thực thi, đó là linh hoạt và an toàn hơn vì dịch vụ của chúng tôi không tham gia vào việc chạy bot của bạn.
Đối với cửa sổ, nó khá dễ dàng, chỉ cần làm theo hướng dẫn trênhttps://www.fmz.com/m/add-node
Đối với Linux, bạn có thể thuê một VPS trên trang web của chúng tôi, sẽ triển khai docker tự động.
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
, lệnh không tìm thấy? cài đặt đầu tiênyum install wget -y
.tar -xzvf robot_linux_amd64.tar.gz
để mở zip../robot -s node.fmz.com/xxxxx -p -p yourFMZpassword
, bạn nên thấy một cái gì đó như2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomain
Điều đó có nghĩa là mọi thứ đã được thực hiện.node.fmz.com/xxxxx
là duy nhất cho mỗi người dùng, tìm riêng của bạn trênhttps://www.fmz.com/m/add-node.ctrl + C
để ngăn chặn docker.nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
để chạy trong nền. bước này cũng có thể được thực hiện bằng cáchScreen
command.Viết một chiến lược
Bạn nên viết chiến lược của riêng bạn hoặc mua từ hình vuông. Ở đây chúng tôi sẽ sử dụng một chiến lược JavaScript đơn giản như một bản demo để cho thấy cách sử dụng trang chỉnh sửa.https://www.fmz.com/strategy/125482. Bài hướng dẫn này sẽ không bao gồm cách sử dụng JavaScript vì bạn có thể tìm thấy rất nhiều hướng dẫn trực tuyến.
Ctrl+S
trên chế độ chỉnh sửa.Dưới đây là lời giải thích đầy đủ về chiến lược. Để đẩy tin nhắn đến điện thoại của bạn, bạn cần phải liên kết điện tín với tài khoản của bạn tạihttps://www.fmz.com/m/account
/*
This strategy will send a message to your telegram when the price is higher or lower than
the set price.
All strategies must have a main function as the entrance.
*/
function main() {
//change symbol,will cover the default symbol which was set when start a bot.Currency is a strategy arguments
exchange.IO("currency", Currency)
var lastPushTime = 0 //the variable of last push timestamp.
while(true){ //run a infinite loop, which is the basic structure
//_C() function can retry the request automatically after failure. not necessary. var ticker = exchange.GetTicker() is ok.
var ticker = _C(exchange.GetTicker) // for information about GetTicker, check on https://fmz-docs.readthedocs.io/en/latest/code_Instruction/Market%20API.html#getticker
if(ticker.Last > UpPrice || ticker.Last < LowPrice){ //ticker.Last represents the last deal price
if(Date.now() - lastPushTime > 300*1000){ //only push once in 5 mins, Date.now() return ms.
lastPushTime = Date.now() //update lastPushTime
Log(Currency, 'Price is: ', ticker.Last, '@') //Log the price on the bot's page and sent the message. '@' in the end means push message
}
}
Log(Currency, 'Price is: ', ticker.Last) //just log the price
Sleep(Interval*1000) //check the last price again after Interval seconds
}
}
Chạy robot.
Cuối cùng, đã đến lúc chạy một robot.
TrênRobot
trang, nhấpAdd robot
, hoặc đến thămhttps://www.fmz.com/m/add-robottrực tiếp để thêm một bot.
exchanges[0]
, exchanges[1]
Quản lý bot
TrênRobot
Trang, bạn có thể thấy robot đang chạy.
LogProfit()
, có thể là bất kỳ con số nào bạn muốn.Nhấp vào tên bot để truy cập trang bot để biết thêm thông tin:
Phần này sẽ giới thiệu một số API được sử dụng phổ biến nhất, cho một phiên bản đầy đủ của tài liệu API của chúng tôi, kiểm tra trênFMZ API. Nó được khuyến cáo mạnh mẽ cho người mới bắt đầu để chạy mã demo trênTrang gỡ lỗi.
2.1 Khai thác
Sử dụng: Log(msg)
Các thông số:chuỗi hoặc sốMô tả:Đăng một tin nhắn vào trang nhật ký robot.Quay lại:Không cóDemo:
function main() {
var msg = 'msg string'
Log(msg)
Log('hello', 'world', 123)
Log("red color message", "#FF0000")
Log("push this message to telegram!@") // won't push on debug page
}
2.2 GetTicker
Sử dụng: exchange.GetTicker()
Các thông số:Không cóMô tả:Nhận được thị trường hiện tại.Quay lại:
{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
Demo:
function main() {
var ticker = exchange.GetTicker()
Log(ticker)
Log('Last Price: ',ticker.Last, 'Bid Price: ', ticker.Buy)
}
2.3 Tìm hiểu sâu
Sử dụng: exchange.GetDepth()
Các thông số:Không cóMô tả:Nhận sổ lệnh thị trường hiện tại.Quay lại:
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
{"Price":5866.73,"Amount":0.05},
{"Price":5866.77,"Amount":0.05},
{"Price":5867.01,"Amount":0.15},
{"Price":5875.89,"Amount":0.05},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
{"Price":5864.15,"Amount":0.013053},
{"Price":5863.65,"Amount":0.016727},
{"Price":5863.51,"Amount":0.128906},
{"Price":5863.15,"Amount":0.2}
......
],
"Time":1530241857399
}
Demo:
function main() {
var depth = exchange.GetDepth()
Log(depth)
Log('Bid one: ', depth.Bids[0].Price, 'Ask one: ', depth.Asks[0].Price)
}
2.4 GetRecords
Sử dụng: exchange.GetRecords()
, exchange.GetRecords(Period)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Thời gian | Global varble | Không. | Chu kỳ Kline |
Tất cả các thông số có thể:PERIOD_M1
01 phút,PERIOD_M5
5 phút.PERIOD_M15
15 phút.PERIOD_M30
:30 phút,PERIOD_H1
1h,PERIOD_D1
1d.Mô tả:Đưa các thanh Kline/candlestick cho thị trường hiện tại.Quay lại:
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
Demo:
//A useful JavaScript example using Records to get a close array:
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
2.5 GetAccount
Sử dụng: exchange.GetAccount()
Các thông số:Không cóMô tả:Nhận thông tin tài khoảnQuay lại:
{
"Stocks":0.38594816,// free base asset
"FrozenStocks":0, //locked base asset
"Balance":542.858308,//free quote asset
"FrozenBalance":0 //locked quote asset
"Info":{} //the raw data
}
Demo:
//A useful JavaScript example of Log your account value for a certain trading pair:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
2.6 Mua
Sử dụng: exchange.Buy(Price, Amount)
, exchange.Buy(Price, Amount, Msg)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Giá cả | Số | Vâng. | Giá mua lệnh giới hạn |
Số tiền | Số | Vâng. | Giá trị lệnh mua giới hạn |
Msg | Dòng | Không. | Thêm một tin nhắn bổ sung vào trang Log |
Mô tả:Gửi lệnh mua và nhật ký mua tại trang của botQuay lại:trả về OrderID nếu thành công,null
Nếu không.Demo:
//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(price+5, 1, 'BTC-USDT')
}
Sleep(3000)//Sleep 3000ms
}
}
2.7 Bán
Sử dụng: exchange.Sell(Price, Amount)
, exchange.Sell(Price, Amount, Msg)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Giá cả | Số | Vâng. | Giá bán lệnh giới hạn |
Số tiền | Số | Vâng. | bán số tiền lệnh giới hạn |
Msg | Dòng | Không. | Thêm một tin nhắn bổ sung vào trang Log |
Mô tả:Gửi lệnh bán và nhật ký bán tại trang botQuay lại:trả về OrderID nếu thành công,null
Nếu không.Demo:
//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Buy
if(price >= 7000){
var id = exchange.Sell(price-5, 1, 'BTC-USDT')
Log('OrderId: ', id)
}
Sleep(3000)
}
}
2.8 GetOrder
Sử dụng: exchange.GetOrder(OrderId)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Đặt hàng | Số | Vâng. | Đơn đặt hàng |
Mô tả:Nhận chi tiết đơn đặt hàng theo ID đơn đặt hàng.Quay lại:
{
"Id":125723661,
"Amount":0.01,
"Price":7000,
"DealAmount":0,
"AvgPrice":0,
"Status":0, // 0:Not filled, 1:Filled, 2:Canceled
"Type":1,// 0:Buy, 1:Sell
"ContractType":"",//just for futures contract orders
"Info":{} //raw info from exchange
}
}
Demo:
//A JavaScript example of using this API, which will buy until your account has 5 coins:
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(10-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(Status == 0){
exchange.CancelOrder(id)
}
}
}
}
2.9 GetOrders
Sử dụng: exchange.GetOrders()
Các thông số:Không cóMô tả:Nhận tất cả các lệnh mở cho các biểu tượng giao dịch của bạn.Quay lại:Một danh sách các đơn đặt hàng mở, kết quả có cùng một ý nghĩa nhưGetOrder()
[
{
"Info":{},
"Id":16387538,
"Amount":1123,
"Price":0.00012826,
"DealAmount":0,
"AvgPrice":0,
"Status":0,
"Type":1,
"ContractType":""
}
]
Demo:
//A JavaScript example of using this API, which will cancel all open orders for trading symbol:
fuction CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length,i++){
exchange.CancelOrder(orders[[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
2.10 Hủy lệnh
Sử dụng: exchange.CancelOrder(OrderId)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Đặt hàng | Số | Vâng. | Đơn đặt hàng |
Mô tả:Hủy đơn đặt hàng bằng ID đơn đặt hàng.Quay lại:kiểu bool,true
có nghĩa là việc hủy yêu cầu đặt hàng đã thành công.false
có nghĩa là việc hủy yêu cầu đặt hàng đã thất bại.
2.11 SetContractType
Sử dụng: exchange.SetContractType(ContractType)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
ContractType | Dòng | Vâng. | ContractType |
Mô tả:Đặt loại hợp đồng cho giao dịch tương lai. phải được thiết lập trước khi sử dụng API riêng khác.Quay lại:Không cóDemo:
exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc
2.12 GetPosition
Sử dụng: exchange.GetPosition()
Các thông số:Không cóMô tả:Nhận thông tin vị trí hiện tại, chỉ cho giao dịch tương lai.Quay lại:Một danh sách các vị trí, sẽ trả về danh sách trống nếu tài khoản không có vị trí.Demo:
// Note: GetPosition function obtains all positions.
function main(){
exchange.SetContractType("this_week") //for OKEX future
var position = exchange.GetPosition()
if(position.length>0){
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type, "ContractType:", position[0].ContractType)
}
}
2.13 SetDirection
Sử dụng: exchange.SetDirection(Direction)
Các thông số:
Tên | Loại | Cần bắt buộc | Mô tả |
---|---|---|---|
Định hướng | Dòng | Vâng. | có thểbuy , closebuy , sell , closesell . |
Mô tả:Đặt các loại lệnh mua hoặc bán, chỉ cho giao dịch tương lai.Quay lại:Không cóDemo:
function main(){
exchange.SetContractType("this_week");
exchange.SetMarginLevel(5) // Set the leverage to 5 times
exchange.SetDirection("buy") // Set the order type to buy long
exchange.Buy(5000, 2) //buy long at the price 1000, quantity of 2
exchange.SetDirection("closebuy")
exchange.Sell(4999, 2) //close long position
}
2.14 Chức năng thường được sử dụng khác:
Kiểm tra thêm chi tiết về các chức năng trên FMZTài liệu API
Tên | Mô tả | Ví dụ |
---|---|---|
LogStatus |
Đăng một tin nhắn hoặc bảng trên thanh trạng thái của bot, sẽ làm mới mỗi lần | LogStatus('msg') |
_C |
Chức năng thử lại | _C(exchange.GetRecords,PERIOD_H1) ,_C(exchange.GetTicker) |
_N |
Chức năng vị trí | _N(4001.512,2) ,_N(num,0) |
_G |
Từ điển toàn cầu có thể được lưu sau khi khởi động lại robot. | _G('initValue', 1000);_G('initValue') |
_D |
Trả lại dấu thời gian | _D() , _D(1478570053241) |
TA |
Thư viện chỉ số TA-Lib. hỗ trợMACD , EMA , KDJ vv... |
TA.MACD(records) |
Math |
Chứng minh chức năng toán học, kiểm trahttps://mathjs.org/ | Math.min(1,2) , Math.sqrt(2) |
Có rất nhiều chiến lược giảng dạy tronghttps://www.fmz.com/square/s:tag:Study/1, đơn giản và dễ dàng cho người mới bắt đầu.
Đây là một chiến lược đơn giản nhưng mạnh mẽ được sử dụng để kiếm được hàng trăm lần trên thị trường giao dịch BTC thực. Nó không thể chạy trên các sàn giao dịch có phí giao dịch cao.
var floatAmountBuy = 20
var floatAmountSell = 20
var diffPrice = 3
var Interval = 3000
function CancelPendingOrders() {
var orders = _C(exchange.GetOrders);
for (var j = 0; j < orders.length; j++) {
exchange.CancelOrder(orders[j].Id, orders[j])
}
}
function GetPrice(depth) {
var price = {buy:0, sell:0}
var askAmount = 0
var bidAmount = 0
for(var i=0; i<depth.Bids.length; i++){
askAmount += depth.Asks[i].Amount
bidAmount += depth.Bids[i].Amount
if(askAmount >= floatAmountBuy && !price.buy){
price.buy = depth.Asks[i].Price
}
if(bidAmount >= floatAmountSell && !price.sell){
price.sell = depth.Bids[i].Price
}
}
if(!price.buy || !price.sell){
price = {buy:depth.Asks[depth.Asks.length-1].Price, sell:depth.Bids[depth.Bids.length-1].Price}
}
return price
}
function onTick() {
var price = GetPrice(_C(exchange.GetDepth))
var buyPrice = price.buy + 0.01
var sellPrice = price.sell - 0.01
if ((sellPrice - buyPrice) <= diffPrice){
buyPrice -= 10
sellPrice += 10
}
CancelPendingOrders()
var account = _C(exchange.GetAccount)
var amountBuy = _N((account.Balance / buyPrice-0.01), 2)
var amountSell = _N((account.Stocks), 2)
if (amountSell > 0.02) {
exchange.Sell(sellPrice, amountSell)
}
if (amountBuy > 0.02) {
exchange.Buy(buyPrice, amountBuy)
}
}
function main() {
while (true) {
onTick()
Sleep(Interval)
}
}
Một chiến lược thoát hiểm cổ điển, kiểm trahttps://www.fmz.com/strategy/103247cho cấu hình. Bạn có thể học cách trao đổi các tính năng và vẽ biểu đồ từ mã nguồn.
var ChartCfg = {
__isStock: true,
title: {
text: 'Dual Thrust Up-Down Track'
},
yAxis: {
plotLines: [{value: 0,
color: 'red',
width: 2,
label: {
text: 'Up Track',
align: 'center'}
},
{value: 0,
color: 'green',
width: 2,
label: {
text: 'Down Track',
align: 'center'},
}
]
},
series: [{type: 'candlestick',
name: 'current cycle',
id: 'primary',
data: []
},
{type: 'flags',
onSeries: 'primary',
data: [],
}
]
};
var STATE_IDLE = 0;
var STATE_LONG = 1;
var STATE_SHORT = 2;
var State = STATE_IDLE;
var LastBarTime = 0;
var UpTrack = 0;
var BottomTrack = 0;
var chart = null;
var InitAccount = null;
var LastAccount = null;
var Counter = {
w: 0,
l: 0
};
function GetPosition(posType) {
var positions = exchange.GetPosition();
for (var i = 0; i < positions.length; i++) {
if (positions[i].Type === posType) {
return [positions[i].Price, positions[i].Amount];
}
}
return [0, 0];
}
function CancelPendingOrders() {
while (true) {
var orders = exchange.GetOrders();
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
Sleep(Interval);
}
if (orders.length === 0) {
break;
}
}
}
function Trade(currentState, nextState) {
var pfn = nextState === STATE_LONG ? exchange.Buy : exchange.Sell;
if (currentState !== STATE_IDLE) {
exchange.SetDirection(currentState === STATE_LONG ? "closebuy" : "closesell");
while (true) {
var amount = GetPosition(currentState === STATE_LONG ? PD_LONG : PD_SHORT)[1];
if (amount === 0) {
break;
}
// pfn(amount);
pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, amount);
Sleep(Interval);
CancelPendingOrders();
}
var account = exchange.GetAccount();
if (account.Stocks > LastAccount.Stocks) {
Counter.w++;
} else {
Counter.l++;
}
LogProfit(_N(account.Stocks - InitAccount.Stocks), "Profit rate:", _N((account.Stocks - InitAccount.Stocks) * 100 / InitAccount.Stocks) + '%');
LastAccount = account;
}
exchange.SetDirection(nextState === STATE_LONG ? "buy" : "sell");
while (true) {
var pos = GetPosition(nextState === STATE_LONG ? PD_LONG : PD_SHORT);
if (pos[1] >= AmountOP) {
Log("Average Price", pos[0], "amount:", pos[1]);
break;
}
// pfn(AmountOP-pos[1]);
pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, AmountOP-pos[1]);
Sleep(Interval);
CancelPendingOrders();
}
}
function onTick(exchange) {
var records = exchange.GetRecords();
if (!records || records.length <= NPeriod) {
return;
}
var Bar = records[records.length - 1];
if (LastBarTime !== Bar.Time) {
var HH = TA.Highest(records, NPeriod, 'High');
var HC = TA.Highest(records, NPeriod, 'Close');
var LL = TA.Lowest(records, NPeriod, 'Low');
var LC = TA.Lowest(records, NPeriod, 'Close');
var Range = Math.max(HH - LC, HC - LL);
UpTrack = _N(Bar.Open + (Ks * Range));
DownTrack = _N(Bar.Open - (Kx * Range));
if (LastBarTime > 0) {
var PreBar = records[records.length - 2];
chart.add(0, [PreBar.Time, PreBar.Open, PreBar.High, PreBar.Low, PreBar.Close], -1);
} else {
for (var i = Math.min(records.length, NPeriod * 3); i > 1; i--) {
var b = records[records.length - i];
chart.add(0, [b.Time, b.Open, b.High, b.Low, b.Close]);
}
}
chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close]);
ChartCfg.yAxis.plotLines[0].value = UpTrack;
ChartCfg.yAxis.plotLines[1].value = DownTrack;
ChartCfg.subtitle = {
text: 'Up Track: ' + UpTrack + ' Down Track: ' + DownTrack
};
chart.update(ChartCfg);
chart.reset(PeriodShow);
LastBarTime = Bar.Time;
} else {
chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close], -1);
}
LogStatus("Price:", Bar.Close, "Up:", UpTrack, "Down:", DownTrack, "Wins: ", Counter.w, "Losses:", Counter.l, "Date:", new Date());
var msg;
if (State === STATE_IDLE || State === STATE_SHORT) {
if (Bar.Close >= UpTrack) {
msg = 'Long Price: ' + Bar.Close + ' Up Track:' + UpTrack;
Log(msg);
Trade(State, STATE_LONG);
State = STATE_LONG;
chart.add(1, {x:Bar.Time, color: 'red', shape: 'flag', title: 'Long', text: msg});
}
}
if (State === STATE_IDLE || State === STATE_LONG) {
if (Bar.Close <= DownTrack) {
msg = 'Short Price: ' + Bar.Close + ' Down Track:' + DownTrack;
Log(msg);
Trade(State, STATE_SHORT);
chart.add(1, {x:Bar.Time, color: 'green', shape: 'circlepin', title: 'Short', text: msg});
State = STATE_SHORT;
}
}
}
function onexit() {
var pos = exchange.GetPosition();
if (pos.length > 0) {
Log("Warning, has positions when exiting", pos);
}
}
function main() {
if (exchange.GetName() !== 'Futures_OKCoin') {
throw "Only support OKEX features";
}
exchange.SetRate(1);
exchange.SetContractType(["this_week", "next_week", "quarter"][ContractTypeIdx]);
exchange.SetMarginLevel([10, 20][MarginLevelIdx]);
if (exchange.GetPosition().length > 0) {
throw "Can't have Positions when start.";}
CancelPendingOrders();
InitAccount = LastAccount = exchange.GetAccount();
LoopInterval = Math.min(1, LoopInterval);
Log('Exchange Name:', exchange.GetName(), InitAccount);
LogStatus("Ready...");
LogProfitReset();
chart = Chart(ChartCfg);
chart.reset();
LoopInterval = Math.max(LoopInterval, 1);
while (true) {
onTick(exchange);
Sleep(LoopInterval * 1000);
}
}
Cỏ nhỏHãy tiếp tục cập nhật bài viết này, hãy tự do hỏi bất kỳ câu hỏi nào