
고빈도 거래는 빠른 거래 실행과 시장 미시 구조에 대한 민감한 통찰력이 필요한 도전적이고 경쟁이 치열한 분야입니다. 많은 주목을 받은 전략 중 하나는 페니 점프(Penny Jump)인데, 이는 시장의 “코끼리”를 이용해 작지만 빈번한 수익을 올리는 데 중점을 둡니다. 이 글에서는 페니 점프 전략이 어떻게 작동하는지 자세히 설명하고, 초보자도 이해할 수 있도록 전략 코드의 세부 사항을 살펴보겠습니다.
주식 시장에서 “코끼리”는 일반적으로 대량의 주식을 사고 팔고 싶어 하지만 시장 가격으로 거래하기를 꺼리는 기관 투자자입니다. 대신, 그들은 자신의 의도를 나타내기 위해 시장에 대량의 지정가 주문(보류 주문이라고도 함)을 내놓기로 합니다. 이런 행동은 대규모 거래가 시장에 상당한 영향을 미칠 수 있기 때문에 시장에서 폭넓은 주목을 받았습니다.
예를 들어, 어떤 주식의 시장 심도가 원래 다음과 같았다고 가정해 보겠습니다. 200 | \(1.01 x \)1.03 | 200. 그러자 “코끼리”가 들어와서 1.01달러에 주식 3,000주를 매수하는 주문을 냈습니다. 이 시점에서 시장 깊이는 3,200 | \(1.01 x \)1.03 | 200이 됩니다. 이러한 행동은 시장의 다른 참여자들의 관심의 대상이 되는 “코끼리”를 소개하는 것과 같습니다.
경쟁 시장 고빈도 트레이더의 경우, 수익은 주로 시장 미시구조를 분석하여 다른 트레이더의 의도를 추론하는 데서 발생합니다. 코끼리가 나타나면, 고빈도 트레이더는 미미한 가격 변동을 포착하기 위해 빠르게 포지션을 구축합니다. 그들의 목표는 짧은 기간 동안 빈번한 거래를 통해 작지만 누적된 이익을 얻는 것입니다.
코끼리의 처지 코끼리는 시장에서 규모 있게 활동하고 싶어하지만, 그들의 행동은 거래 의도를 배신하기 때문에 고빈도 거래자의 표적이 됩니다. 고빈도 트레이더는 사전에 포지션을 구축한 후 가격 변동으로 수익을 얻으려고 합니다. 시장에 코끼리가 존재하면 경쟁 시장에서 반응이 일어날 수 있고, 따라서 거래 전략에 영향을 미칠 수 있습니다.
시장의 속임수 실제로 대규모 기관 투자자들은 일반적으로 시장에서 노골적으로 많은 수의 매수 또는 매도 주문을 내지 않는다. 그러한 행동으로 인해 다른 시장 참여자가 대응 조치를 취하거나 심지어 시장을 조작할 수 있기 때문이다. 따라서 이들은 고빈도 트레이더를 시장에 유입시키기 위해 허위 인상을 주는 전략을 채택한 다음, 가격 변동을 이용해 빠르게 매도하거나 매수하여 이익을 낼 수 있습니다.
페니 점프 전략의 핵심 아이디어는 코끼리가 시장에 등장하여 특정 가격(예: 1.01달러)을 뒷받침하면 고빈도 트레이더가 빠르게 입찰가를 1센트씩 올려 예를 들어 1.02달러로 올린다는 것입니다. 고빈도 트레이더는 코끼리의 출현이 해당 가격 수준에서 강력한 매수 지지가 있다는 것을 의미한다는 것을 알고 있기 때문에, 가격이 상승할 것이라는 희망을 가지고 코끼리를 따라가려고 하기 때문입니다. 가격이 1.03달러 x 1.05달러로 상승하면, 고빈도 트레이더는 재빨리 매도하여 0.01달러의 수익을 낼 수 있습니다.
그뿐만 아니라, 고빈도 트레이더는 가격이 오르지 않더라도 매수 후 수익을 낼 수 있습니다. 그들은 코끼리가 최저가를 지탱한다는 것을 알고 있기 때문에 코끼리에게 주식을 재빨리 팔고 그 차액으로 소액의 이익을 낼 수 있습니다.
전략 소스 코드: https://www.fmz.com/strategy/358
위에 제공된 전략 코드는 페니 점프 전략을 구현한 예입니다. 초보자가 코드의 작동 방식을 이해할 수 있도록 자세한 설명을 제공합니다.
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);
}
}
귀하가 제공하신 전략 코드를 줄마다 살펴보고 그 작동 방식을 더 자세히 이해하도록 도와드리겠습니다.
var Counter = {
i: 0,
w: 0,
f: 0
};
이 코드는 전략의 거래 통계를 추적하는 데 사용되는 Counter라는 객체를 초기화합니다. 구체적으로는 다음 세 가지 속성이 포함됩니다.
이러한 속성은 정책 실행 중에 기록되고 업데이트됩니다.
var InitAccount = null;
이 코드 줄은 전략이 실행되기 시작할 때 계정 정보를 저장하는 InitAccount라는 변수를 초기화합니다.
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);
}
}
이것은CancelAll()이 기능의 목적은 시장의 모든 미결 주문을 취소하는 것입니다. 단계별로 기능을 설명해 보겠습니다.
while (true): 이는 미처리 주문이 없을 때까지 실행되는 무한 루프입니다.var orders = _C(exchange.GetOrders): 이 코드 줄은 exchange.GetOrders 함수를 사용하여 현재 계정의 모든 보류 중인 주문을 가져와 orders 변수에 저장합니다.if (orders.length == 0): 이 코드 줄은 처리되지 않은 주문이 있는지 확인합니다. orders 배열의 길이가 0이면, 처리되지 않은 주문이 없다는 것을 의미하고 루프가 중단됩니다.for (var i = 0; i < orders.length; i++): 이는 모든 미처리 주문을 반복하는 for 루프입니다.exchange.CancelOrder(orders[i].Id): 이 코드 줄은 exchange.CancelOrder() 함수를 사용해 주문 ID를 기준으로 각 주문을 취소합니다.Sleep(Interval): 이 코드 줄은 주문 취소 작업이 너무 빈번하지 않도록 일정 시간(밀리초) 동안 기다리는 대기 주기를 도입합니다.이 기능의 목적은 주요 전략을 실행하기 전에 미처리 주문이 없는지 확인하여 주요 전략의 실행을 방해하지 않는 것입니다.
function updateStatus(msg) {
LogStatus("调戏次数:", Counter.i, "成功:", Counter.w, "失败:", Counter.f, "\n" + msg + "#0000ff\n" + new Date());
}
이것은updateStatus(msg)거래 상태 정보를 업데이트하고 기록하는 기능입니다. 일반적으로 현재 시장 상황에 대한 정보를 포함하는 msg 매개변수를 허용합니다. 이 함수의 구체적인 작업은 다음과 같습니다.
사용LogStatus()이 기능은 전략이 실행될 때 상태 표시줄에 표시되는 정보를 기록합니다. 거래 건수, 성공 건수, 실패 건수에 대한 텍스트를 보여줍니다.
첨부된msg현재 시장 상황에 대한 정보를 포함하는 매개변수입니다.
현재 타임스탬프가 추가됩니다(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);
}
}
이는 전략의 주요 실행 기능입니다.main()여기에는 전략의 핵심 논리가 포함되어 있습니다. 이 작업의 작동 방식을 줄별로 설명하겠습니다.
if (DisableLog): 이 코드 줄은 DisableLog 변수가 true인지 확인하고, true이면 로깅을 비활성화합니다. 이는 정책이 불필요한 정보를 기록하지 않도록 하기 위한 것입니다.
CancelAll(): 이전에 설명한 CancelAll() 함수를 호출하여 완료되지 않은 주문이 없는지 확인합니다.
InitAccount = _C(exchange.GetAccount): 이 코드 줄은 현재 계좌 정보를 가져와 InitAccount 변수에 저장합니다. 이는 전략 실행이 시작될 때 계정 상태를 기록하는 데 사용됩니다.
var i = 0; 그리고 var locks = 0;: 후속 전략 논리에 사용될 두 변수 i와 locks를 초기화합니다.
while (true): 이는 무한 루프이며 주로 전략의 연속 실행에 사용됩니다.
다음으로 라인별로 설명드리겠습니다.while (true)루프 내부의 주요 전략 논리.
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): 이 코드 줄은 전략의 실행 빈도를 제어하기 위해 일정 시간 동안 전략을 대기 상태로 둘 수 있도록 합니다. Interval 매개변수는 수면 간격을 밀리초 단위로 정의합니다.
var depth = _C(exchange.GetDepth): 매도 및 매수 주문의 가격과 수량을 포함한 현재 시장 심도 정보를 얻으세요. 이 정보는 depth 변수에 저장됩니다.
if (depth.Asks.length === 0 || depth.Bids.length === 0): 이 코드 줄은 시장 심도 정보를 확인하여 매도 및 매수 주문이 모두 있는지 확인합니다. 그 중 하나라도 존재하지 않는다면 시장에 거래 정보가 충분하지 않다는 의미이며, 이 전략은 계속해서 기다리게 됩니다.
updateStatus("搜索大象中.... 买一: " + depth.Bids[0].Price + ", 卖一:" + depth.Asks[0].Price + ", 锁定次数: " + locks): 이 코드 줄은 전략의 상태 정보를 업데이트하기 위해 updateStatus 함수를 호출합니다. 현재 시장 상황을 기록하며, 여기에는 매수 가격, 매도 가격, 이전 잠금 수 등이 포함됩니다.
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;: 조건을 충족하는 판매 주문 가격을 저장하는 데 사용될 askPrice 변수를 초기화합니다.
for (i = 0; i < depth.Asks.length; i++): 이는 시장 매도 주문의 가격 및 수량 정보를 반복하는 데 사용되는 for 루프입니다.
if (depth.Asks[i].Amount >= Lot): 루프에서 각 판매 주문의 수량이 지정된 Lot보다 크거나 같은지 확인합니다. 그렇다면, 매도 주문의 가격을 askPrice에 저장하고 루프를 종료합니다.
if (askPrice === 0): 만족스러운 매도 주문이 발견되지 않으면(askPrice가 여전히 0인 경우), 전략은 계속 대기하고 후속 작업을 건너뜁니다.
var elephant = null;: “코끼리”로 식별된 구매 주문 정보를 저장하는 데 사용될 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;
시장 매수 주문의 가격 및 수량 정보를 계속 반복하면서 첫 번째 매수 주문(Bids)을 건너뜁니다.[0])。
if ((askPrice - depth.Bids[i].Price) > ElephantSpace): 현재 매수 가격과 매도 가격의 차이가 ElephantSpace보다 큰지 확인합니다. 그렇다면 “코끼리”로부터 충분히 멀리 떨어져 있다는 의미이므로 해당 전략은 검색을 계속 진행하지 않습니다.
if (depth.Bids[i].Amount >= ElephantAmount): 현재 매수 주문 금액이 ElephantAmount보다 크거나 같은지 확인합니다. 그렇다면, 매수 주문 정보를 elephant 변수에 저장합니다.
if (!elephant): “코끼리”를 찾을 수 없으면 잠금 횟수를 0으로 재설정하고 계속 기다립니다.
locks++: “코끼리”가 발견되면 잠금 수가 증가합니다. 이는 “코끼리”의 존재가 일정 기간 동안 여러 번 확인된 후에도 전략이 실행되도록 보장하기 위한 것입니다.
if (locks < LockCount): 잠금 개수가 요구 사항(LockCount)에 도달했는지 확인합니다. 요구사항을 충족하지 못하면 계속 기다리세요. 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)): 발견된 “코끼리”의 장비 위치와 관련 정보를 포함하여 전략의 현재 상태를 기록하려면 updateStatus 함수를 호출합니다. 이는 정책의 상태 열에 표시됩니다.
exchange.Buy(elephant.Price + PennyTick, Lot, "Bids[" + i + "]", elephant): 교환.구매 기능을 사용하여 찾은 “코끼리”를 구매하세요. 구매 가격은 elephant.Price + PennyTick이고, 구매 수량은 Lot이며, 구매 작업은 “Bids”로 설명됩니다.[” + i + “]“。
var ts = new Date().getTime(): 이후 시간 간격을 계산하기 위해 현재 시간의 타임스탬프를 가져옵니다.
while (true): “코끼리” 매수 주문이 실행될 때까지 기다리기 위해 새로운 무한 루프를 입력합니다.
Sleep(CheckInterval): 이 전략은 주문 상태를 확인하는 빈도를 제어하기 위해 일정 시간 동안 휴면 상태에 있습니다.
var orders = _C(exchange.GetOrders): 현재 계정의 모든 주문 정보를 가져옵니다.
if (orders.length == 0): 완료되지 않은 주문이 있는지 확인하고, 없으면 즉시 삭제합니다.
(new Date().getTime() - ts) > WaitInterval: 현재 시간과 “코끼리”가 구매되는 시간 사이의 시간 간격을 계산합니다. WaitInterval을 초과하면 대기 시간이 초과되었음을 의미합니다.
for (var i = 0; i < orders.length; i++): 완료되지 않은 모든 주문을 반복합니다.
exchange.CancelOrder(orders[i].Id): 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): 현재 계좌 정보를 가져옵니다.
var opAmount = _N(account.Stocks - InitAccount.Stocks): “코끼리”를 구매한 후 계정 자산의 변화를 계산합니다. 변화가 0.001보다 작으면 구매가 실패했음을 의미하며, 실패 횟수가 늘어나고 다음 주기가 계속됩니다.
updateStatus("买单得手: " + opAmount + ", 开始出手..."): “코끼리”의 구매 성공 정보를 포함하여 구매 수량을 기록합니다.
exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount): 성공적으로 구매한 “코끼리”를 판매하여 수익을 내기 위해 exchange.Sell 기능을 사용합니다. 판매 가격은 elephant.Price + (PennyTick * ProfitTick)입니다.
판매 주문 실행을 기다리며 새로운 무한 루프에 들어갑니다.
var depth = _C(exchange.GetDepth): 시장 심층 정보를 얻으세요.
if (depth.Bids.length > 0 && depth.Bids[0].Price <= (elephant.Price - (STTick * PennyTick))): 시장 심도 정보를 확인하세요. 시장 가격이 손절매 가격까지 떨어졌다면 손절매 작업을 실행하세요.
CancelAll(): CancelAll() 함수를 호출하여 완료되지 않은 모든 주문을 취소하고 포지션 위험을 방지합니다.
if (opAmount < 0.001): 구매 수량을 다시 확인하세요. 0.001보다 작으면 구매가 실패하고 루프가 종료됩니다.
exchange.Sell(depth.Bids[0].Price, opAmount): 손절매 작업을 실행하고 남은 자산을 현재 시장 최저가에 매도합니다.
마지막으로 거래가 성공했는지 여부에 따라 성공 횟수와 실패 횟수를 업데이트하여 거래 수익을 기록합니다.
이는 전체 전략에 대한 줄별 설명입니다. 이 전략의 핵심 아이디어는 시장에서 “코끼리”(대량 매수 주문)를 찾아 사서 소액의 이익을 위해 파는 것입니다. 여기에는 구매 수량(Lot), 오류 재시도 간격(Interval), 엘리펀트 레벨(ElephantAmount), 엘리펀트 거리(ElephantSpace) 등과 같은 몇 가지 중요한 매개 변수가 포함되어 있어 전략의 동작을 조정합니다.
일반적으로 이 전략은 시장 심도 정보를 활용하고, 대량 매수 주문을 식별하고, 단시간 내에 매수 및 매도 거래를 실행하는 것을 목표로 하는 고빈도 거래 전략입니다. 시장을 지속적으로 모니터링하고 매수 및 매도 작업을 실행하여 신속하게 소액의 이익을 내는 것이 필요합니다. 그러나 이는 시장 변동에 신속하게 대응해야 하며, 상당한 손실을 피하기 위해 위험 관리와 손절매 메커니즘을 고려해야 하기 때문에 위험성이 높은 전략이기도 합니다.
이 전략은 특정 시장 및 거래 플랫폼을 기반으로 하며, 다양한 시장 및 거래소에 맞게 적절히 조정 및 최적화해야 할 수도 있습니다. 실제 적용 시, 투자자는 전략의 성과를 신중하게 테스트하고 평가하여 해당 전략이 자신의 투자 목표와 위험 허용 범위와 일치하는지 확인해야 합니다.
전략을 계속 실행하면 전략이 계속 반복되어 다음과 같은 일이 발생합니다.
먼저, 전략은 현재 매도 및 매수 주문을 이해하기 위해 시장 심도 정보를 확인합니다.
다음으로, 전략은 매도 주문 수량이 Lot보다 크거나 같은 조건을 충족하는 매도 주문을 찾으려고 시도합니다. 조건을 충족하는 매도 주문이 발견되면, 매도 주문 가격은 askPrice로 기록됩니다.
그런 다음 전략은 “코끼리”(대량 매수 주문)를 계속 찾습니다. 시장에서 매수 주문을 반복하면서 첫 번째 매수 주문(일반적으로 가장 높은 가격의 매수 주문)을 건너뜁니다. 조건에 맞는 “코끼리”가 발견되면, “코끼리”의 정보가 기록되고 잠금장치의 개수가 늘어납니다.
충분한 “코끼리”가 연속적으로 발견되면(LockCount 매개변수로 제어됨) 전략은 다음 작업을 추가로 수행합니다.
전체 전략은 가능한 한 많은 “코끼리”를 잡고 아주 작은 이익을 얻기 위해 위의 작업을 지속적으로 반복합니다. 이는 시장 변화에 신속하게 대응해야 하는 동시에 자본을 보호하기 위한 위험 관리 및 손절매 메커니즘을 고려해야 하는 고빈도 거래 전략입니다. 투자자는 특히 변동성이 높은 시장에서는 이 전략을 사용하는 것을 신중하게 고려해야 합니다.
페니 점프 전략은 고빈도 거래의 전형적인 사례로, 시장 참여자 간의 미묘한 게임과 경쟁을 보여줍니다. 이러한 전략은 특히 변동성이 높고 기관 투자자와 고빈도 거래자가 빠른 수익을 모색하는 암호화폐 시장에서 두드러집니다. 하지만 이로 인해 시장은 어려움을 겪게 되며, 경쟁 우위를 유지하기 위해서는 지속적인 적응과 전략 조정이 필요합니다. 오늘날 경쟁이 치열한 세상에서는 시장의 미시구조를 잘 관찰하고 신속하게 대응하는 트레이더만이 성공할 수 있습니다.