Anda boleh menggunakan Python untuk menulis terus ke pangkalan data.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // Set a global variable num, with a value of 1 second
_G("num", "ok"); // Change a global variable num, whose value is the string "ok"
_G("num", null); // Delete the global variable num
_G("num"); // Return the value of the global variable num; if it does not exist, return null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
Apabila meletakkan pesanan, ketepatan harga dan jumlah biasanya perlu dikawal; FMZ telah dibina dalam fungsi _N untuk menentukan tempat perpuluhan yang akan disimpan; sebagai contoh, hasil_N(4.253,2)
adalah 4.25.
Menghubungi API platform tidak dapat menjamin akses berjaya setiap kali, dan _C adalah fungsi cubaan semula automatik. Ia akan sentiasa memanggil fungsi yang ditentukan sehingga ia kembali dengan berjaya (fungsi akan cuba semula jika ia kembali null atau false); sebagai contoh,_C(exchange.GetTicker)
, dengan selang percubaan semula lalai 3 saat, dan anda boleh memanggil fungsi _CDelay untuk mengawal selang percubaan semula, seperti _CDelay(1000), yang bermaksud untuk menukar selang percubaan semula fungsi _C kepada 1 saat.GetTicker()
, exchange.GetDepth
, GetTrade
, GetRecords
, GetAccount
, GetOrders
danGetOrder
untuk mengelakkan gangguan program yang disebabkan oleh kegagalan akses.
CancelOrder
tidak boleh menggunakan fungsi _C, kerana terdapat pelbagai sebab untuk kegagalan untuk membatalkan pesanan. Jika pesanan telah dilaksanakan, maka membatalkan pesanan akan mengembalikan kegagalan, dan menggunakan fungsi _C akan mengakibatkan mencuba semula sepanjang masa.
Fungsi _C juga boleh lulus dalam parameter dan juga digunakan dalam fungsi tersuai.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) // Pass in the parameters
}
Panggilan_D()
langsung akan mengembalikan rentetan masa semasa, seperti:2019-08-15 03:46:14
. Jika dipanggil semasa backtest, masa backtest akan dikembalikan. Anda boleh menggunakan fungsi _D untuk menilai masa, seperti:_D().slice(11) > '09:00:00':
.
_D(timestamp, fmt)
, akan menukar stempel masa ms ke rentetan masa, seperti_D(1565855310002)
. Parameter fmt adalah format masa, dan lalai adalahyyyy-MM-dd hh:mm:ss
.
Untuk beberapa fungsi penunjuk yang biasa digunakan, seperti MA\MACD\KDJ\BOLL dan penunjuk biasa yang lain, yang telah dibina secara langsung oleh platform FMZ, dan penunjuk yang disokong secara khusus boleh didapati dalam dokumen API.
Sebelum menggunakan fungsi penunjuk, adalah yang terbaik untuk menilai panjang K-garis. Apabila panjang K-garis sebelumnya tidak dapat memenuhi tempoh yang diperlukan untuk pengiraan, hasilnya adalahnull
Sebagai contoh, jika panjang K-garis input adalah 100 dan tempoh untuk mengira MA adalah 10, maka nilai 9 pertama adalah semua sifar, dan pengiraan selepas nilai membentuk 9 akan dilakukan secara normal.
JavaScript juga menyokong talib lengkap, sebagai perpustakaan pihak ketiga, dengan kaedah panggilan sepertitalib.CCI(records)
Sila rujukhttp://ta-lib.org/function.html. Untuk Python, anda boleh memasang perpustakaan talib sendiri. Kerana keperluan untuk kompilasi, anda tidak boleh hanya menggunakan pip untuk memasang. Anda boleh mencari kaedah pemasangan sendiri.
Fungsi penunjuk bukan sahaja boleh lulus data K-garis, tetapi juga lulus mana-mana array
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Di sini kita memperkenalkan beberapa fungsi JavaScript yang biasa digunakan dalam bot.
Date.now()
Mengembalikan stempel masa semasa;parseFloat()
memindahkan rentetan ke dalam nombor, sepertiparseFloat("123.21")
;parseInt()
memindahkan rentetan ke dalam bilangan bulat;num.toString()
memindahkan nombor ke dalam rentetan, dengan nombor pembolehubah num;JSON.parse()
format rentetan Json, sepertiJSON.parse(exchange.GetRawJSON())
;Math.max()
, Math.abs()
dan sebagainya; rujukan:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;Terdapat banyak situasi yang perlu dipertimbangkan semasa menulis fungsi strategi bot. Sebagai contoh, fungsi mudah seperti membeli 5 syiling, kita perlu mempertimbangkan: Adakah baki semasa mencukupi? Berapa banyak harga pesanan? Apakah ketepatan? Adakah anda perlu membahagikan pesanan untuk mengelakkan memberi kesan kepada pasaran? Bagaimana untuk menangani pesanan yang belum selesai? Dan beberapa butiran seperti itu. Dalam strategi yang berbeza, fungsi ini sama, jadi anda boleh menjadikannya menjadi templat. Mengikuti templat rasmi, pengguna juga boleh menulis strategi templat mereka sendiri. Di sini kita akan memperkenalkan beberapa perpustakaan kelas templat yang sangat biasa digunakan yang dikeluarkan secara rasmi oleh FMZ, supaya pengguna dapat dengan cepat menulis strategi mereka sendiri.
Perpustakaan perdagangan cryptocurrency JavaScript dan perpustakaan perdagangan niaga hadapan komoditi dibina secara lalai dan tidak perlu disalin. Perpustakaan templat lain boleh didapati di strategi
Semua fungsi templat JavaScript bermula dengan$
, manakala Python semua bermula denganext
.
Alamat kod sumber:https://www.fmz.com/strategy/10989, yang sudah terbina dalam, jadi tidak perlu disalin. pelaksanaan fungsi tertentu boleh merujuk secara langsung kepada kod sumber.
Dapatkan Akaun:
$.GetAccount(e)
Log($.GetAccount()); // Obtain the account information, with fault tolerance function
Log($.GetAcccount(exchanges[1]));
Pemasangan pesanan & Batalkan:
$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom
Menghakimi Salib:
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal.
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.
$.withdraw ((e, mata wang, alamat, jumlah, yuran, kata laluan) fungsi:
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
Untuk penggunaan perpustakaan dagangan niaga hadapan komoditi adalah sangat stabil, ia disyorkan.https://www.fmz.com/strategy/12961, yang sudah terbina dalam, jadi tidak perlu disalin. pelaksanaan fungsi tertentu boleh merujuk secara langsung kepada kod sumber.
Perpustakaan CTA
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("Golden cross period", cross, "the moment position", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("Death cross period", cross, "the moment position", mp);
return -1
}
});
}
Invokasi Contoh perpustakaan
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// Multiple varieties use the trading queue to complete the non-blocking trading task
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// Call "poll" to execute the unfinished tasks in the spare time
q.poll()
Sleep(1000)
}
}
Untuk fungsi mentah untuk melukis sangat rumit, yang akan diperkenalkan dalam tutorial seterusnya, kami mengesyorkan pemula untuk menggunakan perpustakaan lukisan, untuk melukis carta garis yang sangat mudah dan carta k-garis, dan lain-lain. Perpustakaan lukisan mudah telah dibina di FMZ, yang boleh dilihat di halaman penyuntingan strategi; jika perpustakaan belum dibina, pengguna perlu menyalin dan menyimpan, untuk memeriksa dan menggunakan perpustakaan dalam strategi.
Alamat salinan perpustakaan lukisan versi Javascript:https://www.fmz.com/strategy/27293Alamat salinan perpustakaan lukisan versi Python:https://www.fmz.com/strategy/39066
Contoh khusus:
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) // You can draw two lines at the samw time, "Last" is the name of the line
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
Di bawah
Ia sangat mudah untuk memahami dan jenis rentetan dan jenis nombor. yang merupakan jenis yang sangat biasa digunakan. kotak combo akan memaparkan pilihan dalam kotak pada antara muka parameter. Sebagai contoh, anda boleh menetapkan parameter SYMBOL sebagaiBTC|USDT|ETH
dalam kotak combo; jika anda memilih USDT dalam kotak di halaman, nilai SYMBOL dalam strategi adalah indeks USDT 1. Pilihan semak merujuk kepada kotak semak pilihan; semak bermaksud benar, sementara tidak ada semak bermaksud palsu.
Terdapat lebih banyak parameter untuk tetapan; referene:https://www.fmz.com/api.
Apabila kuantisasi strategi selesai, anda boleh mengujinya dengan data sejarah, untuk memeriksa keadaan keuntungan strategi pada tarikh sejarah. Sudah tentu, hasil backtest hanya untuk rujukan. Javascript backtest dijalankan pada penyemak imbas; Python backtest adalah pada docker, dan platform kami menyediakan dockers awam untuk pengguna.
Mekanisme backtest onbar adalah berdasarkan pada K-line, iaitu, setiap K-line akan menghasilkan satu titik dalam masa untuk backtest. Pada titik dalam masa, anda boleh mendapatkan maklumat termasuk harga terbuka, dekat, tertinggi dan terendah dan jumlah dagangan K-line semasa, serta maklumat K-line sejarah sebelum titik. Kekurangan mekanisme jenis ini sangat jelas: hanya satu pembelian boleh dihasilkan pada satu K-line; biasanya harga yang dirujuk adalah harga dekat thr K-line. juga, satu K-line hanya boleh mendapatkan empat harga, iaitu harga dekat, terbuka, tertinggi dan terendah; maklumat, termasuk bagaimana harga berubah dalam satu K-line dan sama ada harga tertinggi atau harga terendah berubah terlebih dahulu, tidak dapat diperoleh. Ambil bot ujian K-line satu jam sebagai contoh. Maklumat ini pasti diperoleh dalam beberapa saat, dan perintah akan dijalankan dalam mekanisme perdagangan kembali K-line tidak selesai, kelebihan dan mudah difahami.
Ujian belakang pada FMZ mengandungi dua jenis, iaitu ujian belakang tahap simulasi dan ujian belakang tahap pasaran sebenar. Ujian belakang tahap simulasi dapat menghasilkan tik yang disimulasikan mengikut tempoh garis K lapisan bawah, dan setiap tempoh garis K lapisan bawah akan menghasilkan 14 titik masa ujian belakang.Walau bagaimanapun, ujian belakang tahap pasaran sebenar sebenarnya akan mengumpul tik, setiap beberapa saat, dan kini ia menyokong kedalaman sebenar (termasuk 20 tahap), dan perdagangan pelaksanaan sebenar oleh tarde.Jangkaan tarikh adalah cukup besar, dan kelajuan backtest sangat perlahan, jadi backtest tidak boleh dijalankan dalam masa yang lama. mekanisme FMZ backtest boleh merealisasikan pelbagai perdagangan dari startegy pada satu K-line, untuk mengelakkan keadaan bahawa perdagangan hanya boleh dilaksanakan oleh harga dekat, dan juga semakin menyasarkan dan menjaga kelajuan backtest.https://www.fmz.com/bbs-topic/9126.
Kerangka kerja backtest dan bot adalah sama, kedua-duanya adalah gelung tanpa akhir. Kerana backtest adalah untuk melompat ke titik backtest yang berbeza, backtest boleh dijalankan tanpa menggunakan Sleep(10)
, untuk mengelakkan terjebak.
Mesin backtest akan sepadan dengan harga pesanan yang diletakkan oleh pengguna dan harga pasaran pada titik masa backtest. Jika harga beli lebih tinggi daripada satu jual, satu jual akan dilaksanakan. Jika perdagangan tidak dapat dilaksanakan, pesanan tertunda akan dihasilkan. Slippage perlu ditambah untuk memastikan perdagangan. Jika kedudukan tidak dapat dibuka atau ditutup semasa backtest, periksa sama ada kedudukan dibekukan kerana pesanan yang belum selesai.
GetRecords()
fungsi; anda juga boleh menentukan parameter tempoh dalam kod;Seperti yang telah kita sebutkan sebelum ini, menggunakan antara muka API dalam bot mungkin gagal untuk mengakses dan kembalinull
; jika anda masih menggunakan data itu, satu kesilapan akan dilaporkan dan bot akan berhenti.
Penyebab biasa:
Kesalahan rangkaian akses API; masa tamat mengakses antara muka mengembalikan nunll, dan kesilapan akan dilaporkan.
Kesalahan batasan platform, seperti had ip, ketepatan pesanan, kekerapan akses, kesilapan parameter, kekurangan aset, kegagalan perdagangan pasaran, pembatalan pesanan yang dilaksanakan, dll.; butiran boleh ditanyakan dalam dokumen API mengikut kod yang salah.
Kesalahan data pengembalian platform; ia berlaku kadang-kadang, seperti mengembalikan kedalaman sifar, maklumat akaun tertunda dan status pesanan tertunda, dll.
Kesilapan logik program.
Sebelum anda menggunakan data yang dikembalikan API, anda harus menilai sama ada data adalah sifar, dan kaedah biasa diperkenalkan seperti berikut:
//1.judge the data is null and handle
var ticker = exchange.GetTicker();
while(ticker == null){
Log('ticker obtain error');
ticker = exchange.GetTicker();
}
Log(ticker.Last);
// 2. judge the data is not null, and use
var ticker = exchange.GetTicker();
if(!ticker){
Log(ticker.Last);
}
// 3.retry _C() function
var ticker = _C(exchange.GetTicker);
Log(ticker.Last);
// 4.try cache fault tolerance
try{
var ticker = exchange.GetTicker();
Log(ticker.Last);
}
catch(err){
Log('ticker obtain error');
}
Jika anda ingin mendapatkan maklumat kesilapan, anda boleh menggunakanGetLastError()
, dan rentetan masa terakhir maklumat ralat akan dikembalikan, dan ralat boleh diproses oleh perbezaan.
Ringkasan kesilapan biasa dalam catatan teratas forum:https://www.fmz.com/bbs-topic/9158. Di sini kita memperkenalkannya secara ringkas; anda boleh menggunakan ctrl + F untuk mencari, apabila anda mempunyai masalah.
Bagaimana untuk menggunakan docker?
Terdapat pengenalan terperinci tentangnya dalam bahagian menambah docker.
Boleh saya minta seseorang menulis strategi untuk saya?
padahttps://www.fmz.com/markets, ada beberapa orang yang menyediakan perkhidmatan menulis strategi untuk orang lain, atau anda boleh bertanya dalam kumpulan sembang; perhatikan bahawa jenis perkhidmatan itu harus dihubungi sendiri, dan anda harus sedar bahawa risiko juga harus ditanggung oleh anda sendiri.
Semua antara muka meminta masa keluar apabila diakses
ia merujuk kepada masa lapang antara muka platform yang diakses; jika masa lapang berlaku sesekali, ia bukan masalah; jika masa lapang diminta sepanjang masa, ini bermakna semua rangkaian tidak dapat diakses dan pelayan luar negara diperlukan.
ERR_INVALID_POSISI
Jika backtest melaporkan ralat, ia biasanya merupakan ralat penulisan; apabila anda cuba meletakkan pesanan untuk menutup kedudukan, apabila tidak ada kedudukan atau jumlah kedudukan tidak mencukupi, ralat akan dilaporkan.
Simbol tidak ditetapkan
Tidak ada kontrak yang ditetapkan dalam kod, semasa ujian belakang platform niaga hadapan.
BITMEX 429error,{
error :{ message : Rate limit exceeded re-try in 1 seconds...... }}
Frekuensi akses antara muka platform terlalu tinggi.
{
status :6004, msg : timestamp adalah di luar julat }
Stempel masa pelayan melebihi julat masa kemas kini pelayan, dan masa yang melebihi tidak boleh terlalu lama.
GetOrder ((455284455): ralat: id pesanan tidak sah atau pesanan dibatalkan.
Jika pesanan platform dibatalkan, platform tidak akan menyimpan maklumat pesanan lagi, jadi maklumat itu tidak dapat diperoleh.
GetOrders: 400: {
code :-1121, msg : Invalid simbol. }
Pasangan dagangan tidak sah; periksa jika tetapan pasangan dagangan salah.
Penyahkodean kunci rahsia gagal
Pemetaan APIKEY gagal. Jika kata laluan FMZ telah diubahsuai selepas APIKEY dikonfigurasikan, cuba tambahkan halaman platform di FMZ dan menyusun semula APIKEY platform.
Tanda tangan tidak sah: masa penyerahan yang tidak sah atau format masa yang salah
mencadangkan anda menggunakan pelayan Linux, atau memasang perisian penyegerakan masa pada sistem Windows ini di mana masalah ini berlaku.
Mengapa docker masih tidak boleh mengakses API platform apabila proksi global ditetapkan?
Proxy global tidak mempunyai port rangkaian proxy docker. Oleh kerana masalah kelewatan, adalah lebih baik untuk menggunakan docker pelayan luar negara.
Bagaimana untuk menyimpan strategi secara tempatan, tidak untuk memuat naik ke FMZ?
Menggunakan Python, dan anda boleh mengimport fail tempatan, menyimpan strategi biasanya ditulis oleh FMZ API sebagai fail dan meletakkannya dalam laluan pelaksanaan pada pelayan anda sendiri, dan anda boleh terus membaca dan melaksanakannya.
#!python2.7
def run(runfile):
with open(runfile,"r") as f:
exec(f.read())
def main():
run('my.py')
Bagaimana untuk testnet platform atau bagaimana untuk menukar alamat pangkalan API?
Gunakan exchange.SetBase() untuk terus beralih ke alamat pangkalan API yang sepadan.
exchange.SetBase("https://www.okex.me")