Tutorial pemula FMZ

Penulis:Rumput, Dibuat: 2019-04-09 11:29:07, Diperbarui: 2024-02-06 17:35:38

[TOC]

img

1.Mulai dengan platform FMZ

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.

1.1 Tentang platform FMZ

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 padaOKEXdanBitMEXPeriksa 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.

  • Anda perlu memasukkan kata sandi FMZ Saat menambahkan kunci. Web-browser akan mengenkripsi kunci API Anda dan lulus kunci terenkripsi ke server FMZ menggunakanhttps.
  • Anda perlu memasukkan kata sandi FMZ ketika Anda menjalankan docker di server atau komputer Anda.
  • FMZ akan mengirim kunci terenkripsi ke docker Anda menggunakan https ketika Anda memulai bot. Docker akan mendekripsi untuk mendapatkan kunci.
  • FMZ tidak menyimpan kata sandi Anda (hanya kata sandi Hash). jadi bahkan kita tidak tahu kunci API Anda.
  • Anda perlu melindungi kata sandi dan server docker Anda sendiri.

Daftar fitur saat ini:

  • 1.Platform lintas, mendukung semua pertukaran cryptocurrency utama lebih akan segera
  • 2.Dukungan untuk pertukaran simulasi. https://wex.app/
  • 3.Memiliki sistem backtesting simulasi yang efektif.
  • 4.Dukungan untuk mengirim e-mail, mendorong pesan ke akun telegram Anda.
  • 5.Kontrol berbasis web yang dapat diakses melalui ponsel Anda.
  • 6. Mendukung pemrograman Python\C++\JavaScript.
  • 7.Biayanya sangat rendah. 0,125 RMB per jam, sekitar 0,018 dolar.
  • 8.NoFMZ telah berjalan selama lebih dari empat tahun tanpa masalah keamanan.

1.2 Awal yang cepat untuk menggunakan platform FMZ

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

img

  • 1.Halaman kontrol utama Anda
  • 2. Mengelola semua bot Anda (memulai, berhenti, menghapus, buka, dll)
  • 3.Mengelola semua strategi Anda kode
  • 4.Diperbarui dan atur docker Anda
  • 5.Tambahkan pertukaran baru
  • 6.Perdagangan manual di bursa yang Anda tambahkan
  • 7. Bayar tagihan Anda
  • 8.Tanyakan pertanyaan di sini
  • 9. FMZs simulasi pertukaran
  • 10.Debug alat di mana Anda dapat menjalankan blok kode tanpa memulai bot.
  • 11.Semua jenis pesan
  • 12.Kuar strategi di mana strategi sumber terbuka dan pengisian terdaftar
  • 13.Live Robots di mana semua bot yang berjalan secara langsung terdaftar.
  • 14.Forum di mana Anda dapat memposting posting untuk mendiskusikan pertanyaan terkait.
  • 15.Minta seseorang untuk menulis kode untuk Anda atau menyediakan layanan ini untuk orang lain.
  • 16.Produk untuk pertukaran dan agensi.
  • 17.Dokumentasi API.
  • 18.Beberapa alat yang berguna, periksa sendiri.
  • 19.Informasi akun Anda.

Tambahkan pertukaran

Tambahkan padahttps://www.fmz.com/m/add-platform, atau klikPlatformlabel. 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 Simulasi pertukarandan tambahkan untuk pengujian.

img

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

img

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):

  • 1.Beli server cloud (VPS) dari Amazon atau Google, konfigurasi terendah dan termurah sudah cukup. Anda sering dapat mencoba gratis untuk waktu yang lama.
  • 2.Login ke server Anda, ikuti instruksi dari penyedia server Anda atau cari di Google.
  • 3.Pilih docker yang sesuai dengan versi sistem Anda, sebagian besar waktu, itu 64Bit.
  • 4. Untuk centos, lariwget www.fmz.com/dist/robot_linux_amd64.tar.gz, perintah tidak ditemukan? install duluyum install wget -y.
  • 5.Run tar -xzvf robot_linux_amd64.tar.gzuntuk membuka zip.
  • 6.Run ./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/xxxxxunik untuk setiap pengguna, menemukan Anda sendiri padahttps://www.fmz.com/m/add-node.
  • Sekarang docker tidak berjalan di latar belakang, jika Anda menutup klien SHH, docker akan berhenti. Tekanctrl + Cuntuk menghentikan docker.
  • 8.Run nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &untuk berjalan di latar belakang. langkah ini juga dapat dilakukan denganScreen command.
  • 9.Periksahttps://www.fmz.com/m/nodes, jika semuanya baik-baik saja, Anda dapat menemukan docker dikerahkan di sana.

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.

img

  • 1. Mengedit kode Anda
  • 2.Backtesting, kita akan membahas bagian ini pada tutorial menengah
  • 3. Programer bahasa kode Anda, JavaScript digunakan dalam demo ini
  • 4.Judulnya, dibagi menjadi judul bahasa Cina dan bahasa Inggris, yang akan ditampilkan ditentukan oleh bahasa situs web FMZ.
  • 5.Jenis strategi Anda, default adalah umum
  • 6.Kategori strategi Anda. Anda dapat membagi strategi Anda ke dalam kategori yang berbeda jika Anda memiliki terlalu banyak
  • 7.Remote editing kode Anda dari IDE Anda sendiri daripada situs web kami
  • 8.Tautan ke dokumen API
  • 9.Catatan strategi (hanya dapat dilihat oleh diri sendiri). Anda dapat merekam pikiran di sini.
  • 10.Deskripsi strategi. Orang lain akan melihat deskripsi jika Anda membagikan atau menjual strategi Anda di Square.
  • 11.Manual strategi, hanya dapat dilihat ketika seseorang membeli strategi Anda.
  • 12.Simpan kode Anda, atauCtrl+Spada mode edit.
  • 13.Simpan konfigurasi backtesting pada kode.
  • 14.Downloadfile strategi
  • 15.Ekspor dan impor strategi sambil menjaga semua parameter
  • 16.Ubah ukuran font dan edit tema
  • 17.Format kode secara otomatis
  • 18. Gunakan mode VIM untuk mengedit.

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. PadaRobothalaman, klikAdd robot, atau mengunjungihttps://www.fmz.com/m/add-robotlangsung untuk menambahkan bot.img

  • 1.nama bot
  • 2. Docker untuk menjalankan bot ini
  • 3.Strategi untuk dijalankan
  • 4.Parameter, nilai default dapat diubah.
  • 5.Default Kline periode ketika menggunakan pertukaran.GetRecords()
  • 6.Exchange
  • 7.Tradingsimbol atau pasangan
  • 8.Jika simbol perdagangan yang Anda butuhkan tidak ada dalam daftar, Anda bisa mengetiknya sendiri.
  • 9.Clickuntuk menambahkan pertukaran
  • 10.Bursa yang sudah ditambahkan.Berbagai pertukaran dapat ditambahkan pada satu bot, akses olehexchanges[0], exchanges[1]
  • 11.Clickuntuk menjalankan bot!

Mengelola bot

PadaRobothalaman, Anda dapat melihat bot berjalan.img

  • 1. Nama bot, klik di sini untuk halaman bot.
  • 2.Strategi yang dijalankan oleh bot, klik di sini untuk halaman strategi.
  • 3.Status bot. bisa berjalan, berhenti, kesalahan.
  • 4.Bot's profit, diloloskan olehLogProfit(), bisa menjadi nomor yang Anda inginkan.
  • 5.Tanggal yang dibuat, dapat diubah ke waktu komunikasi terakhir.
  • 6.Mantau bot. FMZ akan mengirimkan pesan ketika bot dihentikan secara tidak sengaja
  • 7. Hentikan robot.

Klik nama bot ke halaman bot untuk informasi lebih lanjut:img

2.Pengantar API yang paling umum digunakan

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 Klines, Opsional Parameter, default K siklus garis diatur ketika memulai robot.

Semua parameter yang mungkin:PERIOD_M11 menit,PERIOD_M55 menit,PERIOD_M1515 menit,PERIOD_M3030 menit,PERIOD_H11:1h,PERIOD_D11d.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,nullJika 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,nullJika 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,trueberarti bahwa pembatalan permintaan pesanan berhasil.falseberarti 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, KDJDan sebagainya... TA.MACD(records)
Math Dukung fungsi matematika, periksa.https://mathjs.org/ Math.min(1,2), Math.sqrt(2)

3.Dua strategi nyata yang lengkap

Ada banyak strategi pengajaran dihttps://www.fmz.com/square/s:tag:Study/1, yang sederhana dan mudah untuk pemula.

3.1 Strategi spot market maker frekuensi tinggi

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)
    }
}

Fitur OKEX Dual Thrust

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);
    }
}


Lebih banyak

RumputTetap update di posting ini, jangan ragu untuk mengajukan pertanyaan