
이 전략은 여러 퍼센티지 스탠드 엑시트를 설정하는 기능을 구현한다. 전략은 먼저 장단 조건을 판단하고, 입장이 더 많은 공백을 한다. 그리고는 사용자 정의 된 percentAsPoints 함수를 통해 퍼센티지를 가격 점수로 변환한다. 프로그램은 설정된 1%, 2%, 3%, 4%의 스탠드 퍼센티지를 따라 4개의 엑시트를 설정하고, 동시에 일반적인 2% 스탠드 엑시트를 설정한다. 이렇게 하면 여러 퍼센티지 스탠드 엑시트의 효과가 실현된다.
이 전략은 주로 sma 평균선의 다공간 교차로 진출을 판단한다. 구체적으로, 패스트 라인 sma ((14) 위를 가로질러 느린 라인 sma ((28) 을 통과하면 진출이 더 많이 이루어지고, 패스트 라인 sma ((14) 아래를 가로질러 느린 라인 sma ((28) 을 통과하면 진출이 빈 상태이다.
그러면 어떻게 여러개의 % Exit을 설정할 수 있을까요? % Exit은 % AsPoints라는 사용자 정의된 함수를 사용해서 %를 가격점으로 변환합니다. 함수의 논리는 다음과 같습니다.
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
이 함수는 포지션이 0이 아닌 경우, 포지션의 평균 가격에 퍼센티지를 곱한 다음 최소 가격으로 나누면 가격 점수를 얻습니다. 포지션이 0이라면 na를 반환합니다.
이 함수를 가지고 우리는 쉽게 퍼센티지점수를 변환할 수 있습니다. 그리고 프로그램은 설정된 1%, 2%, 3%, 4%의 정지점을 따라 4개의 출구를 설정합니다.
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
동시에 모든 Exit은 일반적인 2%의 스톱로스를 사용한다. 이렇게 하면 여러 퍼센트의 스톱로스의 효과가 실현된다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
직무에 따라 정지할 수 있고, 더 많은 돈을 벌 수 있는 기회를 놓치지 않도록 한다. 일반적으로 정지할 수 있는 범위가 더 커질수록 위험도 더 커진다. 이 전략은 위험과 이익을 균형을 잡는다.
분량 정지는 본금을 반환하여 위험을 줄일 수 있다. 예를 들어, 25%의 양을 설정하여, 수익이 1%에 도달하면 본금의 1/4을 회수할 수 있다. 이후의 포지션은 수익에 의존한다.
2%의 절감은 극단적인 상황으로 인한 엄청난 손실을 피할 수 있습니다.
코드 구현은 간단하고 명확하며, 이해하기 쉽고, 수정 및 최적화를 용이하게 한다. 사용자 정의 함수는 퍼센티지를 점수로 변환하고, 몇 줄의 코드 후에 여러 스톱을 설정할 수 있다.
이 전략에는 몇 가지 위험도 있습니다.
백분율 스톱은 수평적 변동이 발생하기 쉽고, 가격이 스톱 가격 인근에서 오동한다. 이 때 스톱 손실이 자주 발생하여 거래 빈도와 수수료 부담이 증가한다.
분량 정지 은 거래 횟수를 증가시키고, 수수료 부담도 증가시킨다. 수수료가 너무 높으면, 오히려 부분 정지 수익이 상쇄된다.
정지점 설정이 잘못되면 수익률에도 영향을 미칩니다. 너무 보수적으로 설정하면 만족스러운 수익을 얻는 것이 어렵고, 너무 급진적으로 설정하면 위험도가 너무 높습니다.
고정된 퍼센트 스티드, 시장의 변동률과 경향성을 고려하지 않는다. 흔들림 상황에서는 스티드 마이너스를 낮추고, 트렌드 상황에서는 스티드 마이너스를 늘려야 한다.
위와 같은 위험들을 고려하여, 다음의 몇 가지 측면에서 최적화를 계속할 수 있습니다:
시장의 변동률과 추세에 따라 자동으로 조정할 수 있도록 스톱 전략을 최적화하십시오. 예를 들어, ATR 스톱을 추가하고, 흔들릴 때 스톱을 강화하고, 추세에서 스톱을 느슨하게하십시오.
배열 정지 비율과 폭을 최적화하여 위험 수익의 최적의 조합을 달성하십시오. 파라미터 최적화 기능을 추가하여 최적의 파라미터를 찾아보십시오.
정지 횟수를 줄이고 너무 자주 거래하는 것을 피하십시오. 예를 들어, 가격 완충 구역을 설정하여 특정 범위를 초과 한 후에만 정지하십시오.
수수료 요소를 고려하여, 수수료 미만일 때 더 많은 수익을 얻을 수 있습니다. 또는 수수료에 따라 절감률을 최적화하십시오.
책상 상자 정지 . 깊이 우선 정지 깊이 우선 가격 우선 제안에 따라 이동 정지 가격을 피하십시오.
이 전략은 여러 퍼센티지 스톱의 효과를 실현합니다. 1% , 2% , 3% 및 4%의 스톱 엑시트를 설정하여, 근무 시간에 스톱 엑시트를 할 수 있으며, 2%의 스톱으로 비정상적인 경우의 큰 손실을 방지합니다. 이 전략은 위험 수익을 균형을 잡고 더 많은 돈을 벌 수있는 기회를 놓치지 않습니다. 그러나 가로 변동이 형성되기 쉽고 거래 빈도가 증가하는 것과 같은 위험이 있습니다.
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © adolgov
//@version=4
strategy("Multiple %% profit exits example", overlay=false, default_qty_value = 10)
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
profitPercent(price) =>
posSign = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
(price - strategy.position_avg_price) / strategy.position_avg_price * posSign * 100
p1 = plot(profitPercent(high), style=plot.style_linebr, title = "open profit % upper bound")
p2 = plot(profitPercent(low), style=plot.style_linebr, title = "open profit % lower bound")
fill(p1, p2, color = color.red)