다중 MA 제한 주문 거래 전략

저자:차오장, 날짜: 2023-09-22 14:16:20
태그:

전반적인 설명

이 거래 전략은 여러 이동 평균에 기반한 제한 주문을 설정합니다. 가격이 다른 MA 레벨을 넘어서면 다른 수의 긴 또는 짧은 제한 주문을 설정하여 피라미드 모양의 멀티 포지션을 형성합니다. 가격이 MA를 다시 넘어서면 역 제한 주문이 열립니다. 포지션을 보유 할 때 가격이 중간 MA를 넘으면 포지션은 역 시장 주문으로 닫을 것입니다.

전략 논리

이 전략은 트렌드 방향을 결정하기 위해 이동 평균을 사용합니다. 구체적으로, 가격이 3 마리의 상향 MA 라인을 통과하는지 여부에 따라 긴 제한 주문의 수를 결정합니다. 그리고 가격이 3 마리의 하향 MA 라인을 통과하는지 여부에 따라 짧은 제한 주문의 수를 결정합니다.

따라서 트렌드가 강할수록 같은 방향의 리미트 오더가 더 많이 설정됩니다. 가격이 반전 신호를 표시하면 반전 포지션이 열립니다. 중간 MA는 기존 포지션의 돌파구를 판단하고 가까운 신호를 생성하는 데 사용됩니다.

전체 전략은 피라미드 스타일의 오픈과 돌파구 스타일의 폐쇄를 결합하여 거래 논리를 형성합니다. 비용을 줄이기 위해 더 나은 평균 가격으로 포지션을 개척하는 것을 목표로하며 위험을 제어하기 위해 중간 MA를 사용합니다.

이점 분석

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

  1. 트렌드를 결정하기 위해 MAs를 사용하며, 간단하고 직관적으로 작동합니다.

  2. 피라미드 형태의 오픈은 트렌드의 초기 단계에서 더 나은 평균 가격을 얻을 수 있습니다.

  3. 중간 MA 스톱 로스는 적시에 손실을 멈추고 위험을 제어할 수 있습니다.

  4. 제한 명령은 미끄러짐을 피합니다.

  5. 사용자 정의 가능한 매개 변수는 다른 제품에 적응합니다.

  6. 명확한 구조, 이해하기 쉽고 확장할 수 있습니다.

위험 분석

이 전략의 위험은 다음과 같습니다.

  1. MA의 지연은 잘못된 판단을 일으킬 수 있습니다.

  2. 실패한 제한 주문은 출입 기회를 놓칠 수 있습니다.

  3. 중간 MA 스톱 손실은 돌파구를 판단하기에는 너무 초라할 수 있습니다.

  4. 부적절한 매개 변수 설정으로 인해 너무 큰 위치가 발생할 수 있습니다.

  5. 적당한 백테스트 기간이 지나치게 부착될 수 있습니다.

  6. 거래비용은 고려하지 않습니다.

해결책은 다음과 같습니다.

  1. 확인을 위해 다른 지표를 추가하고 매개 변수를 최적화합니다.

  2. 유효기간을 설정하고, 한계 가격을 조정합니다.

  3. 중간 MA Stop Loss에서 이익 취득 또는 논리를 추가합니다.

  4. 매개 변수를 최적화하고, 위험/이익 비율을 평가합니다.

  5. 백테스트 기간을 확장하고, 다중시장 백테스트

  6. 트랜잭션 비용과 미끄러짐 논리를 추가합니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 기계 학습 방법을 사용하여 더 많은 제품에 대한 매개 변수를 최적화합니다.

  2. MACD, KDJ 등을 확인하기 위해 다른 지표를 추가합니다.

  3. 중간에 있는 MA 선에 이윤 추출 논리를 추가합니다.

  4. 동적으로 지점 크기와 스톱 로스 레벨을 조정합니다.

  5. 더 나은 입시 비용을 위해 제한 가격을 최적화하십시오. 예를 들어 변동성을 기반으로합니다.

  6. 과잉 추격 추세를 방지하기 위해 비용을 관리하십시오.

  7. 파라미터 풀을 만들기 위해 다른 제품에서 파라미터 테스트.

결론

이 전략은 더 나은 평균 비용을 달성하기 위해 제한 주문으로 피라미드 모양의 포지션을 개척합니다. 위험을 제어하기 위해 중간에 있는 MA를 사용 합니다. 전략 구조는 간단하고 명확하고 이해하기 쉽고 확장 할 수 있습니다. 그러나 다른 지표, 최적화 매개 변수, 제한 주문 논리 등을 개선하여 더 견고하게 만들 수 있습니다. 전반적으로, 이 전략은 제한 주문 거래의 간단하고 실용적인 아이디어를 제공합니다.


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

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", 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
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//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 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//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]
lots = 0.0
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)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

더 많은