Dalam artikel sebelum ini, kami telah mempelajari strategi pengukuran yang lebih ringkas untuk 30 baris kod, dan dalam artikel ini, penulis akan membawa langkah demi langkah pemula pengukuran yang lebih dekat untuk menggali keseronokan reka bentuk strategi pengukuran. Penulis terus menerus bahawa ia masih menggunakan perdagangan BTC secara langsung, yang sebelum ini tidak mempunyai pengetahuan mengenai kewangan, pelaburan, sekuriti, dan lain-lain. Lebih-lebih lagi, orang yang tercengang dengan mata, mendengar nama atau istilah yang tidak pernah didengar, (yang diimplementasikan juga sedikit faham! sedikit faham!)); dengan menggunakan Baidu sendiri, mencari maklumat dan lain-lain. Setelah melihat kandungan yang berkaitan, saya mempunyai konsep asas, dan menggabungkan bahasa JS yang sedikit saya fahami, saya menulis sederhana. Pada mulanya saya tidak tahu apa itu garis K, garis rata, penunjuk MACD. Secara ringkasnya, garis K adalah garis yang merakam pasaran dalam tempoh tertentu untuk melihat dinamika pasaran. Garis rata adalah indikator yang digunakan dalam artikel sebelumnya, dan sama seperti MACD, merupakan indikator yang mencerminkan trend pasaran. Konsep, algoritma, formula, dan lain-lain dari kedua-dua penunjuk ini telah diterangkan secara berlainan.
Nama pembolehubah | Nilai awal | Pencerahan |
---|---|---|
Jangkaan | 2000 | Variabel ini adalah kitaran rundingan, iaitu jumlah masa yang diperlukan oleh program untuk berhenti menunggu, unitnya adalah mili saat, 1000 mili saat adalah 1 saat, jadi nilai awal pembolehubah ini adalah 2 saat. |
STATE_FREE | 0 | Ini adalah pembolehubah keadaan yang menunjukkan kekosongan. |
STATE_BUY | 1 | Ini adalah satu pemboleh ubah yang menunjukkan keadaan, yang menunjukkan banyak pegangan. |
STATE_SELL | 2 | Variabel status, menunjukkan pemegang kosong. |
ORDER_INVALID | 3 | Variabel status simpanan, menunjukkan tidak simpanan. |
ORDER_VALID | 4 | Ini menunjukkan bahawa... |
negara | STATE_FREE | Variabel keadaan, dimulakan dengan keadaan kosong. |
IsyaratTunda | 0 | Pada mulanya, ia dirancang untuk memberi isyarat kelewatan, sementara tidak berguna. |
StopProfit | 0.002 | Variabel ini lebih penting, kadar stop loss, contohnya modal * kadar stop loss ((0.002) menunjukkan maksimum kerugian 0.002 kali modal, dan had kerugian. |
langkah | 0.5 | Nilai langkah stop loss glide. Untuk menaikkan, menurunkan, dan pangkat harga stop loss. |
opJumlah | 1 | Jumlah operasi tetap. |
keuntungan | 0 | Ini adalah satu-satunya cara yang boleh dilakukan. |
var holdOrder = {//持仓信息对象
orderState: ORDER_INVALID,// 持仓状态
price: 0, //持仓均价
amount: 0, //持仓量
time: null, // 操作时间
stopPrice: 0, // 止损价
level: 1, //止损等级
updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
if(state === STATE_SELL){//当前 空头持仓
return (lastPrice - this.price) * amount;
}
if(state === STATE_BUY){//当前 多头持仓
return - (lastPrice - this.price) * amount;
}
},
SetStopPrice: function(ticker,stopState){//更新止损价
if(stopState === STATE_FREE){ //更新止损时状态 为空闲
return this.stopPrice;
}
if(stopState === STATE_BUY){ //更新止损时状态 为多仓
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){//初始 止损价为0 时
this.stopPrice = this.price * ( 1 - stopProfit );
}
if( ticker.Last <= this.price ){ //最后成交价 小于等于 持仓均价时
this.stopPrice = this.price * ( 1 - stopProfit );
this.level = 1;
}else{//其它情况
if( ticker.Last - this.price > this.level * step ){//超出当前等级 设置滑动止损
this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
//更新止损价为滑动后的止损价
this.level++;//上调止损等级
}else{//其它
this.stopPrice = this.stopPrice;//保持当前止损价不变
}
}
}else if( stopState === STATE_SELL){//空头持仓类似
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){
this.stopPrice = this.price * ( 1 + stopProfit );
}
if( ticker.Last >= this.price ){
this.stopPrice = this.price * ( 1 + stopProfit );
this.level = 1;
}else{
if( this.price - ticker.Last > this.level * step ){
this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
this.level++;
}else{
this.stopPrice = this.stopPrice;
}
}
}
return this.stopPrice;//返回止损价
},
initHoldOrder: function(){//平仓后 用于 初始化持仓信息的 函数
this.orderState = ORDER_INVALID;
this.price = 0;
this.amount = 0;
this.time = null;
this.stopPrice = 0;
this.level = 1;
}
};
Di bawah ini adalah beberapa gambar yang boleh anda gunakan untuk memuat naik kod: KlikGithubMasuklah.
Jika anda belum menyertai kumpulan QQ rasmi di sini, sila menyertai: 309368835 Pencipta Kuantitifikasi Kumpulan Pertukaran.
function MACD_Cross() {// fungsi untuk mengesan penunjuk MACD, keadaan silang
var records = exchange.GetRecords (();// Dapatkan data baris K
while ((!records の の records.length < 45) { // Data baris K tidak boleh menjadi null, lebih besar daripada 45 lajur, tidak memenuhi standard
records = exchange.GetRecords ();
Sleep (Interval);
{C:$0000FF}
var macd = TA. MACD ((records,12,26,9);// memanggil fungsi penunjuk, parameter adalah parameter MACD lalai.
var dif = macd[0]; baris // dif
var dea = macd[1]; baris //dea
var column = macd[2]; // tiang MACD
var len = records.length; //K panjang kitaran baris
if (( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2)) {
// menentukan syarat garpu emas: dif dan dea pada masa ini lebih besar daripada 0, dan dif melintasi dea dari bawah ke atas, dan barisan kuantiti MACD lebih besar daripada 0.2
return 1; // kembali 1 untuk isyarat garpu emas.
{C:$0000FF}
if (( (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2) {
// Menghakimi syarat garpu mati:
return 2;// return 2 mewakili isyarat garpu mati.
{C:$0000FF}
return 0; // Golden Fork, Death Fork, selain daripada isyarat, untuk isyarat menunggu 0.
{C:$0000FF}
fungsi getTimeByNormal(time) {// Fungsi untuk mendapatkan masa Mengubah masa milidetik ke masa standard
var timeByNormal = new Date ();
timeByNormal.setTime ((time);
var strTime = timeByNormal.toString ();
var showTimeArr = strTime.split ();
var showTime = showTimeArr[3]+
fungsi utama
var initAkaun =\(.GetAccount(exchange);// Pertama kita akan merakam maklumat akaun pada permulaan, di sini kita memanggil fungsi eksport dari perpustakaan kelas templat
var nowAccount = initAccount;// Mengisytiharkan semula pembolehubah untuk menunjukkan maklumat akaun sekarang
var diffMoney = 0; // wang perbezaan
var diffStocks = 0;// mata wang Perbezaan
var repair = 0; // Mengira jumlah yang digunakan untuk membetulkan kerugian
var ticker = exchange.GetTicker(); // Dapatkan pasaran pada masa ini
Log (("Akun awal:",initAccount); // output menunjukkan maklumat akaun awal.
while ((true) {// lingkaran fungsi utama
scan ((); // fungsi imbasan, yang akan dijelaskan di kemudian hari, terutamanya untuk menilai kedudukan terbuka, kedudukan rata dan operasi kedudukan terbuka, kedudukan rata.
ticker = exchange.GetTicker();// dalam kitaran sementara mendapatkan pasaran
if ((!ticker) {// jika tidak mendapat (null) lompat semula
teruskan;
{C:$0000FF}
if ((holdOrder.orderState == ORDER_VALID) {// menentukan sama ada ia sedang disimpan
Log (("Tahunan semasa:",holdOrder); // jika disimpan semasa
{C:$0000FF}
if ((holdOrder.orderState == ORDER_INVALID) {// jika tidak memegang (jika telah memegang) }
nowAccount = \).GetAccount ((exchange); // Dapatkan maklumat akaun semasa
diffMoney = nowAccount.Balance - initAccount.Balance; // Mengira perbezaan wang antara akaun semasa dan akaun awal
diffStocks = nowAccount.Stocks - initAccount.Stocks; // Mengira perbezaan mata wang antara akaun semasa dan akaun awal
repair = diffStocks * ticker.Last; // menukar perbezaan mata wang * harga dagangan terakhir, kepada wang yang setara, digunakan untuk mengira keuntungan dan kerugian
LogProfit ((diffMoney + repair,
fungsi scan (() { var sellInfo = null; // deklarasi Variabel untuk menyimpan maklumat kedudukan, initializenull var buyInfo = null; // pengisytiharan var op Fun = null;// Fungsi bukaan, dua keadaan, bukaan banyak, bukaan kosong. var singal = 0; // isyarat while ((true) {// Pengesanan dan Pengendalian var ticker = exchange.GetTicker ((); // Dapatkan pasaran if ((!ticker) { // Penghakiman Pemerolehan Gagal Lari ke bawah dan teruskan pemerolehan teruskan; {C:$0000FF} holdOrder.SetStopPrice ((ticker,state); // set holdOrder.SetStopPrice (ticker,state); // set holdOrder.SetStopPrice (ticker,state); // set holdOrder.SetStopPrice (ticker,state); // set holdOrder.SetStopPrice (ticker,state); // set holdOrder (hold) Stop loss (stop loss) harga if(state === STATE_FREE && (singal = MACD_Cross())!== 0) { // Mengesan sama ada keadaan operasi dasar kosong, sama ada isyarat penunjuk MACD kosong pada masa ini, sesuai dengan keadaan operasi dasar kosong dan dengan garpu emas atau garpu mati yang dilaksanakan di bawah holdOrder.initHoldOrder (();// Inisialisasi maklumat simpanan opFun = singal === 1?\(.Beli: \).Sell ;// berdasarkan hasil yang dikembalikan oleh fungsi MACD_Cross, menentukan banyak kedudukan, kedudukan kosong. buyInfo = opFun ((opAmount);// Operasi pembukaan holdOrder.orderState = ORDER_VALID;// Tetapkan maklumat simpanan, status untuk simpanan holdOrder.price = buyInfo.price; // menetapkan harga rata pegangan yang dikembalikan oleh fungsi operasi pembukaan pegangan opFun. holdOrder.amount = buyInfo.amount; // menetapkan jumlah pemegang holdOrder.time = getTimeByNormal (((new Date (()))) getTime (()));// menetapkan masa permulaan simpanan state = singal === 1? STATE_BUY : STATE_SELL; // mengemas kini keadaan dasar untuk pelbagai stok atau stok kosong var account =\(.GetAccount ((exchange); // Dapatkan maklumat akaun if ((singal === 1) {// output arahan pembukaan dan maklumat akaun semasa Log ((("multi-posisi。","akaun:",account); ♪ yang lain ♪ Log (("Lokasi kosong ".., "Akaun: "Akun"); {C:$0000FF} Pergi ke mana? ♪ yang lain ♪ var lastPrice = holdOrder.price;// Berikan nilai kepada lastPrice if(state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ) { // Jika banyak kedudukan dan mempunyai maklumat untuk memegang dan harga perdagangan akhir adalah kurang daripada harga stop loss, lakukan seperti berikut Log (("Multi-head stop loss breakdown"," harga stop loss awal:",holdOrder.price * (1 - stopProfit), "-- harga stop loss bergerak:",holdOrder.stopPrice, "harga perdagangan akhir:", ticker.Last, "kelas stop loss:",holdOrder.level);// maklumat stop loss breakdown sellInfo = \).Sell ((holdOrder.amount);// Perhentian holdOrder.orderState = ORDER_INVALID;// Maklumat perpecahan Mengemas kini objek holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount);// kemas kini keuntungan dan kerugian terapung status = STATE_FREE;// kemaskini status Break;/ lompat keluar {C:$0000FF} if(state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice) {// Begitu juga, ini adalah penghentian rugi kosong Log ((Log kosong, harga stop loss awal: HoldOrder.price * (1 + stopProfit), harga stop loss bergerak: HoldOrder.stopPrice, harga perdagangan akhir: Hold, ticker.Last, peringkat stop loss: HoldOrder.level);// ujian sellInfo =\(.Buy(holdOrder.amount); holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount); state = STATE_FREE; Pergi ke mana? {C:$0000FF} if(state === STATE_BUY && MACD_Cross() === 2 ) {// apabila dilakukan lebih banyak, MACD indikator mati garpu -- mati garpu perpecahan sellInfo = \).Sell ((holdOrder.amount); Log ((Log, stop loss awal, stop order.price * (1 - stopProfit), stop loss bergeser, stop order.price, stop stop, ticker.Last, stop loss peringkat, stop order.level);// ujian holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount); state = STATE_FREE; Pergi ke mana? {C:$0000FF} if(state === STATE_SELL && MACD_Cross() === 1 ) {// apabila kosong, MACD indikator garpu emas sellInfo = $.Buy ((holdOrder.amount); Log ((Log (Log (Log (Log (Log (Log (Log (Log (Log))))), harga henti rugi awal (Log (Log (Log (Log))), harga henti rugi bergerak (Log (Log (Log))), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log)), harga henti rugi (Log (Log)), harga henti rugi (Log (Log)), harga henti rugi (Log (Log)), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log))), harga henti rugi (Log (Log (Log)), level (Log (Log)), level (Log (Log (Log)), level (Log (Log (Log)), holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount); state = STATE_FREE; Pergi ke mana? {C:$0000FF} {C:$0000FF} Sleep ((Interval);//Interval rundingan, iaitu untuk menghentikan program sejenak. {C:$0000FF} {C:$0000FF}
Pertama, mengenai prinsip penghentian glide.
Di dalam kod ini mengenai penghentian licin, anda boleh melihat gambar yang menunjukkan bahawa anda telah memindahkan data anda ke laman web yang lain.SetStopPrice
Fungsi mengikut inputstopState
(Keadaan henti) danticker
(Data pasaran) untuk mengemas kini harga stop loss.stopState === STATE_BUY
), untuk menilai dan mengemas kini harga henti rugi mengikut keadaan yang berbeza; jikaorderState
Untuk keadaan tidak berlaku (iaitu tidak memegang kedudukan yang sah), pulangkan harga stop loss semasa. Jika harga stop loss adalah 0, inisialisasikan sebagai harga beli purata dikalikan dengan(1 - stopProfit)
Kemudian, berdasarkan harga transaksi akhir.ticker.Last
), dan harga simpananthis.price
Nilai perbezaan antara kadar penghentian kerugian semasa dan kadar penghentian kerugian semasathis.level
) dibandingkan dengan perkalian langkah. Jika melebihi kedudukan semasa, harga hentian rugi akan diperbaharui kepada nilai selepas bergerak, sambil menambah kedudukan hentian rugi; jika tidak, harga hentian rugi semasa tidak berubah.stopState === STATE_SELL
Logiknya sama, tetapi mengambil nilai negatif dari perbezaan antara harga transaksi akhir dan harga saham yang sama, dan mengurangkan perbezaan itu apabila harga berhenti diperbaharui. Akhirnya, kembalikan harga berhenti selepas diperbaharui.
Stop loss licin adalah strategi pengurusan risiko
Dalam proses memegang, harga stop loss disesuaikan dengan turun naik harga pasaran untuk mengurangkan kerugian atau melindungi keuntungan. Menurut logik kod, titik-titik penting untuk mencapai stop loss glide adalah sebagai berikut:updateCurrentProfit
Kaedah ini digunakan untuk mengemas kini keuntungan dan kerugian semasa berdasarkan keadaan pemegang (state) dan harga terkini (lastPrice). Jika pemegang adalah keadaan jual kosong (STATE_SELL), kerugian adalah perbezaan harga terkini dengan harga sama dengan pemegang; jika keadaan berbilang (STATE_BUY), kerugian adalah negatif. Kaedah SetStopPrice digunakan untuk mengemas kini harga berhenti. Mengikut parameter yang dihantar (stopState) dan harga terkini (ticker.Last), harga berhenti disesuaikan. Jika keadaan berhenti kosong (STATE_FREE), harga berhenti tidak berubah. Jika keadaan kerugian adalah lebih banyak saham (STATE_BUY), penyesuaian harga berhenti dilakukan mengikut keadaan yang berbeza. Jika harga perdagangan terakhir adalah lebih kecil, harga berhenti akan dikalikan dengan harga berhenti.1 - stopProfit
), dan menetapkan semula tahap stop loss kepada 1; jika harga perdagangan akhir melebihi langkah langkah dari tahap semasa, maka harga stop loss ditetapkan sebagai harga stop loss selepas meluncur, dan tahap stop loss ditingkatkan; jika tidak, harga stop loss tidak berubah. Jika keadaan stop loss adalah kosong (STATE_SELL), logiknya sama.
Maklumat rujukan
MidskyHalo tuan rumah, saya adalah www.banbiren.com penukar wang, pengarang platform pasaran penukar wang, sedang belajar untuk berdagang secara kuantitatif, saya mempunyai nomborqq:39866099, bolehkah anda menjemput saya untuk menyertai kumpulan ini?
SifarPerkembangan cepat ~
MuiaBerusaha
Pencipta Kuantiti - Impian KecilOK ^^, anda di sini. Sila memohon secara langsung, MAC QQ tidak dapat mencari tempat jemputan >_<, 1 nombor kumpulan: 309368835 Sekarang terdapat beberapa tempat.
Pencipta Kuantiti - Impian KecilSaya tidak tahu apa yang akan berlaku.
Pencipta Kuantiti - Impian KecilBelajar bersama-sama ~ Wow ~