Tutorial pemula FMZ

Penulis:Rumput, Dicipta: 2019-04-09 11:29:07, Dikemas kini: 2024-02-06 17:35:38

[TOC]

img

1.Memulakan dengan platform FMZ

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.

1.1 Mengenai platform FMZ

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 persegi yang mengandungi banyak kod sumber terbuka, berkongsi kod strategi andas dengan orang lain, meminta bantuan profesional pada bila-bila masa, menjalankan strategi anda di banyak bursa, mengawal bot anda di laman web dengan komputer atau telefon bimbit, menjual strategi anda jika anda mahu, berkomunikasi dengan banyak peminat perdagangan automatik lain di kamikumpulan. Dalam satu perkataan, FMZ adalah platform yang sempurna bagi mereka yang ingin melakukan perdagangan automatik.

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

  • Anda perlu memasukkan kata laluan FMZ Apabila menambah kunci. pelayar web akan menyulitkan kunci API anda dan lulus kunci yang disulitkan kepada pelayan FMZ menggunakanhttps.
  • Anda perlu memasukkan kata laluan FMZ apabila anda menjalankan docker pada pelayan atau komputer anda.
  • FMZ akan menghantar kunci yang disulitkan ke docker anda menggunakan https apabila anda memulakan bot. Docker akan mendekrip untuk mendapatkan kunci.
  • FMZ tidak menyimpan kata laluan anda (hanya kata laluan Hash). jadi walaupun kita tidak tahu kunci API anda.
  • Anda perlu melindungi kata laluan dan pelayan docker anda sendiri.

Senarai ciri semasa:

  • 1.Platform silang, menyokong semua bursa mata wang kripto utama
  • 2.Support untuk pertukaran simulasi. https://wex.app/
  • 3.Mempunyai sistem pengujian backtesting simulasi yang berkesan.
  • 4.Support untuk menghantar e-mel, mendorong mesej ke akaun telegram anda.
  • 5.Pengendalian berasaskan web yang boleh diakses melalui telefon anda.
  • 6.Menyokong pengaturcaraan Python\C++\JavaScript.
  • 7. Kosnya sangat rendah. 0.125 RMB sejam, kira-kira 0.018 dolar.
  • 8.NoFMZ telah berjalan selama lebih dari empat tahun tanpa sebarang masalah keselamatan.

1.2 Permulaan yang cepat untuk menggunakan platform FMZ

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

img

  • 1.Halaman kawalan utama anda
  • 2.Kawal semua bot anda (memulakan, berhenti, memadam, buka, dll)
  • 3.Luruskan semua strategi anda kod
  • 4.Penghantaran dan menguruskan pelabuhan anda
  • 5.Tambah pertukaran baru
  • 6.Perdagangan manual di bursa yang anda tambahkan
  • 7. Bayar bil anda
  • 8.Tanya sebarang soalan di sini
  • 9. FMZs pertukaran simulasi
  • 10.Debug alat di mana anda boleh menjalankan blok kod tanpa memulakan bot.
  • 11.Semua jenis mesej
  • 12.Kuar strategi di mana strategi sumber terbuka dan pengecasan disenaraikan
  • 13.Live Robot di mana semua bot yang berjalan secara langsung disenaraikan.
  • 14.Forum di mana anda boleh menyiarkan catatan untuk membincangkan sebarang soalan yang berkaitan.
  • 15.Minta seseorang untuk menulis kod untuk anda atau menyediakan perkhidmatan ini untuk orang lain.
  • 16.Produk untuk pertukaran dan agensi.
  • 17.Dokumen API.
  • 18.Beberapa alat yang berguna, periksa sendiri.
  • 19.Maklumat akaun anda.

Tambah pertukaran

Tambah padahttps://www.fmz.com/m/add-platform, atau klikPlatformlabel. 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 FMZPertukaran simulasidan tambahkan untuk ujian.

img

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

img

Untuk Linux, anda boleh menyewa VPS di laman web kami, yang akan menyebarkan docker secara automatik.

  • 1.Beli pelayan awan (VPS) dari Amazon atau Google, konfigurasi terendah dan termurah sudah cukup. anda sering mempunyai percubaan percuma untuk masa yang lama.
  • 2.Masuk ke pelayan anda, ikuti arahan dari penyedia pelayan anda atau Google ia.
  • 3.Pilih docker yang sesuai dengan versi sistem anda, kebanyakan masa, ia adalah 64Bit.
  • 4. Untuk sen, lariwget www.fmz.com/dist/robot_linux_amd64.tar.gz, perintah tidak dijumpai? memasang terlebih dahuluyum 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 bermaksud segala-galanya diuruskan.node.fmz.com/xxxxxadalah unik untuk setiap pengguna, mencari anda sendiri padahttps://www.fmz.com/m/add-node.
  • 7.Sekarang docker tidak dijalankan di latar belakang, jika anda menutup pelanggan SHH, docker akan berhenti. Tekanctrl + Cuntuk menghentikan pelabuhan.
  • 8.Run nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &untuk berjalan di latar belakang. langkah ini juga boleh dilakukan olehScreen command.
  • 9.Periksahttps://www.fmz.com/m/nodes, jika semuanya baik-baik saja, anda boleh mencari docker digunakan di sana.

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.

img

  • 1.Edit kod anda
  • 2.Backtesting, kita akan merangkumi bahagian ini pada tutorial pertengahan
  • 3. Bahasa pengaturcara kod anda, JavaScript digunakan dalam demo ini
  • 4.Judul, membahagikan tajuk Cina dan Bahasa Inggeris yang akan ditunjukkan ditentukan oleh bahasa laman web FMZ
  • 5.Jenis strategi anda, lalai adalah biasa
  • 6.Kategori strategi anda.Anda boleh membahagikan strategi anda ke dalam kategori yang berbeza jika anda mempunyai terlalu banyak
  • 7.Remote mengedit kod anda dari IDE anda sendiri dan bukannya laman web kami
  • 8.Sebuah pautan ke dokumen API
  • 9.Catatan strategi (hanya dapat dilihat oleh diri sendiri). anda boleh merakam pemikiran di sini.
  • 10.Keterangan strategi.Orang lain akan melihat keterangan jika anda berkongsi atau menjual strategi anda di Square.
  • 11.Manual strategi, hanya boleh dilihat apabila seseorang membeli strategi anda.
  • 12. Simpan kod anda, atauCtrl+Spada mod penyuntingan.
  • 13.Simpan konfigurasi backtesting pada kod.
  • 14.Downloadfail strategi
  • 15.Ekspor danimport strategi sambil mengekalkan semua parameter
  • 16.Ubah saiz fon dan edit tema
  • 17.Format kod secara automatik
  • 18. Gunakan mod VIM untuk mengedit.

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

  • 1.nama bot
  • 2.Docker untuk menjalankan bot ini
  • 3.Strategi untuk dijalankan
  • 4.Parameter, nilai lalai boleh diubah.
  • 5.Default Kline tempoh apabila menggunakan pertukaran.GetRecords()
  • 6.Exchange
  • 7.Tradingsimbol atau pasangan
  • 8.Jika simbol dagangan yang anda perlukan tidak terdapat dalam senarai, anda hanya boleh menaipnya sendiri.
  • 9.Clickuntuk menambah pertukaran
  • 10.Perubahan telah ditambah.Perubahan berbilang boleh ditambah pada satu bot, akses olehexchanges[0], exchanges[1]
  • 11.Clickuntuk menjalankan bot!

Mengurus bot

PadaRobothalaman, anda boleh 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. boleh berjalan, dihentikan, kesilapan.
  • 4.Keuntungan bot, diluluskan olehLogProfit(), boleh menjadi mana-mana nombor yang anda mahu.
  • 5.Tanggal yang dicipta, boleh diubah kepada masa komunikasi terakhir.
  • 6.Mantau bot. FMZ akan menghantar anda mesej apabila bot telah dihentikan secara tidak sengaja
  • 7. Hentikan bot.

Klik nama bot ke halaman bot untuk maklumat lanjut:img

2.Pengantar API yang paling biasa digunakan

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 Klines, Parameter Pilihan, kitaran garis K lalai ditetapkan apabila memulakan robot.

Semua parameter yang mungkin:PERIOD_M11 minit,PERIOD_M55 minit,PERIOD_M1515 minit,PERIOD_M3030 minit,PERIOD_H11h,PERIOD_D11d.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,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 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,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 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,truebermakna pembatalan permintaan pesanan berjaya.falsebermaksud 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, KDJdan sebagainya... TA.MACD(records)
Math Sokong fungsi matematik, periksa.https://mathjs.org/ Math.min(1,2), Math.sqrt(2)

3.Dua strategi sebenar yang lengkap

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

3.1 Strategi spot pembuat pasaran frekuensi tinggi

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

3.2 Ciri OKEX Dorongan Berganda

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


Lebih lanjut

Rumputteruskan mengemas kini pada jawatan ini, berasa bebas untuk bertanya apa-apa soalan