Harga naik atau turun. dalam jangka panjang, probabilitas kenaikan dan penurunan harga harus 50%, jadi untuk memprediksi harga masa depan dengan benar, Anda perlu mendapatkan semua faktor yang mempengaruhi harga secara real time, dan kemudian memberi setiap faktor bobot yang benar, dan akhirnya melakukan analisis obyektif dan rasional. untuk mencantumkan semua faktor yang mempengaruhi harga, mungkin mengisi seluruh alam semesta.
Dijumlahkan sebagai: lingkungan ekonomi global, kebijakan makro nasional, kebijakan industri terkait, hubungan penawaran dan permintaan, peristiwa internasional, suku bunga dan nilai tukar, inflasi dan deflasi, psikologi pasar, dan faktor yang tidak diketahui lainnya, dll. Prediksi telah menjadi tugas yang sangat besar dan tidak mungkin. Jadi sejak awal, saya mengerti bahwa pasar tidak dapat diprediksi. Kemudian semua prediksi di pasar telah menjadi hipotesis, dan perdagangan telah menjadi permainan probabilitas, yang menarik.
Karena pasar tidak dapat diprediksi, apakah itu benar-benar acuh tak acuh? Tidak, semua faktor makro dan mikro telah tercermin dalam harga, yang berarti bahwa harga adalah hasil dari interaksi semua faktor. Kita hanya perlu menganalisis harga untuk membuat strategi perdagangan yang lengkap.
Pikirkan dulu, mengapa harga naik?
Anda mungkin mengatakan, karena: negara mendukung kebijakan industri yang relevan, negara asal hujan deras, perang perdagangan internasional, MACD Golden Fork dibeli, orang lain telah membelinya, dll.
Pada kenyataannya, kenaikan dan penurunan harga mirip dengan pasang surut. kenaikan harga tidak dapat dipisahkan dari promosi dana. di pasar, jika ada lebih banyak pembeli daripada penjual, harga akan naik. sebaliknya, jika ada lebih banyak penjual daripada pembeli, harga akan turun. Dengan konsep ini, kita dapat memberikan harapan yang wajar untuk tren harga di masa depan berdasarkan hubungan penawaran dan permintaan yang tercermin dalam arus bersih dana.
Berbeda dengan analisis aliran dana tradisional, analisis aliran dana menganalisis transaksi mana yang merupakan arus masuk aktif dana dan transaksi mana yang merupakan arus keluar aktif dana berdasarkan data transaksi selama periode waktu tertentu. Kemudian, dengan mengurangi volume arus keluar aktif dari volume arus masuk aktif selama periode ini, kita dapat mengetahui arus masuk bersih dana selama periode ini. Jika arus masuk bersih dana positif, itu berarti pasokan produk ini kekurangan; jika arus keluar bersih dana berarti pasokan produk ini kelebihan.
Setelah membaca ini, beberapa orang mungkin bertanya-tanya bahwa dalam transaksi yang sebenarnya, kesepakatan hanya akan dibuat ketika seseorang membeli dan seseorang menjual. Pesanan transaksi harus memiliki volume penjualan sebanyak volume pembelian, dan dana harus masuk dan keluar dari jumlah yang sama. Dari mana aliran masuk dan keluar modal berasal? Sebenarnya, secara ketat, setiap pesanan beli harus sesuai dengan pesanan jual yang sesuai, dan aliran masuk dan aliran keluar modal harus sama. Jika kita ingin menghitung pesanan mana yang secara aktif dibeli dan pesanan mana yang secara aktif dijual, kita hanya dapat menggunakan metode kompromi, menggunakan data bar garis K, berdasarkan volume dan harga transaksi.
Perubahan aliran dana secara akurat sesuai dengan perilaku pasar real-time, dan arus bersih dana dihitung secara real-time dengan mengintegrasikan data garis k. Ada dua algoritma untuk menghitung arus aktif dana:
Pertama, jika harga transaksi saat ini dari pesanan saat ini dilaksanakan pada harga counterparty atau dengan harga yang lebih tinggi, harga transaksi pembelian >= harga transaksi penjualan, yang berarti bahwa pembeli lebih bersedia untuk menyelesaikan transaksi dengan harga yang lebih tinggi, yang termasuk dalam arus masuk dana aktif.
Kedua, jika harga transaksi saat ini > harga transaksi terakhir, maka dapat dipahami bahwa volume transaksi saat ini secara aktif mendorong kenaikan harga, yang termasuk dalam arus masuk dana yang 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 volume transaksi antara 10:00 dan 11:00 sebagai arus masuk modal aktif. Jika tidak, itu termasuk dalam arus keluar dana inisiatif. Artikel ini didasarkan pada metode kedua, menambahkan faktor volatilitas harga. Dengan membandingkan harga penutupan garis k sebelum dan sesudahnya, volume kenaikan atau penurunan k garis bar * volatilitas dimasukkan dalam urutan, dan kemudian lebih lanjut sesuai dengan urutan Menghitung rasio arus masuk dana aktif.
Artikel ini menjelaskan arus dana di pasar berjangka dari perspektif
Harga naik dan arus masuk bersih aktif dana per satuan waktu: situasi ini kuat, dan harga di masa depan akan terus naik lebih mungkin;
Harga saham naik, dan arus keluar bersih aktif dana per satuan waktu: Dalam hal ini, itu adalah posisi yang sedang kuat, dan tingkat kenaikan harga di masa depan akan sangat berkurang;
Harga saham turun, sementara arus masuk bersih aktif dana per unit waktu: ini adalah situasi yang lemah, dan harga masa depan terus turun lebih mungkin;
Harga saham jatuh, dan pada saat yang sama arus keluar bersih aktif dana per unit waktu: dalam hal ini, itu adalah posisi yang lemah secara moderat, dan tingkat penurunan harga di masa depan akan sangat berkurang;
Rendah sebelumnya (ll) Tingkat tertinggi sebelumnya (hh) Pembelian aktif (barIn) Penjualan aktif (barOut) Rasio arus masuk dana aktif terhadap arus keluar dana aktif (barRatio) Batas posisi pembukaan (openValve) Posisi penyimpanan saat ini (myAmount) Harga penutupan K-line terakhir (penutupan)
Strategi perdagangan kuantitatif yang baik tidak hanya membutuhkan pengembalian yang stabil, tetapi juga kemampuan untuk mengendalikan risiko dan menghindari kerugian besar ketika ada kemungkinan kecil.
Pembukaan posisi panjang: jika tidak ada posisi ditahan saat ini, dan barRatio > openValve, buka posisi panjang;
Pembukaan posisi pendek: jika tidak ada posisi ditahan saat ini dan barRatio < 1 / openValve, buka posisi pendek;
Penutupan posisi panjang: Jika posisi panjang saat ini dipegang dan ditutup < ll, jual dan tutup posisi panjang;
Penutupan posisi pendek: Jika posisi pendek saat ini dipegang dan ditutup > hh, beli dan tutup posisi pendek;
Mendapatkan dan menghitung 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 garis K langsung melaluiGetRecords
Metode dalam API FMZ. Mengandung harga tertinggi, harga terendah, harga pembukaan, harga penutupan, volume, dan timestamp standar. Jika harga transaksi terbaru lebih besar dari harga transaksi terakhir, maka volume transaksi terbaru * (harga tertinggi-harga terendah) dimasukkan ke dalam pembelian aktif; jika harga transaksi terbaru lebih rendah dari harga transaksi terakhir, maka volume terbaru * (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 posisi dasar melaluiGetPosition
Jika posisi panjang saat ini dipegang, maka kuantitas posisi positif dikembalikan; jika posisi saat ini pendek, maka kuantitas posisi negatif dikembalikan. Tujuan ini adalah untuk memfasilitasi perhitungan logika posisi 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 inti: Model ini memiliki ide desain yang jelas, dengan hanya tiga parameter inti. Keseragaman yang kuat: Strategi ini sederhana dalam logika dan memiliki keseragaman yang tinggi.
Menambahkan kondisi posisi kepemilikan: arus dana pasar saham satu arah dapat menentukan arus masuk atau keluar dana berdasarkan faktor-faktor seperti fluktuasi harga dan volume perdagangan.
Menambahkan kondisi standar deviasi: hanya mengandalkan arus dana sebagai kondisi untuk membuka posisi, mungkin ada sinyal palsu yang sering, menghasilkan pembukaan dan penutupan posisi yang sering.
/*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:
Kinerja uji balik:
Melalui pemodelan, artikel ini menggunakan data batang garis K komoditas berjangka yang disediakan oleh platform perdagangan FMZ untuk membangun model arus modal bersih melalui pengumpulan data, analisis terkait, dan teknologi prediksi.
Perlu dicatat bahwa arus dana yang disebutkan dalam artikel ini mengacu pada arus dana yang aktif. Ini mengacu pada kekuatan penjual dan pembeli di pasar, bukan masuk atau keluar dana.