Harga adalah sama ada naik atau turun. Dalam jangka panjang, kebarangkalian kenaikan dan kejatuhan harga harus 50%, jadi untuk meramalkan harga masa depan dengan betul, anda perlu mendapatkan semua faktor yang mempengaruhi harga dalam masa nyata, dan kemudian memberikan setiap faktor berat yang betul, dan akhirnya membuat analisis Objektif dan rasional. Untuk menyenaraikan semua faktor yang mempengaruhi harga, ia mungkin mengisi seluruh alam semesta.
Diikutsertakan sebagai: persekitaran ekonomi global, dasar makro negara, dasar perindustrian yang berkaitan, hubungan bekalan dan permintaan, peristiwa antarabangsa, kadar faedah dan kadar pertukaran, inflasi dan deflasi, psikologi pasaran, dan faktor yang tidak diketahui lain, dll. Ramalan telah menjadi tugas yang besar dan mustahil. Jadi awal, saya memahami bahawa pasaran tidak dapat diramalkan. Kemudian semua ramalan di pasaran telah menjadi hipotesis, dan perdagangan telah menjadi permainan kebarangkalian, yang menarik.
Oleh kerana pasaran tidak dapat diramalkan, adakah ia benar-benar acuh tak acuh? Tidak, semua faktor makro dan mikro telah tercermin dalam harga, yang bermaksud bahawa harga adalah hasil daripada interaksi semua faktor. Kita hanya perlu menganalisis harga untuk membuat strategi perdagangan yang lengkap.
Fikirkan dulu, kenapa harga naik?
Anda mungkin berkata, kerana: negara menyokong dasar perindustrian yang relevan, negara asal hujan lebat, perang perdagangan antarabangsa, garpu emas MACD dibeli, orang lain telah membelinya, dll.
Pada hakikatnya, kenaikan dan penurunan harga adalah serupa dengan pasang naik. Peningkatan harga tidak dapat dipisahkan dari promosi dana. di pasaran, jika terdapat lebih banyak pembeli daripada penjual, harga akan naik. sebaliknya, jika terdapat lebih banyak penjual daripada pembeli, harga akan jatuh. Dengan konsep ini, kita boleh memberikan jangkaan yang munasabah untuk trend harga masa depan berdasarkan hubungan bekalan dan permintaan yang tercermin dalam aliran bersih dana.
Berbeza dengan analisis aliran dana tradisional, analisis aliran dana menganalisis transaksi mana yang merupakan aliran masuk dana aktif dan transaksi mana yang merupakan aliran keluar dana aktif berdasarkan data transaksi dalam tempoh masa. Kemudian, dengan mengurangkan jumlah aliran keluar aktif dari jumlah aliran masuk aktif dalam tempoh ini, kita dapat mengetahui aliran masuk dana bersih dalam tempoh ini. Jika aliran masuk dana bersih positif, ini bermakna bekalan produk ini kekurangan; jika aliran keluar dana bersih bermakna bekalan produk ini berlebihan.
Selepas membaca ini, sesetengah orang mungkin tertanya-tanya bahawa dalam transaksi sebenar, perjanjian hanya akan dibuat apabila seseorang membeli dan seseorang menjual. Perintah urus niaga mesti mempunyai jumlah penjualan sebanyak jumlah pembelian, dan dana mesti masuk dan keluar dari jumlah yang sama. Dari mana aliran masuk dan keluar modal berasal? Sebenarnya, secara ketat, setiap pesanan beli mesti sesuai dengan pesanan jual yang sesuai, dan aliran masuk modal dan aliran keluar modal mesti sama. Jika kita ingin mengira pesanan mana yang dibeli secara aktif dan pesanan mana yang dijual secara aktif, kita hanya boleh menggunakan kaedah kompromi, menggunakan data bar garis K, berdasarkan jumlah transaksi dan harga.
Perubahan dalam aliran dana dengan tepat sepadan dengan tingkah laku pasaran masa nyata, dan aliran bersih dana dikira dalam masa nyata dengan mengintegrasikan data bar garis k. Terdapat dua algoritma untuk mengira aliran dana aktif:
Pertama, jika harga urus niaga semasa pesanan semasa dilaksanakan pada harga pihak lawan atau pada harga yang lebih tinggi, harga urus niaga pembelian >= harga urus niaga jualan, yang bermaksud bahawa pembeli lebih bersedia untuk menyelesaikan urus niaga pada harga yang lebih tinggi, yang termasuk dalam aliran dana aktif.
Kedua, jika harga urus niaga semasa > harga urus niaga terakhir, maka dapat difahami bahawa jumlah urus niaga semasa secara aktif mendorong kenaikan harga, yang termasuk dalam aliran dana aktif.
Ambil algoritma kedua di atas sebagai contoh:
Harga penutupan produk tertentu pada pukul 10:00 adalah 3450, dan harga penutupan pada pukul 11:00 adalah 3455, jadi kita akan memasukkan jumlah urus niaga antara 10:00 dan 11:00 sebagai aliran masuk modal aktif. Jika tidak, ia termasuk dalam aliran keluar inisiatif dana. Artikel ini berdasarkan kaedah kedua, menambah faktor turun naik harga. Dengan membandingkan harga penutupan bar k sebelum dan selepas, jumlah kenaikan atau penurunan k bar bar * turun naik dimasukkan dalam urutan, dan kemudian lebih lanjut mengikut urutan Mengira nisbah aliran masuk aktif dana.
Artikel ini menerangkan aliran dana di pasaran niaga hadapan dari perspektif
Peningkatan harga dan aliran bersih aktif dana per unit masa: keadaan ini kuat, dan harga masa depan akan terus meningkat lebih mungkin;
Harga saham meningkat, dan aliran keluar bersih aktif dana setiap unit masa: Dalam kes ini, ia adalah kedudukan yang sederhana-kuat, dan kadar kenaikan harga masa depan akan berkurang dengan ketara;
Harga saham jatuh, manakala aliran bersih aktif dana setiap unit masa: ini adalah keadaan yang lemah, dan harga masa depan terus jatuh lebih mungkin;
Harga saham jatuh, dan pada masa yang sama aliran keluar bersih aktif dana per unit masa: dalam kes ini, ia adalah kedudukan yang lemah, dan kadar penurunan harga masa depan akan berkurang dengan ketara;
Rendah sebelumnya (ll) Jumlah tertinggi sebelum ini (hh) Pembelian aktif (barIn) Penjualan aktif (barOut) Nisbah aliran dana aktif ke aliran dana aktif (barRatio) Sempadan kedudukan pembukaan (openValve) Posisi pemegang semasa (myAmount) Harga penutupan K-line terakhir (tutup)
Strategi perdagangan kuantitatif yang baik memerlukan bukan sahaja pulangan yang stabil, tetapi juga keupayaan untuk mengawal risiko dan mengelakkan kerugian besar apabila terdapat kebarangkalian kecil.
Pembukaan kedudukan panjang: jika tidak ada kedudukan tahan semasa, dan barRatio > openValve, buka kedudukan panjang;
Pembukaan kedudukan pendek: jika tidak ada kedudukan tahan semasa dan barRatio < 1 / openValve, buka kedudukan pendek;
Penutupan kedudukan panjang: Jika kedudukan panjang semasa dipegang dan ditutup < ll, jual dan tutup kedudukan panjang;
Penutupan kedudukan pendek: Jika kedudukan pendek semasa dipegang dan ditutup > hh, beli dan tutup kedudukan pendek;
Mendapatkan dan mengira data
function data() {
var self = {};
var barVol = [];
var bars = _C(exchange.GetRecords); //Get K line bar data
if (bars.length < len * 2) { //Control the length of the K line bar data array
return;
}
for (var i = len; i > 0; i--) {
var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
if (barSub_1 > 0) { //If the price rises, add a positive number to the array
barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
} else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
}
}
if (barVol.length > len) {
barVol.shift(); //Free up excess data
}
self.barIn = 0;
self.barOut = 0;
for (var v = 0; v < barVol.length; v++) {
if (barVol[v] > 0) {
self.barIn += barVol[v]; //Consolidate all active inflows funds
} else {
self.barOut -= barVol[v]; //Consolidate all active outflow funds
}
}
self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
bars.pop(); //Delete unfinished K line bar data
self.close = bars[bars.length - 1].Close; //Get the closing price of the pervious bar
self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
return self;
}
Dapatkan data bar garis K terus melaluiGetRecords
kaedah dalam API FMZ. mengandungi harga tertinggi, harga terendah, harga pembukaan, harga penutupan, jumlah, dan stempel masa standard. Jika harga urus niaga terkini lebih besar daripada harga urus niaga terakhir, maka jumlah urus niaga terkini * (harga tertinggi-harga terendah) dimasukkan ke dalam pembelian aktif; jika harga urus niaga terkini adalah lebih rendah daripada harga urus niaga terakhir, maka jumlah terakhir * (harga tertinggi-harga terendah) dimasukkan ke dalam penjualan aktif;
function positions(name) {
var self = {};
var mp = _C(exchange.GetPosition); //Get positions
if (mp.length == 0) {
self.amount = 0;
}
for (var i = 0; i < mp.length; i++) { //Position data processing
if (mp[i].ContractType == name) {
if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
self.amount = mp[i].Amount;
} else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
self.amount = -mp[i].Amount;
}
self.profit = mp[i].Profit;
} else {
self.amount = 0;
}
}
return self;
}
Dapatkan data kedudukan asas melaluiGetPosition
Jika kedudukan panjang semasa dipegang, maka kuantiti kedudukan positif dikembalikan; jika kedudukan semasa pendek, maka kuantiti kedudukan negatif dikembalikan. Tujuan ini adalah untuk memudahkan pengiraan logik kedudukan pembukaan dan penutupan.
function trade() {
var myData = data(); //Execute data function
if (!myData) {
return;
}
var mp = positions(contractType); //Get position information
var myAmount = mp.amount; //Get the number of positions
var myProfit = mp.profit; //Get floating profit and loss
if (myAmount > 0 && myData.close < myData.ll) {
p.Cover(contractType, unit); //close long position
}
if (myAmount < 0 && myData.close > myData.hh) {
p.Cover(contractType, unit); //close short position
}
if (myAmount == 0) {
if (myData.barRatio > openValve) {
p.OpenLong(contractType, unit); //open long position
} else if (myData.barRatio < 1 / openValve) {
p.OpenShort(contractType, unit); //open short position
}
}
}
Beberapa parameter teras: Model ini mempunyai idea reka bentuk yang jelas, dengan hanya tiga parameter teras. Ruang pengoptimuman kecil, dan pemasangan berlebihan dapat dielakkan dengan berkesan. Keseluruhan yang kuat: Strategi ini mudah dalam logik dan mempunyai keseluruhan yang tinggi. Ia boleh disesuaikan dengan kebanyakan jenis kecuali produk pertanian dan boleh digabungkan dengan pelbagai jenis.
Menambah syarat-syarat kedudukan pegangan: aliran dana satu hala (pasaran saham) boleh menentukan aliran masuk atau keluar dana berdasarkan faktor-faktor seperti turun naik harga dan jumlah dagangan.
Menambah keadaan penyimpangan standard: hanya bergantung pada aliran dana sebagai syarat untuk membuka kedudukan, mungkin terdapat isyarat palsu yang kerap, mengakibatkan pembukaan dan penutupan kedudukan yang kerap. Menapis isyarat palsu dengan mengira nilai purata aliran keluar bersih dana dalam masa yang ditentukan dan menambah penyimpangan standard ke atas dan ke bawah.
/*backtest
start: 2016-01-01 09:00:00
end: 2019-12-31 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
var p = $.NewPositionManager(); //Call commodity futures trading library
//Holding Position data processing
function positions(name) {
var self = {};
var mp = _C(exchange.GetPosition); //Get positions
if (mp.length == 0) {
self.amount = 0;
}
for (var i = 0; i < mp.length; i++) { //Holding Position data processing
if (mp[i].ContractType == name) {
if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
self.amount = mp[i].Amount;
} else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
self.amount = -mp[i].Amount;
}
self.profit = mp[i].Profit;
} else {
self.amount = 0;
}
}
return self;
}
//Market data processing function
function data() {
var self = {};
var barVol = [];
var bars = _C(exchange.GetRecords); //Get K line bar data
if (bars.length < len * 2) { //Control the length of the K line bar data array
return;
}
for (var i = len; i > 0; i--) {
var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
if (barSub_1 > 0) { //If the price rises, add a positive number to the array
barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
} else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
}
}
if (barVol.length > len) {
barVol.shift(); //Free up excess data
}
self.barIn = 0;
self.barOut = 0;
for (var v = 0; v < barVol.length; v++) {
if (barVol[v] > 0) {
self.barIn += barVol[v]; //Consolidate all active inflows funds
} else {
self.barOut -= barVol[v]; //Consolidate all active outflow funds
}
}
self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
bars.pop(); //Delete unfinished K line bar data
self.close = bars[bars.length - 1].Close; //Get the closing price of the last K line bar
self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
return self;
}
//Trading function
function trade() {
var myData = data(); //Execute data function
if (!myData) {
return;
}
var mp = positions(contractType); //Get position information
var myAmount = mp.amount; //Get the number of positions
var myProfit = mp.profit; //Get floating profit and loss
if (myAmount > 0 && myData.close < myData.ll) {
p.Cover(contractType, unit); //close long position
}
if (myAmount < 0 && myData.close > myData.hh) {
p.Cover(contractType, unit); //close short position
}
if (myAmount == 0) {
if (myData.barRatio > openValve) {
p.OpenLong(contractType, unit); //open long position
} else if (myData.barRatio < 1 / openValve) {
p.OpenShort(contractType, unit); //open short position
}
}
}
//The main entrance of the program, start from here
function main() {
while (true) { //Enter the loop
if (exchange.IO("status")) { //If it is the market opening time
_C(exchange.SetContractType, contractType); //Subscription contract
trade(); //Execute trade function
}
}
}
Alamat strategi:https://www.fmz.com/strategy/87698
Konfigurasi strategi:
Prestasi ujian belakang:
Melalui pemodelan, artikel ini menggunakan data bar garis K niaga hadapan komoditi yang disediakan oleh platform perdagangan FMZ untuk mewujudkan model aliran modal bersih melalui pengumpulan data, analisis yang berkaitan, dan teknologi ramalan.
Perlu diperhatikan bahawa aliran dana yang dirujuk dalam artikel ini merujuk kepada aliran dana yang aktif. Ia merujuk kepada kekuatan penjual dan pembeli di pasaran, bukan masuk atau keluar dana. Menghakimi harga masa depan dengan menganalisis tingkah laku pembeli dan penjual di pasaran tidak mempunyai kepentingan rujukan jangka pendek.