[TOC]
Ini adalah arahan asas untuk pemula, untuk versi penuh dokumentasi API kami, lihat padaFMZ APITerdapat banyak spesifikasi yang jelas yang tidak dilindungi dalam tutorial ini untuk anda dapati.
Selepas mempelajari keseluruhan tutorial, anda akan tahu bagaimana FMZ berfungsi dan dapat menulis beberapa strategi asas.
Apakah platform FMZ?
FMZ adalah platform perdagangan automatik untuk peniaga cryptocurrency dengan sokongan untuk banyak pasaran pertukaran bitcoin / et / altcoin.
Apa yang FMZ boleh lakukan untuk anda?
Anda boleh belajar bagaimana untuk menulis bot anda ((strategies) dari strategi kami
Bursa Cryptocurrency mana yang disokong oleh FMZ?
FMZ menyokong hampir semua pertukaran yang popular, sepertiBinance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, dan lain-lain anda juga boleh berdagang niaga hadapan padaOKEX
danBitMEX
Lihat senarai sokongan penuh diAPIAnda hanya perlu menulis satu strategi dan menjalankannya di semua pertukaran tanpa sebarang perubahan.
Bahasa pengaturcaraan apa yang disokong FMZ?
FMZ menyokong JavaScript, Python, C ++ (JavaScript dan Python disyorkan) untuk pengekodan strategi anda.
Adakah API KEY anda selamat?
Memang, kunci API anda disimpan selepas penyulitan.
https
.Senarai ciri semasa:
Untuk menjalankan bot, anda perlu mempunyai strategi, menambah pertukaran, menggunakan docker pertama. docker adalah pelaksana strategi anda yang berjalan di komputer atau pelayan anda sendiri.
Lihat halaman utama
Tambah pertukaran
Tambah padahttps://www.fmz.com/m/add-platform, atau klikPlatform
label.
Kunci akses dan kunci rahsia anda boleh digunakan di bursa mata wang kripto. API-KEY digunakan untuk berdagang dan mendapatkan maklumat peribadi dari bursa. Kami tidak menyimpan sebarang API-KEY atau kata laluan di pelayan kami.
Anda boleh mendaftar di FMZ
menggunakan pelabuhan
FMZ tidak menjalankan bot untuk anda, anda perlu menggunakan docker sendiri sebagai pelaksana, yang lebih fleksibel dan selamat kerana perkhidmatan kami tidak mengambil bahagian dalam menjalankan bot anda.
Untuk tingkap, ia cukup mudah, hanya ikuti arahan dihttps://www.fmz.com/m/add-node
Untuk Linux, anda boleh menyewa VPS di laman web kami, yang akan menyebarkan docker secara automatik.
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
, perintah tidak dijumpai? memasang terlebih dahuluyum install wget -y
.tar -xzvf robot_linux_amd64.tar.gz
untuk membuka zip../robot -s node.fmz.com/xxxxx -p -p yourFMZpassword
, anda harus melihat sesuatu seperti2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomain
, yang bermaksud segala-galanya diuruskan.node.fmz.com/xxxxx
adalah unik untuk setiap pengguna, mencari anda sendiri padahttps://www.fmz.com/m/add-node.ctrl + C
untuk menghentikan pelabuhan.nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
untuk berjalan di latar belakang. langkah ini juga boleh dilakukan olehScreen
command.Tulis strategi
Anda harus menulis strategi anda sendiri atau membeli dari kotak. Di sini kita akan menggunakan strategi JavaScript mudah sebagai demo untuk menunjukkan bagaimana untuk menggunakan halaman edit. Strategi boleh disalin darihttps://www.fmz.com/strategy/125482. Tutorial ini tidak akan merangkumi cara menggunakan JavaScript kerana anda boleh mencari banyak tutorial dalam talian.
Ctrl+S
pada mod penyuntingan.Untuk menghantar mesej ke telefon anda, anda perlu mengikat telegram ke akaun anda dihttps://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
}
}
Jalankan bot
Akhirnya, sudah tiba masanya untuk menjalankan bot.
PadaRobot
halaman, klikAdd robot
, atau melawathttps://www.fmz.com/m/add-robotlangsung untuk menambah bot.
exchanges[0]
, exchanges[1]
Mengurus bot
PadaRobot
halaman, anda boleh melihat bot berjalan.
LogProfit()
, boleh menjadi mana-mana nombor yang anda mahu.Klik nama bot ke halaman bot untuk maklumat lanjut:
Bahagian ini akan memperkenalkan beberapa API yang paling biasa digunakan, untuk versi penuh dokumentasi API kami, periksa padaFMZ API. Ia sangat disyorkan untuk pemula untuk menjalankan kod demo padaHalaman Debug.
2.1 Log
Gunakan: Log(msg)
Parameter:senar atau nomborPenerangan:Log mesej ke halaman log robot.Kembali:TiadaDemo:
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
Gunakan: exchange.GetTicker()
Parameter:TiadaPenerangan:Dapatkan pasaran semasa.Kembali:
{"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 DapatkanLebaran
Gunakan: exchange.GetDepth()
Parameter:TiadaPenerangan:Dapatkan buku pesanan pasaran semasa.Kembali:
{
"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
Gunakan: exchange.GetRecords()
, exchange.GetRecords(Period)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Tempoh | global varble | Tidak. | Kitaran Kline |
Semua parameter yang mungkin:PERIOD_M1
1 minit,PERIOD_M5
5 minit,PERIOD_M15
15 minit,PERIOD_M30
30 minit,PERIOD_H1
1h,PERIOD_D1
1d.Penerangan:Dapatkan bar Kline / candlestick untuk pasaran semasa.Kembali:
[
{"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 DapatkanAkaun
Gunakan: exchange.GetAccount()
Parameter:TiadaPenerangan:Dapatkan maklumat akaunKembali:
{
"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 Beli
Gunakan: exchange.Buy(Price, Amount)
, exchange.Buy(Price, Amount, Msg)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Harga | Nombor | Ya. | Harga pembelian perintah had |
Jumlah | Nombor | Ya. | Beli jumlah perintah had |
Msg | String | Tidak. | Tambah mesej tambahan pada halaman Log |
Penerangan:Hantar pesanan beli dan log beli di halaman botKembali:mengembalikan OrderID jika berjaya,null
Jika tidak.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 Jual
Gunakan: exchange.Sell(Price, Amount)
, exchange.Sell(Price, Amount, Msg)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Harga | Nombor | Ya. | Harga jual perintah had |
Jumlah | Nombor | Ya. | menjual jumlah perintah had |
Msg | String | Tidak. | Tambah mesej tambahan pada halaman Log |
Penerangan:Hantar pesanan jual dan log jual di halaman botKembali:mengembalikan OrderID jika berjaya,null
Jika tidak.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
Gunakan: exchange.GetOrder(OrderId)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Perintah | Nombor | Ya. | Nombor pesanan |
Penerangan:Dapatkan butiran pesanan dengan ID pesanan.Kembali:
{
"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
Gunakan: exchange.GetOrders()
Parameter:TiadaPenerangan:Dapatkan semua pesanan terbuka untuk simbol dagangan anda.Kembali:Senarai pesanan terbuka, hasilnya mempunyai makna yang sama denganGetOrder()
[
{
"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 Batalkan Perintah
Gunakan: exchange.CancelOrder(OrderId)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Perintah | Nombor | Ya. | Nombor pesanan |
Penerangan:Batalkan pesanan dengan ID pesanan.Kembali:jenis bool,true
bermakna pembatalan permintaan pesanan berjaya.false
bermaksud pembatalan permintaan pesanan gagal.
2.11 SetContractType
Gunakan: exchange.SetContractType(ContractType)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Jenis Kontrak | String | Ya. | Jenis Kontrak |
Penerangan:Tetapkan jenis kontrak untuk perdagangan niaga hadapan. mesti ditetapkan terlebih dahulu sebelum menggunakan API peribadi lain.Kembali:TiadaDemo:
exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc
2.12 DapatkanPosisi
Gunakan: exchange.GetPosition()
Parameter:TiadaPenerangan:Dapatkan maklumat kedudukan semasa, hanya untuk perdagangan niaga hadapan.Kembali:Senarai Posisi, akan mengembalikan senarai kosong jika akaun tidak mempunyai kedudukan.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
Gunakan: exchange.SetDirection(Direction)
Parameter:
Nama | Jenis | Pelanggaran | Penerangan |
---|---|---|---|
Arah | String | Ya. | bolehbuy , closebuy , sell , closesell . |
Penerangan:Tetapkan Jenis Perintah Beli atau Jual, hanya untuk perdagangan Futures.Kembali:TiadaDemo:
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 Fungsi lain yang biasa digunakan:
Semak lebih lanjut mengenai fungsi-fungsi tersebut di FMZDokumen API
Nama | Penerangan | Contoh |
---|---|---|
LogStatus |
Log mesej atau jadual pada bar status bot,akan menyegarkan setiap kali | LogStatus('msg') |
_C |
Fungsi cubaan semula | _C(exchange.GetRecords,PERIOD_H1) ,_C(exchange.GetTicker) |
_N |
Fungsi kedudukan | _N(4001.512,2) ,_N(num,0) |
_G |
Kamus global yang boleh disimpan selepas memulakan semula robot. | _G('initValue', 1000);_G('initValue') |
_D |
Mengembalikan stempel masa | _D() , _D(1478570053241) |
TA |
Perpustakaan Indikator TA-Lib. sokonganMACD , EMA , KDJ dan sebagainya... |
TA.MACD(records) |
Math |
Sokong fungsi matematik, periksa.https://mathjs.org/ | Math.min(1,2) , Math.sqrt(2) |
Terdapat banyak strategi pengajaran dalamhttps://www.fmz.com/square/s:tag:Study/1, yang mudah dan mudah untuk pemula.
Ini adalah strategi yang mudah tetapi kuat yang digunakan untuk memperoleh beratus kali dalam pasaran spot BTC sebenar.
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)
}
}
Strategi pelarian klasik, periksa.https://www.fmz.com/strategy/103247untuk konfigurasi. Anda boleh belajar bagaimana untuk berdagang ciri dan membuat carta dari kod sumber.
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);
}
}
Rumputteruskan mengemas kini pada jawatan ini, berasa bebas untuk bertanya apa-apa soalan