avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Analisis Strategi Perdagangan Frekuensi Tinggi - Penny Jump

Dibuat di: 2023-11-03 17:36:56, diperbarui pada: 2023-11-03 22:19:32
comments   0
hits   2877

Analisis Strategi Perdagangan Frekuensi Tinggi - Penny Jump

Perdagangan frekuensi tinggi adalah bidang yang menantang dan kompetitif yang bergantung pada eksekusi perdagangan yang cepat dan wawasan sensitif terhadap struktur mikro pasar. Salah satu strategi yang banyak mendapat perhatian adalah Penny Jump, yang berfokus pada pemanfaatan “gajah” di pasar untuk menghasilkan keuntungan kecil namun sering. Dalam artikel ini, kami akan menjelaskan secara rinci cara kerja strategi Penny Jump sambil menyelami detail kode strategi sehingga pemula dapat memahami cara kerjanya.

Memahami Strategi Penny Jump

Di pasar saham, “gajah” biasanya adalah investor institusional yang ingin membeli atau menjual saham dalam jumlah besar tetapi tidak mau berdagang pada harga pasar. Sebaliknya, mereka memilih untuk menempatkan sejumlah besar limit order, juga dikenal sebagai pending order, di pasar untuk menunjukkan niat mereka. Perilaku ini telah menarik perhatian luas di pasar karena transaksi besar dapat berdampak signifikan pada pasar.

Misalnya, kedalaman pasar suatu saham awalnya tampak seperti ini: 200 | \(1,01 x \)1,03 | 200. Kemudian, seekor “gajah” datang dan memesan untuk membeli 3.000 saham pada harga \(1,01. Pada titik ini, kedalaman pasar akan menjadi 3.200 | \)1,01 x $1,03 | 200. Tindakan ini seperti memperkenalkan “gajah” yang menjadi fokus peserta lain di pasar.

  • Pasar Kompetitif Bagi pedagang frekuensi tinggi, keuntungan mereka terutama berasal dari analisis struktur mikro pasar untuk menyimpulkan niat pedagang lain. Begitu seekor gajah muncul, pedagang frekuensi tinggi akan segera membentuk posisi untuk menangkap fluktuasi harga kecil. Sasaran mereka adalah melakukan perdagangan rutin dalam jangka waktu pendek, mengumpulkan laba kecil namun kumulatif.

  • Nasib gajah Meskipun gajah mungkin ingin beroperasi dalam skala besar di pasar, tindakan mereka juga mengkhianati niat berdagang mereka, yang membuat mereka menjadi sasaran pedagang frekuensi tinggi. Pedagang frekuensi tinggi mencoba menetapkan posisi terlebih dahulu dan kemudian mengambil untung dari fluktuasi harga. Kehadiran seekor gajah di pasar dapat memicu reaksi di pasar kompetitif, sehingga memengaruhi strategi perdagangannya.

  • Penipuan di pasar Pada kenyataannya, investor institusional besar biasanya tidak secara terang-terangan menempatkan sejumlah besar pesanan beli atau jual di pasar, karena perilaku tersebut dapat menyebabkan pelaku pasar lain mengambil tindakan balasan atau bahkan memanipulasi pasar. Oleh karena itu, mereka mungkin mengadopsi strategi untuk menciptakan kesan palsu guna menarik pedagang frekuensi tinggi untuk memasuki pasar, dan kemudian dengan cepat menjual atau membeli untuk mendapatkan keuntungan dari fluktuasi harga.

Ide inti dari strategi Penny Jump

Ide inti dari strategi Penny Jump adalah bahwa begitu seekor gajah muncul di pasar dan mendukung harga tertentu (misalnya, \(1,01), pedagang frekuensi tinggi akan dengan cepat meningkatkan tawaran mereka sebesar satu sen, misalnya menjadi \)1,02. Hal ini karena pedagang frekuensi tinggi memahami bahwa kemunculan seekor gajah berarti ada dukungan beli yang kuat pada tingkat harga tersebut, jadi mereka mencoba mengikutinya dengan harapan harga akan naik. Ketika harga naik menjadi \(1,03 x \)1,05, pedagang frekuensi tinggi dapat dengan cepat menjual, memperoleh laba sebesar $0,01.

Tidak hanya itu, pedagang frekuensi tinggi juga dapat memperoleh keuntungan setelah membeli meskipun harga tidak naik. Karena mereka tahu bahwa gajah menopang harga terendah, mereka dapat dengan cepat menjual sahamnya kepada gajah dan memperoleh sedikit laba dari selisihnya.

Menguraikan Kode Strategi Penny Jump

Kode sumber strategi: https://www.fmz.com/strategy/358

Kode strategi yang disediakan di atas adalah contoh yang mengimplementasikan strategi Penny Jump. Berikut adalah penjelasan kode secara rinci sehingga pemula dapat memahami 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("调戏次数:", Counter.i, "成功:", Counter.w, "失败:", 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("搜索大象中.... 买一: " + depth.Bids[0].Price + ",  卖一:" + depth.Asks[0].Price + ", 锁定次数: " + 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("调戏大象中....大象在第" + 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("买单得手: " + opAmount +", 开始出手...");
        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("没有得手, 开始止损, 当前买一: " + 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);
    }
}

Saya akan membahas kode strategi yang Anda berikan baris demi baris untuk membantu Anda memahami cara kerjanya secara lebih rinci.

var Counter = {
    i: 0,
    w: 0,
    f: 0
};

Kode ini menginisialisasi objek yang disebut Counter, yang digunakan untuk melacak statistik perdagangan strategi. Secara khusus, ini mencakup tiga atribut:

  • i: menunjukkan jumlah total transaksi.
  • w: menunjukkan jumlah transaksi yang berhasil.
  • f: menunjukkan jumlah transaksi yang gagal.

Atribut ini dicatat dan diperbarui selama pelaksanaan kebijakan.

var InitAccount = null;

Baris kode ini menginisialisasi variabel yang disebut InitAccount, yang akan menyimpan informasi akun saat 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 sebuahCancelAll()Tujuan fungsi ini adalah untuk membatalkan semua pesanan terbuka di pasar. Mari kita jelaskan fungsinya langkah demi langkah:

  • while (true): Ini adalah putaran tak terhingga yang akan dijalankan hingga tidak ada lagi pesanan yang belum diselesaikan.
  • var orders = _C(exchange.GetOrders): Baris kode ini menggunakan fungsi exchange.GetOrders untuk mendapatkan semua pesanan yang tertunda untuk akun saat ini dan menyimpannya dalam variabel orders.
  • if (orders.length == 0): Baris kode ini memeriksa apakah ada pesanan yang belum terpenuhi. Jika panjang array pesanan adalah 0, artinya tidak ada pesanan yang belum terpenuhi dan loop akan terputus.
  • for (var i = 0; i < orders.length; i++): Ini adalah perulangan for yang mengulangi semua pesanan yang belum diselesaikan.
  • exchange.CancelOrder(orders[i].Id): Baris kode ini menggunakan fungsi exchange.CancelOrder() untuk membatalkan setiap pesanan berdasarkan ID pesanannya.
  • Sleep(Interval): Baris kode ini memperkenalkan siklus tunggu, menunggu selama periode waktu tertentu (dalam milidetik) untuk memastikan bahwa operasi pembatalan pesanan tidak terlalu sering.

Tujuan fungsi ini adalah untuk memastikan bahwa sebelum mengeksekusi strategi utama, tidak ada order yang tertunda guna menghindari gangguan pada eksekusi strategi utama.

function updateStatus(msg) {
    LogStatus("调戏次数:", Counter.i, "成功:", Counter.w, "失败:", Counter.f, "\n" + msg + "#0000ff\n" + new Date());
}

Ini adalah sebuahupdateStatus(msg)Fungsi yang memperbarui informasi status transaksi dan mencatatnya. Ia menerima parameter msg yang biasanya berisi informasi tentang status pasar saat ini. Operasi spesifik dari fungsi ini meliputi:

menggunakanLogStatus()Fungsi ini merekam informasi yang ditampilkan pada bilah status saat strategi sedang berjalan. Menunjukkan teks tentang jumlah transaksi, keberhasilan dan kegagalan. TerlampirmsgParameter yang berisi informasi tentang status pasar saat ini. Stempel waktu saat ini ditambahkan (new Date()) untuk menampilkan informasi waktu. Tujuan fungsi ini adalah untuk merekam dan memperbarui informasi status perdagangan 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("搜索大象中.... 买一: " + depth.Bids[0].Price + ",  卖一:" + depth.Asks[0].Price + ", 锁定次数: " + 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("调戏大象中....大象在第" + 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("买单得手: " + opAmount +", 开始出手...");
        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("没有得手, 开始止损, 当前买一: " + 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 utama dari strategimain(), yang berisi logika inti strategi. Mari kita jelaskan cara kerjanya baris demi baris:

  • if (DisableLog): Baris kode ini memeriksa apakah variabel DisableLog benar, dan jika benar, pencatatan akan dinonaktifkan. Hal ini untuk memastikan bahwa kebijakan tidak mencatat informasi yang tidak diperlukan.

  • CancelAll(): Panggil fungsi CancelAll() yang dijelaskan sebelumnya untuk memastikan tidak ada pesanan yang belum selesai.

  • InitAccount = _C(exchange.GetAccount): Baris kode ini mendapatkan informasi akun saat ini dan menyimpannya dalam variabel InitAccount. Ini akan digunakan untuk mencatat status akun saat strategi mulai dijalankan.

  • var i = 0; Dan var locks = 0;: Inisialisasi dua variabel i dan kunci, yang akan digunakan dalam logika strategi selanjutnya.

  • while (true): Ini adalah putaran tak terbatas, yang terutama digunakan untuk eksekusi strategi secara terus-menerus.

Selanjutnya kita akan menjelaskan baris per bariswhile (true)Logika strategi utama di dalam loop.

while (true) {
    Sleep(Interval);
    var depth = _C(exchange.GetDepth);
    if (depth.Asks.length === 0 || depth.Bids.length === 0) {
        continue;
    }
    updateStatus("搜索大象中.... 买一: " + depth.Bids[0].Price + ",  卖一:" + depth.Asks[0].Price + ", 锁定次数: " + locks);
  • Sleep(Interval): Baris kode ini memungkinkan strategi untuk tidur selama beberapa waktu guna mengendalikan frekuensi eksekusi strategi. Parameter Interval menentukan interval tidur dalam milidetik.

  • var depth = _C(exchange.GetDepth): Dapatkan informasi kedalaman pasar saat ini, termasuk harga dan jumlah pesanan jual dan beli. Informasi ini akan disimpan dalam variabel kedalaman.

  • if (depth.Asks.length === 0 || depth.Bids.length === 0): Baris kode ini memeriksa informasi kedalaman pasar untuk memastikan bahwa ada pesanan jual dan beli. Jika salah satunya tidak ada, berarti pasar mungkin tidak memiliki cukup informasi perdagangan, dan strategi akan terus menunggu.

  • updateStatus("搜索大象中.... 买一: " + depth.Bids[0].Price + ", 卖一:" + depth.Asks[0].Price + ", 锁定次数: " + locks): Baris kode ini memanggil fungsi updateStatus untuk memperbarui informasi status strategi. Mencatat status pasar saat ini, termasuk harga penawaran, harga permintaan, dan jumlah penguncian sebelumnya.

    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, yang akan digunakan untuk menyimpan harga pesanan jual yang memenuhi ketentuan.

  • for (i = 0; i < depth.Asks.length; i++): Ini adalah perulangan for yang digunakan untuk mengulangi informasi harga dan kuantitas dari pesanan jual pasar.

  • if (depth.Asks[i].Amount >= Lot): Dalam loop, periksa apakah kuantitas setiap pesanan jual lebih besar atau sama dengan Lot yang ditentukan. Jika demikian, simpan harga pesanan jual di askPrice dan akhiri perulangan.

  • if (askPrice === 0): Jika tidak ditemukan pesanan jual yang memuaskan (askPrice masih 0), strategi akan terus menunggu dan melewatkan operasi berikutnya.

  • var elephant = null;: Inisialisasi variabel gajah, yang akan digunakan untuk menyimpan informasi pesanan beli yang diidentifikasi sebagai “gajah”.

    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;

Terus ulangi informasi harga dan kuantitas dari pesanan beli pasar, lewati pesanan beli pertama (Penawaran[0])。

  • if ((askPrice - depth.Bids[i].Price) > ElephantSpace): Periksa apakah perbedaan antara harga beli saat ini dan harga permintaan lebih besar dari ElephantSpace. Jika demikian, berarti jaraknya cukup jauh dari “gajah” dan strategi tidak akan melanjutkan pencarian.

  • 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 “gajah” tidak ditemukan, setel ulang jumlah kunci ke 0 dan lanjutkan menunggu.

locks++: Jika “gajah” ditemukan, jumlah kunci akan bertambah. Hal ini untuk memastikan bahwa strategi tersebut dijalankan setelah keberadaan “gajah” tersebut dikonfirmasi beberapa kali selama jangka waktu tertentu.

  • if (locks < LockCount): Periksa apakah jumlah kunci mencapai persyaratan (LockCount). Jika persyaratan tidak terpenuhi, lanjutkan menunggu.
    updateStatus("调戏大象中....大象在第" + 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("调戏大象中....大象在第" + i + "档, " + JSON.stringify(elephant)): Panggil fungsi updateStatus untuk mencatat status strategi saat ini, termasuk posisi roda gigi “gajah” yang ditemukan dan informasi terkait. Ini akan ditunjukkan di kolom Status kebijakan.

  • exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant): Gunakan fungsi exchange.Buy untuk membeli “gajah” yang ditemukan. Harga pembelian adalah gajah. Harga + PennyTick, jumlah pembelian adalah Lot, dan operasi pembelian dijelaskan sebagai “Penawaran[” + i + “]“。

  • var ts = new Date().getTime(): Dapatkan stempel waktu saat ini untuk perhitungan interval waktu selanjutnya.

  • while (true): Masukkan loop tak terbatas baru untuk menunggu eksekusi pesanan beli “gajah”.

  • Sleep(CheckInterval): Strategi ini tertidur selama jangka waktu tertentu untuk mengontrol seberapa sering status pesanan diperiksa.

  • var orders = _C(exchange.GetOrders): Dapatkan semua informasi pesanan dari akun saat ini.

  • if (orders.length == 0): Periksa apakah ada pesanan yang belum selesai, jika tidak, segera tinggalkan loop.

  • (new Date().getTime() - ts) > WaitInterval: Hitung interval waktu antara waktu saat ini dan waktu saat “gajah” dibeli. Jika melebihi WaitInterval, berarti waktu tunggu telah habis.

  • for (var i = 0; i < orders.length; i++): Ulangi semua pesanan yang belum selesai.

  • exchange.CancelOrder(orders[i].Id): Batalkan setiap pesanan terbuka menggunakan fungsi exchange.CancelOrder.

    var account = _C(exchange.GetAccount);
    var opAmount = _N(account.Stocks - InitAccount.Stocks);
    if (opAmount < 0.001) {
        Counter.f++;
        Counter.i++;
        continue;
    }
    updateStatus("买单得手: " + opAmount + ", 开始出手...");
    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("没有得手, 开始止损, 当前买一: " + 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): Dapatkan informasi akun terkini.

  • var opAmount = _N(account.Stocks - InitAccount.Stocks): Hitung perubahan aset di akun setelah pembelian “Gajah”. Jika perubahannya kurang dari 0,001, berarti pembelian gagal, jumlah kegagalan akan meningkat, dan siklus berikutnya akan berlanjut.

  • updateStatus("买单得手: " + opAmount + ", 开始出手..."): Mencatat informasi pembelian “gajah” yang berhasil, termasuk jumlah pembelian.

  • exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount): Gunakan fungsi exchange.Sell untuk menjual “gajah” yang berhasil dibeli untuk mendapatkan keuntungan. Harga jualnya adalah gajah. Harga + (PennyTick * ProfitTick).

Memasuki putaran tak terbatas baru menunggu eksekusi perintah jual.

  • var depth = _C(exchange.GetDepth): Dapatkan informasi kedalaman pasar.

  • if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price - (STTick * PennyTick))): Periksa informasi kedalaman pasar. Jika harga pasar telah jatuh ke harga stop loss, jalankan operasi stop loss.

  • CancelAll(): Panggil fungsi CancelAll() untuk membatalkan semua order yang belum selesai untuk menghindari risiko posisi.

  • if (opAmount < 0.001): Periksa kembali jumlah pembelian. Jika kurang dari 0,001, berarti pembelian gagal dan loop akan ditutup.

  • exchange.Sell(depth.Bids[0].Price, opAmount): Jalankan operasi stop loss dan jual aset yang tersisa pada harga pasar terendah saat ini.

Akhirnya, tergantung pada apakah transaksi berhasil atau tidak, jumlah keberhasilan dan kegagalan diperbarui, dan laba transaksi dicatat.

Itulah penjelasan baris demi baris dari keseluruhan strategi. Ide inti dari strategi ini adalah mencari “gajah” (pesanan beli besar) di pasar, membelinya, dan menjualnya untuk mendapatkan keuntungan kecil. Ini mencakup beberapa parameter penting, seperti kuantitas pembelian (Lot), interval percobaan kesalahan (Interval), level gajah (ElephantAmount), jarak gajah (ElephantSpace), dll., untuk menyesuaikan perilaku strategi.

Secara umum, strategi ini merupakan strategi perdagangan frekuensi tinggi yang bertujuan untuk mengeksploitasi informasi kedalaman pasar, mengidentifikasi pesanan beli dalam jumlah besar, dan mengeksekusi transaksi beli dan jual dalam waktu singkat. Hal ini memerlukan pemantauan pasar secara terus-menerus dan menjalankan operasi beli dan jual untuk segera memperoleh keuntungan kecil. Namun, ini juga merupakan strategi berisiko tinggi karena memerlukan respons cepat terhadap fluktuasi pasar, sementara juga mempertimbangkan manajemen risiko dan mekanisme stop-loss untuk menghindari kerugian yang signifikan.

Harap dicatat bahwa strategi ini didasarkan pada pasar dan platform perdagangan tertentu dan mungkin perlu disesuaikan dan dioptimalkan untuk pasar dan bursa yang berbeda. Dalam penerapan aktual, investor perlu menguji dan mengevaluasi kinerja strategi secara cermat untuk memastikan konsistensinya dengan tujuan investasi dan toleransi risiko mereka.

Saat Anda terus menjalankan strategi, strategi tersebut akan terus berulang dan melakukan hal berikut:

  1. Pertama, strategi memeriksa informasi kedalaman pasar untuk memahami pesanan jual dan beli saat ini.

  2. Selanjutnya, strategi akan mencoba mencari order jual yang memenuhi ketentuan, di mana kuantitas order jual lebih besar atau sama dengan Lot. Jika order jual yang memenuhi ketentuan ditemukan, harga order jual akan dicatat sebagai askPrice.

  3. Strategi selanjutnya adalah mencari “gajah” (pesanan beli dalam jumlah besar). Ia akan mengulangi pesanan beli di pasar, melewati pesanan beli pertama (biasanya pesanan beli dengan harga tertinggi). Apabila ditemukan “gajah” yang memenuhi syarat, maka akan dilakukan pencatatan data “gajah” tersebut dan jumlah gembok akan ditambah.

  4. Jika cukup banyak “gajah” yang ditemukan secara berurutan (dikendalikan oleh parameter LockCount), strategi akan melakukan operasi berikut lebih lanjut:

  • Panggil fungsi updateStatus untuk mencatat posisi roda gigi “gajah” dan informasi terkait.
  • Gunakan fungsi Exchange.Buy untuk membeli “gajah”, harga pembeliannya adalah elephant.Price + PennyTick, dan jumlah pembeliannya adalah Lot.
  • Memulai putaran tak terbatas baru sambil menunggu eksekusi perintah beli.
  • Periksa status pesanan dan jika pesanan sudah selesai, keluar dari loop.
  • Jika waktu tunggu melebihi interval tunggu yang ditetapkan (WaitInterval), semua pesanan yang belum diselesaikan akan dibatalkan.
  • Hitung perubahan aset akun setelah pembelian berhasil. Jika perubahannya kurang dari 0,001, berarti pembelian gagal, tambah jumlah kegagalan, dan lanjutkan ke siklus berikutnya.
  • Catat informasi pembelian “gajah” yang berhasil, termasuk jumlah pembelian.
  1. Selanjutnya, strategi akan terus memasuki putaran tak terbatas baru, menunggu pelaksanaan operasi jual. Dalam loop ini, ia melakukan hal berikut:
  • Dapatkan informasi kedalaman pasar dan periksa apakah harga pasar telah mencapai level stop loss.
  • Jika harga pasar mencapai atau turun di bawah harga stop loss, operasi stop loss akan dieksekusi, yaitu aset yang tersisa akan dijual.
  • Panggil fungsi CancelAll untuk membatalkan semua order yang belum diselesaikan guna mengurangi risiko posisi.
  • Periksa kembali perubahan aset akun setelah pembelian berhasil. Jika perubahannya kurang dari 0,001, berarti pembelian gagal dan loop ditutup.
  • Terakhir, catat apakah transaksi berhasil atau tidak, dan perbarui jumlah keberhasilan dan kegagalan berdasarkan hasil transaksi.

Seluruh strategi terus berputar melalui operasi-operasi di atas untuk menangkap sebanyak mungkin “gajah” dan memperoleh keuntungan kecil. Ini adalah strategi perdagangan frekuensi tinggi yang memerlukan respons cepat terhadap perubahan pasar sambil juga mempertimbangkan manajemen risiko dan mekanisme stop-loss untuk melindungi modal. Investor sebaiknya mempertimbangkan dengan saksama penggunaan strategi ini, terutama di pasar yang sangat fluktuatif.

Kesimpulan

Strategi Penny Jump adalah contoh klasik dalam perdagangan frekuensi tinggi, yang menunjukkan permainan dan persaingan halus di antara pelaku pasar. Strategi ini sangat menonjol di pasar mata uang kripto, di mana volatilitasnya tinggi dan investor institusional serta pedagang frekuensi tinggi mencari keuntungan cepat. Namun, hal ini juga membuat pasar menjadi penuh tantangan, memerlukan adaptasi dan penyesuaian strategi yang konstan untuk mempertahankan keunggulan kompetitif. Dalam dunia yang sangat kompetitif ini, hanya pedagang yang pandai mengamati struktur mikro pasar dan merespons dengan cepat yang akan berhasil.