Perdagangan frekuensi tinggi adalah bidang yang menantang dan kompetitif yang bergantung pada eksekusi perdagangan yang cepat dan wawasan sensitif tentang mikrostruktur pasar. Salah satu strategi yang terkenal adalah Penny Jump, yang berfokus pada mengeksploitasi
Di pasar saham,
Sebagai contoh, misalkan kedalaman awal pasar saham adalah seperti ini: 200 ∙ $1.01 x $1.03 ∙ 200. Kemudian seekor gajah masuk dan menempatkan pesanan untuk membeli 3000 saham dengan harga $1.01 masing-masing. Pada titik ini, kedalaman pasar akan berubah menjadi 3.200 ∙ $1.01 x $1.03 ∙ 200. Tindakan ini seperti memperkenalkan seekor gajah, yang menjadi fokus peserta lain di pasar.
Pasar yang kompetitif Untuk pedagang frekuensi tinggi, keuntungan mereka terutama berasal dari analisis mikrostruktur pasar untuk berspekulasi tentang niat pedagang lain. Setelah pemain besar muncul, pedagang frekuensi tinggi akan membangun posisi dengan cepat untuk menangkap fluktuasi harga kecil. Tujuan mereka adalah untuk berdagang sering dalam waktu singkat dan mengumpulkan keuntungan kecil tetapi kumulatif.
Dilemma Gajah Meskipun gajah mungkin ingin beroperasi dalam skala besar di pasar, tindakan mereka juga mengungkapkan niat perdagangan mereka, menjadikannya target untuk pedagang frekuensi tinggi. Pedagang frekuensi tinggi mencoba untuk menetapkan posisi sebelumnya dan kemudian mendapatkan keuntungan dari fluktuasi harga. Kehadiran gajah di pasar dapat memicu reaksi di pasar yang kompetitif, sehingga mempengaruhi strategi perdagangan mereka.
Kecurangan di Pasar Pada kenyataannya, investor institusional besar biasanya tidak menempatkan sejumlah besar pesanan beli atau jual di pasar secara terang-terangan, karena perilaku seperti itu dapat menyebabkan peserta lain di pasar untuk mengambil tindakan balas atau bahkan memanipulasi pasar.
Gagasan inti dari strategi Penny Jump adalah bahwa setelah
Tidak hanya itu, tetapi pedagang frekuensi tinggi juga dapat menghasilkan keuntungan setelah membeli bahkan jika harga tidak naik, karena mereka tahu bahwa pemain besar telah mendukung harga dasar; oleh karena itu mereka dapat dengan cepat menjual saham mereka ke pemain besar ini dan mendapatkan keuntungan arbitrage kecil.
Kode sumber strategi:https://www.fmz.com/strategy/358
Kode strategi yang diberikan di atas adalah contoh, yang digunakan untuk menerapkan strategi Penny Jump. Di bawah ini adalah penjelasan rinci tentang kode, yang memungkinkan pemula untuk memahami bagaimana cara kerjanya:
var Counter = {
i: 0,
w: 0,
f: 0
};
// Variables
var InitAccount = null;
function CancelAll() {
while (true) {
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
break;
}
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
}
Sleep(Interval);
}
}
function updateStatus(msg) {
LogStatus("Number of debugging sessions:", Counter.i, "succeeded:", Counter.w, "failed:", Counter.f, "\n"+msg+"#0000ff\n"+new Date());
}
function main() {
if (DisableLog) {
EnableLog(false);
}
CancelAll();
InitAccount = _C(exchange.GetAccount);
Log(InitAccount);
var i = 0;
var locks = 0;
while (true) {
Sleep(Interval);
var depth = _C(exchange.GetDepth);
if (depth.Asks.length === 0 || depth.Bids.length === 0) {
continue;
}
updateStatus("Searching within the elephant... Buy one: " + depth.Bids[0].Price + ", Sell one:" + depth.Asks[0].Price + ", Lock times: " + locks);
var askPrice = 0;
for (i = 0; i < depth.Asks.length; i++) {
if (depth.Asks[i].Amount >= Lot) {
askPrice = depth.Asks[i].Price;
break;
}
}
if (askPrice === 0) {
continue;
}
var elephant = null;
// skip Bids[0]
for (i = 1; i < depth.Bids.length; i++) {
if ((askPrice - depth.Bids[i].Price) > ElephantSpace) {
break;
}
if (depth.Bids[i].Amount >= ElephantAmount) {
elephant = depth.Bids[i];
break;
}
}
if (!elephant) {
locks = 0;
continue;
}
locks++;
if (locks < LockCount) {
continue;
}
locks = 0;
updateStatus("Debug the elephant... The elephant is in gear " + i + ", " + JSON.stringify(elephant));
exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant);
var ts = new Date().getTime();
while (true) {
Sleep(CheckInterval);
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
break;
}
if ((new Date().getTime() - ts) > WaitInterval) {
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
}
}
}
var account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
Counter.f++;
Counter.i++;
continue;
}
updateStatus("Successful payment: " + opAmount +", Start taking action...");
exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);
var success = true;
while (true) {
var depth = _C(exchange.GetDepth);
if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price-(STTick*PennyTick))) {
success = false;
updateStatus("Didn't get it, start to stop loss, currently buying one: " + depth.Bids[0].Price);
CancelAll();
account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
break;
}
exchange.Sell(depth.Bids[0].Price, opAmount);
}
var orders = _C(exchange.GetOrders);
if (orders.length === 0) {
break;
}
Sleep(CheckInterval);
}
if (success) {
Counter.w++;
} else {
Counter.f++;
}
Counter.i++;
var account = _C(exchange.GetAccount);
LogProfit(account.Balance - InitAccount.Balance, account);
}
}
Aku akan menganalisis kode strategi yang diberikan baris demi baris untuk membantu Anda memahami operasinya secara rinci.
var Counter = {
i: 0,
w: 0,
f: 0
};
Kode ini menginisialisasi objek bernama Counter, yang digunakan untuk melacak informasi statistik perdagangan strategi.
Atribut ini akan dicatat dan diperbarui selama proses pelaksanaan strategi.
var InitAccount = null;
Baris kode ini menginisialisasi variabel bernama InitAccount, yang akan menyimpan informasi akun ketika strategi mulai dijalankan.
function CancelAll() {
while (true) {
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
break;
}
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
}
Sleep(Interval);
}
}
Ini adalah fungsi bernamaCancelAll()
, tujuannya adalah untuk membatalkan semua pesanan yang belum terpenuhi di pasar. Mari kita jelaskan fungsinya langkah demi langkah:
while (true)
: Ini adalah loop tak terbatas, itu akan terus berjalan sampai tidak ada pesanan yang belum selesai.var orders = _C(exchange.GetOrders)
: Baris kode ini menggunakan fungsi exchange.GetOrders untuk mengambil semua pesanan yang sedang menunggu di rekening current dan menyimpannya di variabel order.if (orders.length == 0)
: Baris kode ini memeriksa untuk setiap pesanan yang belum selesai. Jika panjang array pesanan adalah 0, itu berarti tidak ada pesanan yang belum selesai dan loop akan terganggu (pecah).for (var i = 0; i < orders.length; i++)
: Ini adalah loop for yang berulang melalui semua perintah yang belum selesai.exchange.CancelOrder(orders[i].Id)
: Baris kode ini menggunakan fungsi exchange.CancelOrder() untuk membatalkan setiap pesanan dengan IDnya.Sleep(Interval)
: Baris kode ini memperkenalkan masa tunggu, berhenti untuk jangka waktu tertentu (dalam milidetik), untuk memastikan bahwa operasi pembatalan pesanan tidak terlalu sering.Baris kode ini memperkenalkan masa tunggu, berhenti untuk jangka waktu tertentu (dalam milidetik), untuk memastikan bahwa operasi pembatalan pesanan tidak terlalu sering.
function updateStatus(msg) {
LogStatus("Number of debugging sessions:", Counter.i, "succeeded:", Counter.w, "failed:", Counter.f, "\n" + msg + "#0000ff\n" + new Date());
}
Ini adalah fungsi bernamaupdateStatus(msg)
, yang digunakan untuk memperbarui dan mencatat informasi status transaksi. Ini menerima parameter msg, yang biasanya berisi informasi tentang status pasar saat ini. Operasi spesifik fungsi ini meliputi:
MenggunakanLogStatus()
fungsi untuk merekam informasi yang ditampilkan di bilah status selama pelaksanaan strategi.
Peraturanmsg
parameter yang berisi informasi tentang kondisi pasar saat ini.
Stempel waktu saat ini (new Date()
) dilampirkan untuk menampilkan informasi waktu.
Tujuan dari fungsi ini adalah untuk merekam dan memperbarui informasi status transaksi untuk pemantauan dan analisis selama pelaksanaan strategi.
function main() {
if (DisableLog) {
EnableLog(false);
}
CancelAll();
InitAccount = _C(exchange.GetAccount);
Log(InitAccount);
var i = 0;
var locks = 0;
while (true) {
Sleep(Interval);
var depth = _C(exchange.GetDepth);
if (depth.Asks.length === 0 || depth.Bids.length === 0) {
continue;
}
updateStatus("Searching within the elephant... Buy one: " + depth.Bids[0].Price + ", Sell one:" + depth.Asks[0].Price + ", Lock times: " + locks);
var askPrice = 0;
for (i = 0; i < depth.Asks.length; i++) {
if (depth.Asks[i].Amount >= Lot) {
askPrice = depth.Asks[i].Price;
break;
}
}
if (askPrice === 0) {
continue;
}
var elephant = null;
// skip Bids[0]
for (i = 1; i < depth.Bids.length; i++) {
if ((askPrice - depth.Bids[i].Price) > ElephantSpace) {
break;
}
if (depth.Bids[i].Amount >= ElephantAmount) {
elephant = depth.Bids[i];
break;
}
}
if (!elephant) {
locks = 0;
continue;
}
locks++;
if (locks < LockCount) {
continue;
}
locks = 0;
updateStatus("Debug the elephant... The elephant is in gear " + i + ", " + JSON.stringify(elephant));
exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant);
var ts = new Date().getTime();
while (true) {
Sleep(CheckInterval);
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
break;
}
if ((new Date().getTime() - ts) > WaitInterval) {
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
}
}
}
var account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
Counter.f++;
Counter.i++;
continue;
}
updateStatus("Successful payment: " + opAmount +", Start taking action...");
exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);
var success = true;
while (true) {
var depth = _C(exchange.GetDepth);
if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price-(STTick*PennyTick))) {
success = false;
updateStatus("Didn't get it, start to stop loss, currently buying one: " + depth.Bids[0].Price);
CancelAll();
account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
break;
}
exchange.Sell(depth.Bids[0].Price, opAmount);
}
var orders = _C(exchange.GetOrders);
if (orders.length === 0) {
break;
}
Sleep(CheckInterval);
}
if (success) {
Counter.w++;
} else {
Counter.f++;
}
Counter.i++;
var account = _C(exchange.GetAccount);
LogProfit(account.Balance - InitAccount.Balance, account);
}
}
Ini adalah fungsi eksekusi utamamain()
Mari kita jelaskan operasinya baris demi baris:
if (DisableLog)
: Baris kode ini memeriksa apakah variabel DisableLog benar, dan jika demikian, itu akan menonaktifkan rekaman log. Ini untuk memastikan bahwa log yang tidak perlu tidak dicatat oleh strategi.
CancelAll()
: Panggil fungsi CancelAll( yang dijelaskan sebelumnya untuk memastikan bahwa tidak ada pesanan yang belum selesai.
InitAccount = _C(exchange.GetAccount)
: Baris kode ini mengambil informasi akun saat ini dan menyimpannya dalam variabel InitAccount. Ini akan digunakan untuk merekam status akun ketika strategi mulai dijalankan.
var i = 0;
danvar locks = 0;
: Inisialisasi dua variabel, i dan kunci, yang akan digunakan dalam logika strategi berikutnya.
while (true)
: Ini adalah loop tak terbatas, terutama digunakan untuk eksekusi strategi terus menerus.
Selanjutnya, kita akan menjelaskan logika strategi utama dalamwhile (true)
lingkaran baris demi baris.
while (true) {
Sleep(Interval);
var depth = _C(exchange.GetDepth);
if (depth.Asks.length === 0 || depth.Bids.length === 0) {
continue;
}
updateStatus("Searching within the elephant... Buy one: " + depth.Bids[0].Price + ", Sell one:" + depth.Asks[0].Price + ", Lock times: " + locks);
Sleep(Interval)
: Baris kode ini memungkinkan strategi untuk tidur untuk jangka waktu tertentu, untuk mengontrol frekuensi pelaksanaan strategi. Parameter Interval mendefinisikan interval tidur (dalam milidetik).
var depth = _C(exchange.GetDepth)
: Dapatkan informasi kedalaman pasar saat ini, termasuk harga dan jumlah pesanan jual dan pesanan beli Informasi ini akan disimpan dalam variabel kedalaman.
if (depth.Asks.length === 0 || depth.Bids.length === 0)
: Baris kode ini memeriksa informasi kedalaman pasar, memastikan bahwa baik pesanan jual dan pesanan beli ada. Jika salah satunya tidak ada, ini menunjukkan bahwa pasar mungkin tidak memiliki informasi perdagangan yang cukup, sehingga strategi akan terus menunggu.
updateStatus("Searching within the elephant... Buy one: " + depth.Bids[0].Price + ", Sell one:" + depth.Asks[0].Price + ", Lock times: " + locks)
: Baris kode ini memanggil fungsi updateStatus untuk memperbarui informasi status strategi.
var askPrice = 0;
for (i = 0; i < depth.Asks.length; i++) {
if (depth.Asks[i].Amount >= Lot) {
askPrice = depth.Asks[i].Price;
break;
}
}
if (askPrice === 0) {
continue;
}
var elephant = null;
var askPrice = 0;
: Inisialisasi variabel askPrice, itu akan digunakan untuk menyimpan harga pesanan jual yang memenuhi kondisi.
for (i = 0; i < depth.Asks.length; i++)
: Ini adalah loop for yang digunakan untuk melintasi informasi harga dan kuantitas pesanan jual pasar.
if (depth.Asks[i].Amount >= Lot)
: Dalam loop, periksa apakah jumlah setiap order jual lebih besar atau sama dengan Lot yang ditentukan (penghitungan tangan). Jika demikian, simpan harga order jual itu di askPrice dan selesaikan loop.
if (askPrice === 0)
: Jika tidak ada pesanan jual yang memenuhi kondisi yang ditemukan (askPrice masih 0), strategi akan terus menunggu dan melewatkan operasi berikutnya.
var elephant = null;
: Inisialisasi variabel gajah, itu akan digunakan untuk menyimpan informasi pesanan beli yang diidentifikasi sebagai
for (i = 1; i < depth.Bids.length; i++) {
if ((askPrice - depth.Bids[i].Price) > ElephantSpace) {
break;
}
if (depth.Bids[i].Amount >= ElephantAmount) {
elephant = depth.Bids[i];
break;
}
}
if (!elephant) {
locks = 0;
continue;
}
locks++;
if (locks < LockCount) {
continue;
}
locks = 0;
Lanjutkan untuk menelusuri informasi harga dan kuantitas pesanan beli pasar, melewatkan pesanan beli pertama (Pendawaran[0]).
if ((askPrice - depth.Bids[i].Price) > ElephantSpace)
: Periksa apakah kesenjangan antara harga penawaran saat ini dan askPrice lebih besar dari ElephantSpace. Jika demikian, ini menunjukkan bahwa itu cukup jauh dari
if (depth.Bids[i].Amount >= ElephantAmount)
: Periksa apakah jumlah pesanan beli saat ini lebih besar atau sama dengan ElephantAmount. Jika demikian, simpan informasi pesanan beli dalam variabel elephant.
if (!elephant)
: Jika
locks++
: Jika
if (locks < LockCount)
: Periksa apakah jumlah waktu penguncian telah memenuhi persyaratan (LockCount). Jika tidak, terus menunggu.
updateStatus("Debug the elephant... The elephant is in gear " + i + ", " + JSON.stringify(elephant));
exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant);
var ts = new Date().getTime();
while (true) {
Sleep(CheckInterval);
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
break;
}
if ((new Date().getTime() - ts) > WaitInterval) {
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
}
}
}
updateStatus("Debug the elephant... The elephant is in gear " + i + ", " + JSON.stringify(elephant))
: Panggilan fungsi updateStatus untuk mencatat status strategi saat ini, termasuk posisi gigi dari
exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant)
: Gunakan fungsi exchange.Buy untuk membeli
var ts = new Date().getTime()
: Dapatkan timestamp dari waktu saat ini untuk perhitungan interval waktu berikutnya.
while (true)
: Masukkan loop tak terbatas baru, digunakan untuk menunggu eksekusi
Sleep(CheckInterval)
: Strategi tidur untuk sementara waktu untuk mengontrol frekuensi memeriksa status pesanan.
var orders = _C(exchange.GetOrders)
: Dapatkan semua informasi pesanan dari rekening current.
if (orders.length == 0)
: Periksa apakah ada pesanan yang belum selesai, jika tidak, putus lingkaran.
(new Date().getTime() - ts) > WaitInterval
: Menghitung interval waktu antara waktu saat ini dan ketika
for (var i = 0; i < orders.length; i++)
Periksa semua pesanan yang belum selesai.
exchange.CancelOrder(orders[i].Id)
: Gunakan fungsi exchange.CancelOrder untuk membatalkan setiap pesanan yang belum selesai.
var account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
Counter.f++;
Counter.i++;
continue;
}
updateStatus("Successful payment: " + opAmount + ", Start taking action...");
exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);
var success = true;
while (true) {
var depth = _C(exchange.GetDepth);
if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price - (STTick * PennyTick))) {
success = false;
updateStatus("Didn't get it, start to stop loss, currently buying one: " + depth.Bids[0].Price);
CancelAll();
account = _C(exchange.GetAccount);
var opAmount = _N(account.Stocks - InitAccount.Stocks);
if (opAmount < 0.001) {
break;
}
exchange.Sell(depth.Bids[0].Price, opAmount);
}
var orders = _C(exchange.GetOrders);
if (orders.length === 0) {
break;
}
Sleep(CheckInterval);
}
if (success) {
Counter.w++;
} else {
Counter.f++;
}
Counter.i++;
var account = _C(exchange.GetAccount);
LogProfit(account.Balance - InitAccount.Balance, account);
}
var account = _C(exchange.GetAccount)
: Mendapatkan informasi rekening current.
var opAmount = _N(account.Stocks - InitAccount.Stocks)
: Hitung perubahan aset akun setelah membeli
updateStatus("Successful payment: " + opAmount + ", Start taking action...")
: Catat informasi pembelian
exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount)
: Gunakan fungsi exchange.Sell untuk menjual
Masukkan loop tak terbatas baru, digunakan untuk menunggu eksekusi pesanan jual.
var depth = _C(exchange.GetDepth)
: Dapatkan informasi pasar yang mendalam.
if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price - (STTick * PennyTick)))
: Periksa informasi kedalaman pasar, jika harga pasar telah turun ke level stop-loss, kemudian eksekusi operasi stop-loss.
CancelAll()
: Panggil fungsi CancelAll( untuk membatalkan semua pesanan yang belum selesai, untuk menghindari risiko posisi.
if (opAmount < 0.001)
: Periksa jumlah pembelian lagi, jika kurang dari 0,001, itu menunjukkan bahwa pembelian telah gagal, keluar dari lingkaran.
exchange.Sell(depth.Bids[0].Price, opAmount)
: Melakukan operasi stop loss, menjual aset yang tersisa dengan harga terendah pasar saat ini.
Akhirnya, perbarui jumlah transaksi yang berhasil dan gagal berdasarkan apakah transaksi itu berhasil atau tidak, dan catat keuntungan perdagangan.
Ini adalah penjelasan baris demi baris dari seluruh strategi. Ide inti dari strategi ini adalah untuk menemukan
Secara umum, strategi ini adalah strategi perdagangan frekuensi tinggi yang bertujuan untuk memanfaatkan informasi kedalaman pasar untuk mengidentifikasi pesanan beli besar dan melakukan transaksi beli dan jual dalam waktu singkat. Ini membutuhkan pemantauan terus-menerus pasar dan pelaksanaan operasi beli dan jual untuk dengan cepat mendapatkan keuntungan kecil. Namun, ini juga merupakan strategi berisiko tinggi, karena membutuhkan respons cepat terhadap fluktuasi pasar sambil mempertimbangkan manajemen risiko dan mekanisme stop-loss untuk menghindari kerugian yang signifikan.
Harap dicatat bahwa strategi ini didasarkan pada pasar dan platform perdagangan tertentu. Untuk pasar dan bursa yang berbeda, penyesuaian dan optimalisasi yang sesuai mungkin diperlukan. Dalam penerapan praktis, investor perlu dengan hati-hati menguji dan mengevaluasi kinerja strategi untuk memastikannya selaras dengan tujuan investasi dan toleransi risiko mereka.
Saat Anda terus menjalankan strategi, itu akan berulang kali melakukan operasi berikut:
Pertama, strategi akan memeriksa informasi mendalam pasar untuk memahami situasi saat ini dari pesanan jual dan pesanan beli.
Selanjutnya, strategi akan mencoba untuk menemukan pesanan jual yang memenuhi kriteria, khususnya pesanan jual dengan jumlah yang lebih besar dari atau sama dengan Lot.
Kemudian, strategi akan terus mencari
Jika jumlah
Seluruh strategi secara terus menerus melakukan operasi di atas untuk menangkap
Strategi Penny Jump adalah contoh khas dalam perdagangan frekuensi tinggi, menunjukkan permainan halus dan persaingan di antara peserta pasar. Strategi ini sangat menonjol di pasar cryptocurrency karena fluktuasinya yang besar, di mana investor institusional dan pedagang frekuensi tinggi semuanya mengejar keuntungan cepat. Namun, ini juga membuat pasar penuh tantangan, yang membutuhkan adaptasi dan penyesuaian strategi yang konstan untuk mempertahankan keunggulan kompetitif.