avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

Phân tích chiến lược giao dịch tần suất cao - Penny Jump

Được tạo ra trong: 2023-11-03 17:36:56, cập nhật trên: 2023-11-03 22:19:32
comments   0
hits   2879

Phân tích chiến lược giao dịch tần suất cao - Penny Jump

Giao dịch tần suất cao là một lĩnh vực đầy thách thức và cạnh tranh, đòi hỏi phải thực hiện giao dịch nhanh chóng và hiểu biết sâu sắc về cấu trúc vi mô của thị trường. Một trong những chiến lược nhận được nhiều sự chú ý là Penny Jump, tập trung vào việc tận dụng các “con voi” trên thị trường để kiếm lợi nhuận nhỏ nhưng thường xuyên. Trong bài viết này, chúng tôi sẽ giải thích chi tiết về cách chiến lược Penny Jump hoạt động đồng thời đi sâu vào chi tiết của mã chiến lược để người mới bắt đầu có thể hiểu cách thức hoạt động của nó.

Hiểu về Chiến lược Penny Jump

Trên thị trường chứng khoán, “con voi” thường là các nhà đầu tư tổ chức muốn mua hoặc bán số lượng lớn cổ phiếu nhưng không muốn giao dịch theo giá thị trường. Thay vào đó, họ chọn đặt một số lượng lớn lệnh giới hạn, còn được gọi là lệnh chờ, trên thị trường để thể hiện ý định của họ. Hành vi này đã thu hút sự chú ý rộng rãi trên thị trường vì các giao dịch lớn có thể có tác động đáng kể đến thị trường.

Ví dụ, giả sử độ sâu thị trường của một cổ phiếu ban đầu trông như thế này: 200 | 1,01 đô la x 1,03 đô la | 200. Sau đó, một “con voi” đến và đặt lệnh mua 3.000 cổ phiếu với giá 1,01 đô la. Tại thời điểm này, độ sâu của thị trường sẽ trở thành 3.200 | 1,01 đô la x 1,03 đô la | 200. Hành động này giống như việc giới thiệu một “con voi” trở thành tâm điểm chú ý của những người tham gia khác trên thị trường.

  • Thị trường cạnh tranh Đối với các nhà giao dịch tần suất cao, lợi nhuận của họ chủ yếu đến từ việc phân tích cấu trúc vi mô thị trường để suy ra ý định của các nhà giao dịch khác. Khi một con voi xuất hiện, các nhà giao dịch tần suất cao sẽ nhanh chóng thiết lập vị thế để nắm bắt những biến động giá nhỏ. Mục tiêu của họ là thực hiện các giao dịch thường xuyên trong một thời gian ngắn, tích lũy lợi nhuận nhỏ nhưng tích lũy.

  • Hoàn cảnh khốn khổ của loài voi Mặc dù voi có thể muốn hoạt động ở quy mô lớn trên thị trường, hành động của chúng cũng phản bội ý định giao dịch của chúng, khiến chúng trở thành mục tiêu của các nhà giao dịch tần suất cao. Các nhà giao dịch tần suất cao cố gắng thiết lập vị thế trước và sau đó kiếm lợi nhuận từ biến động giá. Sự hiện diện của một con voi trên thị trường có thể gây ra phản ứng trong thị trường cạnh tranh, do đó ảnh hưởng đến chiến lược giao dịch của thị trường đó.

  • Lừa dối trên thị trường Trên thực tế, các tổ chức đầu tư lớn thường không công khai đặt một lượng lớn lệnh mua hoặc bán trên thị trường, vì hành vi như vậy có thể khiến những người tham gia thị trường khác thực hiện các biện pháp đối phó hoặc thậm chí thao túng thị trường. Do đó, họ có thể áp dụng các chiến lược tạo ra ấn tượng sai lệch để thu hút các nhà giao dịch tần suất cao tham gia thị trường, sau đó nhanh chóng bán hoặc mua để kiếm lời từ biến động giá.

Ý tưởng cốt lõi của chiến lược Penny Jump

Ý tưởng cốt lõi của chiến lược Penny Jump là khi một con voi xuất hiện trên thị trường và hỗ trợ một mức giá cụ thể (ví dụ: 1,01 đô la), các nhà giao dịch tần suất cao sẽ nhanh chóng tăng giá thầu của họ thêm một xu, ví dụ lên 1,02 đô la. Điều này là do các nhà giao dịch tần suất cao hiểu rằng sự xuất hiện của một con voi có nghĩa là có sự hỗ trợ mua mạnh ở mức giá đó, vì vậy họ cố gắng theo dõi nó với hy vọng giá sẽ tăng. Khi giá tăng lên 1,03 đô la x 1,05 đô la, nhà giao dịch tần suất cao có thể nhanh chóng bán ra, kiếm được 0,01 đô la lợi nhuận.

Không chỉ vậy, các nhà giao dịch tần suất cao còn có thể kiếm được lợi nhuận sau khi mua ngay cả khi giá không tăng. Vì họ biết rằng con voi hỗ trợ giá đáy nên họ có thể nhanh chóng bán cổ phiếu của mình cho con voi và kiếm được một khoản lợi nhuận nhỏ từ sự chênh lệch.

Phân tích mã chiến lược Penny Jump

Mã nguồn chiến lược: https://www.fmz.com/strategy/358

Mã chiến lược được cung cấp ở trên là một ví dụ triển khai chiến lược Penny Jump. Sau đây là giải thích chi tiết về mã để người mới bắt đầu có thể hiểu cách thức hoạt động của nó:

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);
    }
}

Tôi sẽ phân tích từng dòng mã chiến lược mà bạn cung cấp để giúp bạn hiểu rõ hơn về cách thức hoạt động của nó.

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

Đoạn mã này khởi tạo một đối tượng có tên là Counter, được sử dụng để theo dõi số liệu thống kê giao dịch của chiến lược. Cụ thể, nó bao gồm ba thuộc tính:

  • i: biểu thị tổng số giao dịch.
  • w: biểu thị số lượng giao dịch thành công.
  • f: biểu thị số lượng giao dịch không thành công.

Các thuộc tính này được ghi lại và cập nhật trong quá trình thực hiện chính sách.

var InitAccount = null;

Dòng mã này khởi tạo một biến có tên là InitAccount, biến này sẽ lưu trữ thông tin tài khoản khi chiến lược bắt đầu thực thi.

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);
    }
}

Đây là mộtCancelAll()Mục đích của chức năng này là hủy tất cả các lệnh mở trên thị trường. Chúng ta hãy cùng giải thích chức năng của nó từng bước một:

  • while (true):Đây là vòng lặp vô hạn sẽ thực hiện cho đến khi không còn đơn hàng nào chưa hoàn thành.
  • var orders = _C(exchange.GetOrders):Dòng mã này sử dụng hàm exchange.GetOrders để lấy tất cả các lệnh đang chờ xử lý cho tài khoản hiện tại và lưu trữ chúng trong biến orders.
  • if (orders.length == 0): Dòng mã này kiểm tra xem có đơn hàng nào chưa được thực hiện không. Nếu độ dài của mảng đơn hàng là 0, điều đó có nghĩa là không có đơn hàng nào chưa được thực hiện và vòng lặp sẽ bị phá vỡ.
  • for (var i = 0; i < orders.length; i++):Đây là vòng lặp for lặp lại tất cả các đơn hàng đang chờ xử lý.
  • exchange.CancelOrder(orders[i].Id):Dòng mã này sử dụng hàm exchange.CancelOrder() để hủy từng đơn hàng theo ID đơn hàng đó.
  • Sleep(Interval):Dòng mã này giới thiệu một chu kỳ chờ, chờ trong một khoảng thời gian nhất định (tính bằng mili giây) để đảm bảo rằng thao tác hủy đơn hàng không diễn ra quá thường xuyên.

Mục đích của chức năng này là đảm bảo rằng trước khi thực hiện chiến lược chính, không có lệnh nào chưa thực hiện để tránh ảnh hưởng đến việc thực hiện chiến lược chính.

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

Đây là mộtupdateStatus(msg)Một chức năng cập nhật thông tin trạng thái giao dịch và ghi lại. Nó chấp nhận tham số msg thường chứa thông tin về trạng thái thị trường hiện tại. Các hoạt động cụ thể của hàm bao gồm:

sử dụngLogStatus()Chức năng này ghi lại thông tin hiển thị trên thanh trạng thái khi chiến lược đang chạy. Hiển thị văn bản về số lượng giao dịch, thành công và thất bại. Đính kèmmsgCác tham số chứa thông tin về tình trạng thị trường hiện tại. Dấu thời gian hiện tại được thêm vào (new Date()) để hiển thị thông tin thời gian. Mục đích của chức năng này là ghi lại và cập nhật thông tin trạng thái giao dịch để theo dõi và phân tích trong quá trình thực hiện chiến lược.

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);
    }
}

Đây là chức năng thực hiện chính của chiến lượcmain(), chứa đựng logic cốt lõi của chiến lược. Chúng ta hãy giải thích hoạt động của nó theo từng dòng:

  • if (DisableLog): Dòng mã này kiểm tra xem biến DisableLog có đúng không và nếu đúng, nó sẽ vô hiệu hóa việc ghi nhật ký. Điều này nhằm đảm bảo chính sách không ghi lại thông tin không cần thiết.

  • CancelAll(): Gọi hàm CancelAll() đã giải thích trước đó để đảm bảo không có đơn hàng nào chưa hoàn thành.

  • InitAccount = _C(exchange.GetAccount):Dòng mã này lấy thông tin tài khoản hiện tại và lưu trữ trong biến InitAccount. Thông tin này sẽ được sử dụng để ghi lại trạng thái của tài khoản khi chiến lược bắt đầu thực thi.

  • var i = 0;var locks = 0;: Khởi tạo hai biến i và locks, sẽ được sử dụng trong logic chiến lược tiếp theo.

  • while (true):Đây là vòng lặp vô hạn, chủ yếu được sử dụng để thực hiện liên tục các chiến lược.

Tiếp theo, chúng tôi sẽ giải thích từng dòngwhile (true)Logic chiến lược chính bên trong vòng lặp.

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):Dòng mã này cho phép chiến lược ngủ trong một khoảng thời gian để kiểm soát tần suất thực thi của chiến lược. Tham số Interval xác định khoảng thời gian ngủ tính bằng mili giây.

  • var depth = _C(exchange.GetDepth): Nhận thông tin về chiều sâu thị trường hiện tại, bao gồm giá và số lượng lệnh bán và lệnh mua. Thông tin này sẽ được lưu trữ trong biến độ sâu.

  • if (depth.Asks.length === 0 || depth.Bids.length === 0): Dòng mã này kiểm tra thông tin về độ sâu thị trường để đảm bảo rằng cả lệnh bán và lệnh mua đều tồn tại. Nếu một trong số chúng không tồn tại, điều đó có nghĩa là thị trường có thể không có đủ thông tin giao dịch và chiến lược sẽ tiếp tục phải chờ đợi.

  • updateStatus("搜索大象中.... 买一: " + depth.Bids[0].Price + ", 卖一:" + depth.Asks[0].Price + ", 锁定次数: " + locks):Dòng mã này gọi hàm updateStatus để cập nhật thông tin trạng thái của chiến lược. Nó ghi lại trạng thái thị trường hiện tại, bao gồm giá thầu, giá chào bán và số lượng khóa trước đó.

    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;: Khởi tạo biến askPrice, biến này sẽ được sử dụng để lưu trữ giá lệnh bán đáp ứng các điều kiện.

  • for (i = 0; i < depth.Asks.length; i++):Đây là vòng lặp for được sử dụng để lặp lại thông tin về giá và số lượng của lệnh bán trên thị trường.

  • if (depth.Asks[i].Amount >= Lot): Trong vòng lặp, hãy kiểm tra xem số lượng của mỗi lệnh bán có lớn hơn hoặc bằng Lô đã chỉ định hay không. Nếu vậy, hãy lưu trữ giá của lệnh bán trong askPrice và chấm dứt vòng lặp.

  • if (askPrice === 0): Nếu không tìm thấy lệnh bán nào thỏa mãn (giá yêu cầu vẫn là 0), chiến lược sẽ tiếp tục chờ và bỏ qua các hoạt động tiếp theo.

  • var elephant = null;: Khởi tạo biến elephant, biến này sẽ được dùng để lưu trữ thông tin lệnh mua được xác định là “elephant”.

    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;

Tiếp tục lặp lại thông tin về giá và số lượng của lệnh mua trên thị trường, bỏ qua lệnh mua đầu tiên (Giá thầu[0])。

  • if ((askPrice - depth.Bids[i].Price) > ElephantSpace): Kiểm tra xem mức chênh lệch giữa giá mua hiện tại và giá chào bán có lớn hơn ElephantSpace hay không. Nếu vậy, điều đó có nghĩa là nó đã ở đủ xa “con voi” và chiến lược này sẽ không tiếp tục tìm kiếm nữa.

  • if (depth.Bids[i].Amount >= ElephantAmount): Kiểm tra xem số lượng lệnh mua hiện tại có lớn hơn hoặc bằng ElephantAmount không. Nếu có, hãy lưu trữ thông tin lệnh mua trong biến elephant.

  • if (!elephant): Nếu không tìm thấy “con voi”, hãy đặt lại số lượng khóa về 0 và tiếp tục chờ.

locks++: Nếu tìm thấy “con voi”, số lượng khóa sẽ được tăng lên. Điều này nhằm đảm bảo rằng chiến lược được thực hiện sau khi sự tồn tại của “con voi” được xác nhận nhiều lần trong một khoảng thời gian.

  • if (locks < LockCount): Kiểm tra số lượng khóa có đạt yêu cầu hay không (LockCount). Nếu không đáp ứng được yêu cầu, hãy tiếp tục chờ.
    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)):Gọi hàm updateStatus để ghi lại trạng thái hiện tại của chiến lược, bao gồm vị trí bánh răng của “con voi” được tìm thấy và thông tin liên quan. Điều này sẽ được chỉ ra trong cột Trạng thái của chính sách.

  • exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant): Sử dụng chức năng trao đổi.Mua để mua “con voi” đã tìm thấy. Giá mua là elephant.Price + PennyTick, số lượng mua là Lot và hoạt động mua được mô tả là “Giá thầu[” + i + “]“。

  • var ts = new Date().getTime(): Lấy dấu thời gian của thời gian hiện tại để tính toán các khoảng thời gian tiếp theo.

  • while (true): Nhập một vòng lặp vô hạn mới để chờ lệnh mua “voi” được thực hiện.

  • Sleep(CheckInterval):Chiến lược này sẽ tạm dừng trong một khoảng thời gian để kiểm soát tần suất kiểm tra trạng thái đơn hàng.

  • var orders = _C(exchange.GetOrders): Lấy tất cả thông tin lệnh của tài khoản hiện tại.

  • if (orders.length == 0): Kiểm tra xem có đơn hàng nào chưa hoàn thành không, nếu không, hãy thoát khỏi vòng lặp.

  • (new Date().getTime() - ts) > WaitInterval: Tính toán khoảng thời gian giữa thời gian hiện tại và thời gian mua “voi”. Nếu vượt quá WaitInterval, nghĩa là thời gian chờ đã hết.

  • for (var i = 0; i < orders.length; i++): Lặp lại tất cả các đơn hàng chưa hoàn thành.

  • exchange.CancelOrder(orders[i].Id): Hủy từng lệnh mở bằng hàm 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): Nhận thông tin tài khoản hiện tại.

  • var opAmount = _N(account.Stocks - InitAccount.Stocks): Tính toán sự thay đổi về tài sản trong tài khoản sau khi mua “Elephant”. Nếu mức thay đổi nhỏ hơn 0,001 thì có nghĩa là giao dịch mua đã thất bại, số lần thất bại sẽ tăng lên và chu kỳ tiếp theo sẽ tiếp tục.

  • updateStatus("买单得手: " + opAmount + ", 开始出手..."): Ghi lại thông tin mua hàng thành công của “voi”, bao gồm số lượng mua.

  • exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount): Sử dụng chức năng trao đổi.Bán để bán “con voi” đã mua thành công để kiếm lời. Giá bán là elephant.Price + (PennyTick * ProfitTick).

Đi vào vòng lặp vô hạn mới chờ lệnh bán được thực hiện.

  • var depth = _C(exchange.GetDepth): Nhận thông tin sâu sắc về thị trường.

  • if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price - (STTick * PennyTick))): Kiểm tra thông tin độ sâu thị trường. Nếu giá thị trường đã giảm xuống mức giá dừng lỗ, hãy thực hiện lệnh dừng lỗ.

  • CancelAll():Gọi hàm CancelAll() để hủy tất cả các lệnh chưa hoàn thành nhằm tránh rủi ro vị thế.

  • if (opAmount < 0.001): Kiểm tra lại số lượng mua hàng. Nếu số lượng nhỏ hơn 0,001, điều đó có nghĩa là giao dịch mua hàng không thành công và vòng lặp sẽ thoát.

  • exchange.Sell(depth.Bids[0].Price, opAmount): Thực hiện lệnh dừng lỗ và bán số tài sản còn lại ở mức giá thấp nhất trên thị trường hiện tại.

Cuối cùng, tùy thuộc vào việc giao dịch thành công hay không, số lượng giao dịch thành công và thất bại sẽ được cập nhật và lợi nhuận của giao dịch sẽ được ghi nhận.

Đó là lời giải thích chi tiết về toàn bộ chiến lược. Ý tưởng cốt lõi của chiến lược này là tìm kiếm “con voi” (lệnh mua lớn) trên thị trường, mua chúng và bán chúng để kiếm lời nhỏ. Nó bao gồm một số tham số quan trọng, chẳng hạn như số lượng mua (Lot), khoảng thời gian thử lại lỗi (Interval), mức độ voi (ElephantAmount), khoảng cách voi (ElephantSpace), v.v., để điều chỉnh hành vi của chiến lược.

Nhìn chung, chiến lược này là chiến lược giao dịch tần suất cao nhằm khai thác thông tin chiều sâu thị trường, xác định các lệnh mua lớn và thực hiện các giao dịch mua và bán trong thời gian ngắn. Cần phải liên tục theo dõi thị trường và thực hiện các hoạt động mua bán để nhanh chóng kiếm được lợi nhuận nhỏ. Tuy nhiên, đây cũng là một chiến lược có rủi ro cao vì đòi hỏi phải phản ứng nhanh với những biến động của thị trường, đồng thời phải cân nhắc đến cơ chế quản lý rủi ro và dừng lỗ để tránh những tổn thất đáng kể.

Xin lưu ý rằng chiến lược này dựa trên các thị trường và nền tảng giao dịch cụ thể và có thể cần được điều chỉnh và tối ưu hóa phù hợp cho các thị trường và sàn giao dịch khác nhau. Trong ứng dụng thực tế, các nhà đầu tư cần phải kiểm tra và đánh giá cẩn thận hiệu quả của chiến lược để đảm bảo nó phù hợp với mục tiêu đầu tư và khả năng chấp nhận rủi ro của họ.

Khi bạn tiếp tục thực hiện chiến lược, nó sẽ tiếp tục lặp lại và thực hiện những điều sau:

  1. Đầu tiên, chiến lược này sẽ kiểm tra thông tin về độ sâu của thị trường để hiểu các lệnh bán và mua hiện tại.

  2. Tiếp theo, chiến lược sẽ cố gắng tìm lệnh bán đáp ứng các điều kiện, trong đó số lượng lệnh bán lớn hơn hoặc bằng Lot. Nếu tìm thấy lệnh bán đáp ứng các điều kiện, giá lệnh bán sẽ được ghi nhận là askPrice.

  3. Chiến lược sau đó tiếp tục tìm kiếm “con voi” (lệnh mua lớn). Nó sẽ lặp lại các lệnh mua trên thị trường, bỏ qua lệnh mua đầu tiên (thường là lệnh mua có giá cao nhất). Nếu tìm thấy một “con voi” đáp ứng các điều kiện, thông tin về “con voi” sẽ được ghi lại và số lượng khóa sẽ được tăng lên.

  4. Nếu tìm thấy đủ số lượng “con voi” liên tiếp (được kiểm soát bởi tham số LockCount), chiến lược sẽ thực hiện thêm các hoạt động sau:

  • Gọi hàm updateStatus để ghi lại vị trí bánh răng của “con voi” và thông tin liên quan.
  • Sử dụng chức năng exchange.Buy để mua “elephant”, giá mua là elephant.Price + PennyTick và số lượng mua là Lot.
  • Bắt đầu một vòng lặp vô hạn mới chờ lệnh mua được thực hiện.
  • Kiểm tra trạng thái đơn hàng và nếu đơn hàng đã hoàn tất thì thoát khỏi vòng lặp.
  • Nếu thời gian chờ vượt quá khoảng thời gian chờ đã đặt (WaitInterval), tất cả các lệnh chưa hoàn thành sẽ bị hủy.
  • Tính toán sự thay đổi trong tài sản tài khoản sau khi mua thành công. Nếu sự thay đổi nhỏ hơn 0,001, điều đó có nghĩa là giao dịch mua không thành công, tăng số lần thất bại và tiếp tục chu kỳ tiếp theo.
  • Ghi lại thông tin mua “voi” thành công, bao gồm số lượng mua.
  1. Tiếp theo, chiến lược sẽ tiếp tục bước vào vòng lặp vô hạn mới, chờ lệnh bán được thực hiện. Trong vòng lặp này, nó thực hiện những điều sau:
  • Nhận thông tin về độ sâu thị trường và kiểm tra xem giá thị trường đã đạt đến mức dừng lỗ hay chưa.
  • Nếu giá thị trường đạt hoặc giảm xuống dưới mức giá dừng lỗ, lệnh dừng lỗ sẽ được thực hiện, tức là các tài sản còn lại sẽ được bán.
  • Gọi hàm CancelAll để hủy tất cả các lệnh chưa hoàn thành nhằm giảm rủi ro vị thế.
  • Kiểm tra lại sự thay đổi trong tài sản tài khoản sau khi mua thành công. Nếu sự thay đổi nhỏ hơn 0,001, điều đó có nghĩa là giao dịch mua không thành công và vòng lặp đã thoát.
  • Cuối cùng, ghi lại giao dịch thành công hay không và cập nhật số lần thành công và thất bại dựa trên kết quả giao dịch.

Toàn bộ chiến lược liên tục tuần hoàn qua các hoạt động trên để bắt càng nhiều “con voi” càng tốt và thu được lợi nhuận nhỏ. Đây là chiến lược giao dịch tần suất cao đòi hỏi phản ứng nhanh với những thay đổi của thị trường đồng thời cân nhắc đến cơ chế quản lý rủi ro và dừng lỗ để bảo vệ vốn. Các nhà đầu tư nên cân nhắc cẩn thận khi sử dụng chiến lược này, đặc biệt là trên các thị trường có tính biến động cao.

Phần kết luận

Chiến lược Penny Jump là một ví dụ điển hình trong giao dịch tần suất cao, thể hiện trò chơi tinh vi và sự cạnh tranh giữa những người tham gia thị trường. Chiến lược này đặc biệt nổi bật trên thị trường tiền điện tử, nơi có tính biến động cao và các nhà đầu tư tổ chức cùng các nhà giao dịch tần suất cao đang tìm kiếm lợi nhuận nhanh chóng. Tuy nhiên, điều này cũng khiến thị trường trở nên đầy thách thức, đòi hỏi phải liên tục thích nghi và điều chỉnh chiến lược để duy trì lợi thế cạnh tranh. Trong thế giới cạnh tranh khốc liệt này, chỉ những nhà giao dịch giỏi quan sát cấu trúc vi mô của thị trường và phản ứng nhanh mới có thể thành công.