로봇 화이트 박스 빙산 전략

저자:차오장, 날짜: 2023-09-26 21:02:21
태그:

전반적인 설명

이 전략은 이동 평균 거래에 기반합니다. 트렌드 다음 전략에 속하는 양방향 오픈 포지션을 구현하기 위해 세 단계의 긴 및 짧은 엔트리 라인을 설정합니다. 가격이 이동 평균을 통과하면 전략은 대기 주문을 배치하여 장과 짧은 포지션을 대량으로 개척합니다.

전략 논리

이 전략은 주로 이동 평균의 돌파구를 사용하여 트렌드 방향을 결정합니다. 구체적으로, 이동 평균 지표를 얻기 위해 개막 가격, 종료 가격, 최고 가격, 최저 가격 등의 수학적 평균을 계산합니다. 그 다음 이동 평균 위에 긴 엔트리 라인과 아래에 짧은 엔트리 라인을 설정합니다. 가격이 아래에서 이동 평균을 통과하면 긴 오더가 하나씩 트리거됩니다. 가격이 위에서 통과하면 짧은 오더가 하나씩 트리거됩니다.

긴 주문과 짧은 주문의 수는 점차 증가합니다. 대기 주문을 설정함으로써, 대량 오픈 포지션을 구현합니다. 예를 들어, 입구 라인 1은 1 개의 장기/단계 계약을 열고, 입구 라인 2는 1 개의 계약을 추가하고, 입구 라인 3은 또 다른 1 개의 계약을 추가합니다. 이것은 입구 비용을 다양화하고 단일 주문의 위험을 줄이는 데 도움이됩니다.

이 전략은 또한 헤지 메커니즘을 가지고 있다. 포지션 크기가 0이 아닌 경우, 이동 평균 가격에 기초한 후속 스톱 로스 주문을 설정한다. 가격이 이동 평균을 다시 깨면, 부분 수익을 잠금하고 자본을 보호하기 위해 포지션을 닫는다.

요약하자면, 이 전략은 트렌드 방향을 결정하기 위해 이동 평균 지표를 완전히 활용하고, 여러 엔트리 라인을 통해 수익 범위를 극대화하며, 스톱 로스 주문으로 위험을 제어합니다. 이것은 전형적인 트렌드 다음 전략입니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 유동 평균을 사용하여 트렌드 방향을 결정하는 것은 명확하고 실행 가능합니다. 유동 평균은 시장 소음을 효과적으로 필터하고 주요 트렌드 방향을 결정할 수 있습니다.

  2. 여러 엔트리 라인은 트렌드 러닝의 사용을 극대화합니다. 여러 엔트리 라인을 사용하면 트렌드의 전체 러닝 범위를 최대한 포착하고 수익 공간을 확장 할 수 있습니다.

  3. 대량으로 포지션을 개설하면 단일 주문 위험을 줄이고 여러 번 시장에 진출하면 주문의 위험을 다양화하고 평균 보유 비용을 줄입니다.

  4. 헤지 스톱 로스 메커니즘은 위험을 효과적으로 제어합니다. 헤지 스톱 로스 주문은 가격이 다시 이동 평균을 넘으면 빠른 스톱 로스를 실현하여 큰 손실을 피합니다.

  5. 전략 논리는 명확하고 이해하기 쉽고 다양한 시장에 최적화 될 수있는 유연한 매개 변수 설정을 제공합니다.

위험 분석

이 전략에는 몇 가지 위험이 있습니다.

  1. 이동 평균에서 잘못된 신호의 확률. 이동 평균은 지연이 있고 잘못된 신호를 줄 수 있습니다.

  2. 트렌드 역전 위험 손실로 이어집니다. 전략은 트렌드를 가정하므로 트렌드 역전으로 인해 엄청난 손실이 발생할 수 있습니다.

  3. 너무 빈번한 엔트리 라인은 거래 빈도와 미끄러짐 비용을 증가시킵니다.

  4. 팩 오픈 포지션은 포지션 크기가 너무 커지면 집중 위험성을 증가시킵니다.

  5. 부적절한 스톱 로스 포인트 설정으로 인해 조기 스톱 로스 또는 스톱 로스 포인트가 너무 작을 수 있습니다.

대응한 위험 관리 조치:

  1. 이동 평균 매개 변수를 최적화하고 적절한 기간을 선택합니다.

  2. 주요 기술 지표에 주의를 기울여 트렌드 반전 신호를 감지하고 적시에 손실을 중지하십시오.

  3. 엔트리 라인 사이의 거리를 조정하여 거래 빈도를 줄이십시오.

  4. 포지션 크기와 비율을 최적화하여 농도 위험을 제어합니다.

  5. 스톱 로스 리스크를 줄이기 위해 스톱 로스 포인트를 백테스트하고 최적화합니다.

최적화 방향

전략은 다음 측면에서 최적화 될 수 있습니다:

  1. 다른 이동 평균 매개 변수와 데이터 소스를 테스트하여 트렌드를 결정하는 가장 좋은 이동 평균 지표를 찾습니다.

  2. 최적의 매개 변수를 찾기 위해 길고 짧은 입구 라인의 간격 거리와 위치 크기 비율을 최적화합니다.

  3. 다른 지표를 필터 조건으로 추가하여 MACD, RSI 등과 같은 이동 평균에서 잘못된 신호를 피합니다.

  4. 스톱 손실 라인 위치를 최적화하거나 ATR에 기반한 스톱 손실 포인트를 동적으로 설정합니다.

  5. 모든 포지션 조건을 닫기 위해 트렌드 역전 판단을 추가합니다.

  6. 다른 시장 기간에 대한 매개 변수를 최적화합니다.

  7. 계정 사용 비율에 따라 위치 크기의 동적 조정 추가

요약

이 전략은 주로 이동평균을 기반으로 트렌드 방향을 판단하고, 트렌드 러닝을 이익의 원천으로 활용한다. 여러 엔트리 라인을 사용하며, 팩트에서 포지션을 개설함으로써, 트렌드를 효과적으로 캡처하고 수익 영역을 확장할 수 있다. 동시에, 스톱 로스 메커니즘은 위험을 제어하기 위해 사용된다. 전략 논리는 간단하고 명확하며, 초보자가 배울 수 있고, 또한 깊은 최적화를 위해 적합하다. 이것은 전형적인 트렌드 다음 전략이다.


/*backtest
start: 2022-09-19 00:00:00
end: 2023-09-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox Iceberg", shorttitle = "Robot WhiteBox Iceberg", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
lots = 0.0
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = true

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = 0.0
longline2 = 0.0
longline3 = 0.0
shortline1 = 0.0
shortline2 = 0.0
shortline3 = 0.0
longline1 := long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 := lots[1] == 0 ? long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close : longline2[1]
longline3 := lots[1] == 0 ? long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close : longline3[1]
shortline1 := short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 := lots[1] == 0 ? short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close : shortline2[1]
shortline3 := lots[1] == 0 ? short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close : shortline3[1]

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma, when = needtime)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma, when = needtime)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    strategy.cancel("TPL")
    strategy.cancel("TPS")

더 많은