[TOC]
Ini adalah instruksi dasar untuk pemula, untuk versi lengkap dari dokumentasi API kami, periksa diFMZ APIAda banyak spesifikasi yang jelas yang tidak dibahas dalam tutorial ini yang tersisa untuk Anda temukan.
Setelah mempelajari seluruh tutorial, Anda akan tahu bagaimana FMZ bekerja dan dapat menulis beberapa strategi dasar.
Apa itu platform FMZ?
FMZ adalah platform perdagangan otomatis untuk pedagang cryptocurrency dengan dukungan untuk banyak pasar pertukaran bitcoin / et / altcoin.
Apa yang bisa FMZ lakukan untuk Anda?
Anda dapat belajar bagaimana menulis bot Anda (strategi) dari strategi kami (square) yang berisi banyak kode sumber terbuka, berbagi kode strategi Anda dengan orang lain, meminta bantuan profesional kapan saja, menjalankan strategi Anda di banyak bursa, mengontrol bot Anda di situs web dengan komputer atau ponsel, menjual strategi Anda jika Anda mau, berkomunikasi dengan banyak pecinta perdagangan otomatis lainnya di situs kamikelompokSingkatnya, FMZ adalah platform yang sempurna bagi mereka yang ingin melakukan perdagangan otomatis.
Bursa Cryptocurrency mana yang didukung FMZ?
FMZ mendukung hampir semua bursa yang populer, sepertiBinance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, dll Anda juga dapat berdagang berjangka padaOKEX
danBitMEX
Periksa daftar dukungan penuh diAPIAnda hanya perlu menulis satu strategi dan menjalankannya di semua bursa tanpa perubahan.
Bahasa pemrograman apa yang didukung FMZ?
FMZ mendukung JavaScript, Python, C++ (JavaScript dan Python dianjurkan) untuk mengkode strategi Anda.
Apakah API KEY Anda aman?
Benar. API-KEY Anda disimpan setelah dienkripsi. Begini caranya.
https
.Daftar fitur saat ini:
Untuk menjalankan bot, Anda perlu memiliki strategi, menambahkan pertukaran, menyebarkan docker pertama. docker adalah pelaksana strategi Anda yang berjalan di komputer atau server Anda sendiri.
Lihat halaman utama
Tambahkan pertukaran
Tambahkan padahttps://www.fmz.com/m/add-platform, atau klikPlatform
label.
Kunci akses dan kunci rahasia Anda dapat diterapkan di bursa cryptocurrency. API-KEY digunakan untuk berdagang dan mendapatkan informasi pribadi dari bursa. Kami tidak menyimpan API-KEY atau kata sandi di server kami.
Anda dapat mendaftar di FMZ
menggunakan docker
FMZ tidak menjalankan bot untuk Anda, Anda perlu menyebarkan docker sendiri sebagai pelaksana, yang lebih fleksibel dan aman karena layanan kami tidak berpartisipasi dalam menjalankan bot Anda.
Untuk windows, cukup mudah, ikuti instruksi padahttps://www.fmz.com/m/add-node
Untuk Linux, Anda dapat menyewa VPS di situs web kami, yang akan menyebarkan docker secara otomatis. Berikut adalah langkah-langkah untuk menyebarkan pada server Linux Anda sendiri (disarankan):
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
, perintah tidak ditemukan? install duluyum 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 berarti semuanya sudah selesai.node.fmz.com/xxxxx
unik untuk setiap pengguna, menemukan Anda sendiri padahttps://www.fmz.com/m/add-node.ctrl + C
untuk menghentikan docker.nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
untuk berjalan di latar belakang. langkah ini juga dapat dilakukan denganScreen
command.Tulis strategi
Anda harus menulis strategi Anda sendiri atau membeli dari kotak. Di sini kita akan menggunakan strategi JavaScript sederhana sebagai demo untuk menunjukkan bagaimana menggunakan halaman edit. Strategi dapat disalin darihttps://www.fmz.com/strategy/125482Aku tidak tahu. Tutorial ini tidak akan membahas cara menggunakan JavaScript karena Anda dapat menemukan banyak tutorial online.
Ctrl+S
pada mode edit.Untuk mengirim pesan ke ponsel Anda, Anda perlu mengikat telegram ke akun 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, saatnya untuk menjalankan bot.
PadaRobot
halaman, klikAdd robot
, atau mengunjungihttps://www.fmz.com/m/add-robotlangsung untuk menambahkan bot.
exchanges[0]
, exchanges[1]
Mengelola bot
PadaRobot
halaman, Anda dapat melihat bot berjalan.
LogProfit()
, bisa menjadi nomor yang Anda inginkan.Klik nama bot ke halaman bot untuk informasi lebih lanjut:
Bagian ini akan memperkenalkan beberapa API yang paling umum digunakan, untuk versi lengkap dari dokumentasi API kami, periksa padaFMZ APIAku tidak tahu. Sangat disarankan bagi pemula untuk menjalankan kode demo padaHalaman Debug.
2.1 Log
Gunakan: Log(msg)
Parameter:string atau angkaDeskripsi:Log pesan ke halaman log robot.Kembali:Tidak adaDemo:
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:Tidak adaDeskripsi:Dapatkan ticker pasar saat ini.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 Dapatkan kedalaman
Gunakan: exchange.GetDepth()
Parameter:Tidak adaDeskripsi:Dapatkan buku pesanan pasar saat ini.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 | Kewajiban | Deskripsi |
---|---|---|---|
Periode | global varble | Tidak. | Siklus Kline |
Semua parameter yang mungkin:PERIOD_M1
1 menit,PERIOD_M5
5 menit,PERIOD_M15
15 menit,PERIOD_M30
30 menit,PERIOD_H1
1:1h,PERIOD_D1
1d.Deskripsi:Dapatkan Kline / candlestick bar untuk pasar saat ini.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 DapatkanAkun
Gunakan: exchange.GetAccount()
Parameter:Tidak adaDeskripsi:Dapatkan informasi akunKembali:
{
"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 | Kewajiban | Deskripsi |
---|---|---|---|
Harga | Nomor | Ya, aku tahu. | Harga pembelian pesanan batas |
Jumlah | Nomor | Ya, aku tahu. | Jumlah pesanan batas beli |
Msg | String | Tidak. | Tambahkan pesan tambahan di halaman Log |
Deskripsi:Kirim pesanan pembelian dan log pembelian di halaman botKembali:mengembalikan OrderID jika berhasil,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 | Kewajiban | Deskripsi |
---|---|---|---|
Harga | Nomor | Ya, aku tahu. | Harga jual order batas |
Jumlah | Nomor | Ya, aku tahu. | menjual jumlah limit order |
Msg | String | Tidak. | Tambahkan pesan tambahan di halaman Log |
Deskripsi:Kirim pesanan jual dan log jual ke halaman botKembali:mengembalikan OrderID jika berhasil,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 | Kewajiban | Deskripsi |
---|---|---|---|
Perintah | Nomor | Ya, aku tahu. | ID pesanan |
Deskripsi:Dapatkan rincian 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:Tidak adaDeskripsi:Dapatkan semua pesanan terbuka untuk simbol perdagangan Anda.Kembali:Daftar pesanan terbuka, hasilnya memiliki arti 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 BatalkanPesenan
Gunakan: exchange.CancelOrder(OrderId)
Parameter:
Nama | Jenis | Kewajiban | Deskripsi |
---|---|---|---|
Perintah | Nomor | Ya, aku tahu. | ID pesanan |
Deskripsi:Batalkan pesanan dengan order id.Kembali:jenis bool,true
berarti bahwa pembatalan permintaan pesanan berhasil.false
berarti pembatalan permintaan pesanan gagal.
2.11 SetContractType
Gunakan: exchange.SetContractType(ContractType)
Parameter:
Nama | Jenis | Kewajiban | Deskripsi |
---|---|---|---|
Jenis Kontrak | String | Ya, aku tahu. | Jenis Kontrak |
Deskripsi:Tentukan jenis kontrak untuk perdagangan berjangka. harus ditetapkan terlebih dahulu sebelum menggunakan API pribadi lainnya.Kembali:Tidak adaDemo:
exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc
2.12 Dapatkan Posisi
Gunakan: exchange.GetPosition()
Parameter:Tidak adaDeskripsi:Dapatkan informasi posisi saat ini, hanya untuk perdagangan futures.Kembali:A Daftar Posisi, akan mengembalikan daftar kosong jika akun tidak memiliki posisi.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 | Kewajiban | Deskripsi |
---|---|---|---|
Arah | String | Ya, aku tahu. | bisabuy , closebuy , sell , closesell . |
Deskripsi:Menetapkan Jenis Pesan Beli atau Jual, hanya untuk perdagangan Futures.Kembali:Tidak adaDemo:
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 umum lainnya:
Periksa lebih lanjut tentang fungsi-fungsi di FMZDokumen API
Nama | Deskripsi | Contoh |
---|---|---|
LogStatus |
Log pesan atau tabel di bilah status bot, akan menyegarkan setiap kali | LogStatus('msg') |
_C |
Fungsi coba lagi | _C(exchange.GetRecords,PERIOD_H1) ,_C(exchange.GetTicker) |
_N |
Fungsi posisi | _N(4001.512,2) ,_N(num,0) |
_G |
Kamus global yang bisa disimpan setelah memulai kembali robot. | _G('initValue', 1000);_G('initValue') |
_D |
Mengembalikan timestamp | _D() , _D(1478570053241) |
TA |
Perpustakaan Indikator TA-Lib.MACD , EMA , KDJ Dan sebagainya... |
TA.MACD(records) |
Math |
Dukung fungsi matematika, periksa.https://mathjs.org/ | Math.min(1,2) , Math.sqrt(2) |
Ada banyak strategi pengajaran dihttps://www.fmz.com/square/s:tag:Study/1, yang sederhana dan mudah untuk pemula.
Ini adalah strategi sederhana namun ampuh yang digunakan untuk menghasilkan ratusan kali di pasar spot BTC nyata.
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)
}
}
Sebuah strategi melarikan diri klasik, Periksa padahttps://www.fmz.com/strategy/103247untuk konfigurasi. Anda dapat belajar cara berdagang fitur dan menggambar grafik dari kode 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);
}
}
RumputTetap update di posting ini, jangan ragu untuk mengajukan pertanyaan