격자 기반의 긴 마틴게일 동적 포지션 격자 거래 전략

저자:차오장날짜: 2024-03-22 15:12:33
태그:

img

전략 개요

이 전략은 그리드 기반의 긴 마틴게일 동적 포지션 그리드 거래 전략이다. 주요 아이디어는 가격이 그리드 라인을 타면 기존 포지션의 수에 따라 포지션 크기를 동적으로 조정하는 동시에 최대 총 오픈 포지션을 설정하는 것입니다. 가격이 상승하고 수익 수준을 달성하면 모든 긴 포지션은 종료됩니다.

전략 원칙

  1. 가격을 그리드 사이즈 매개 변수에 따라 균등하게 배치된 그리드로 나누십시오.
  2. 각 그리드 라인에서 긴 제한 명령을 내립니다.
  3. 현재 가격이 그리드 라인을 때:
    • 현재 오픈 포지션 수가 0인 경우, start_lot 크기로 포지션을 개척합니다.
    • 현재 오픈 포지션의 수가 0보다 많고 현재 그리드 가격이 이전 엔트리 가격보다 낮다면, 이전 포지션 크기의 배수의 크기로 현재의 그리드 가격으로 새로운 롱 포지션을 개척합니다.
  4. 최대 오픈 포지션 수는 Max Open Orders 매개 변수로 제어됩니다.
  5. 포지션을 열고 나면 평균 입상 가격보다 TakeProfit 포인트로 수익을 취하는 수준을 설정합니다.
  6. 현재 가격이 이윤을 취하는 수준에 도달하면 모든 긴 포지션을 닫고 매개 변수를 재설정합니다.

이렇게하면, 하락 추세에 따라 포지션 크기가 점차 증가하고, 가격이 회복되어 수익을 취하는 수준에 도달하면 이윤이 취합니다.

전략적 장점

  1. 동적 위치 크기: 현재 개설된 위치의 수에 따라 각 항목에 대한 위치 크기를 동적으로 조정합니다. 이것은 지속적인 하락 추세 동안 노출을 점차 증가시켜 전략의 수익 잠재력을 향상시킵니다.
  2. 유연한 매개 변수: 그리드 사이즈, start_lot, 멀티팩터 및 기타 매개 변수는 그리드 크기, 초기 위치 크기, 위치 확장 요인 등을 유연하게 제어 할 수 있습니다.
  3. 제어 가능한 위험: 최대 오픈 오더스 매개 변수는 과도한 노출을 방지하기 위해 최대 개설 포지션을 제어합니다. 동시에 수익을 취하는 수준을 설정하면 적시에 수익을 취하여 인출을 제어 할 수 있습니다.

전략 위험

  1. 스톱 로스: 전략에는 스톱 로스가 없습니다. 가격이 계속 떨어지면 상당한 손실 위험이 발생할 수 있습니다.
  2. 매개 변수 민감성: 전략의 성능은 '다중 인자'와 같은 매개 변수에 매우 민감합니다. 부적절한 매개 변수는 위험을 초래할 수 있습니다.
  3. 높은 변동성: 전략은 매우 변동적인 시장 조건에서 자주 포지션을 열고 닫을 수 있으며 추가 미끄러짐 및 수수료 비용을 발생시킬 수 있습니다.

위험 관리 조치:

  1. 조심스럽게 위험 허용에 기초한 multifactor와 같은 매개 변수를 설정합니다. 필요한 경우 코드에 스톱 로스 로직을 추가 할 수 있습니다.
  2. 적절한 매개 변수를 선택하기 위해 조심스럽게 백테스트와 종이를 거래합니다.
  3. 매우 변동적인 시장 조건에서 전략의 성능을 평가합니다. 필요한 경우 매개 변수를 조정하거나 사용 시나리오를 제한함으로써 위험을 완화 할 수 있습니다.

최적화 방향

  1. 트렌드 검출을 추가합니다. 포지션을 열 때 가격 동작에 기초하여 트렌드를 결정합니다. 추세가 하향적 인 것처럼 보이는 경우 위험을 줄이기 위해 새로운 긴 포지션을 열지 마십시오.
  2. 동적 취득: 가격 행동, 변동성 및 기타 지표에 따라 취득 수준을 동적으로 조정합니다. 수익성을 높이기 위해 추세가 강한 경우 취득 수준을 높입니다.
  3. 포지션 관리 최적화: 포지션을 추가 할 때 확장 요인을 고려하는 것 외에도 계좌 잔액, 현재 노출 등을 포함하여 포지션 크기를 더 정확하게 제어하십시오.
  4. 다른 신호와 결합: 다른 트렌드 탐지, 오스실레이션 탐지 및 다른 지표 신호와 그리드 거래를 통합하여 시장을 종합적으로 판단하고 거래를 안내합니다.

이러한 최적화는 시장의 움직임을 더 잘 파악하기 위해 전략의 적응력을 향상시키고 수익 잠재력과 안정성을 향상시킬 수 있습니다. 동시에 더 정확한 위치 및 위험 관리는 마감량을 줄이고 위험/이익 비율을 향상시킬 수 있습니다.

요약

이 그리드 기반의 긴 마틴게일 동적 포지션 그리드 거래 전략은 하락 추세 동안 평균 보유 가격을 낮추기 위해 점수를 점차 추가하고 가격이 상승할 때 이익을 취합니다. 전략은 매개 변수 설정을 통해 강력한 유연성을 제공합니다. 그러나 신중한 평가와 통제를 필요로하는 상당한 잠재적 위험을 가지고 있습니다. 트렌드 탐지, 동적 영리, 포지션 최적화 및 기타 기능을 추가 할 수 있다면 전략의 성능이 더욱 향상 될 수 있습니다. 전략은 가격이 그리드 라인을 때 자동으로 포지션을 열고 추가하고, 가격이 영리 수준에 도달하면 모든 포지션을 자동으로 닫는 기능을 실현합니다. 전반적인 논리는 비교적 명확하지만 최적화 할 여지가 있습니다. 전략은 시장 조건과 매개 변수를 철저하게 평가 한 후 신중하게 사용할 수 있습니다.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
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/
// © lagerta13
//@version=4
strategy("Grid A.", shorttitle="Grid(A)", overlay=true, format=format.price, precision=4, pyramiding = 100)

input_tf=input("15", "Started TimeFrame", 
 options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
 group="TimeFrame") 

// avg_tf=input("5", "Average TimeFrame", 
//  options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
//  group="TimeFrame")

slip_Hilo = input(3.0, "Slippage by open order", group="Strategy Settings")
start_lot = input(0.01, "Start lot", group="Strategy Settings")
start_avg = input(2, "Started average since Order #", group="Strategy Settings")
MaxTrades_Hilo = input(10, "Max Open Orders", group="Strategy Settings")
dropdown_selection = input("Only Long", "Direction", options=["Only Long", "Only Short", "Long & Short"],
 group="Strategy Settings")
type_selection = input("By Close", "Type input", options=["By Close", "By grid line"],
 group="Strategy Settings")

multifactor = input(1.5, "Multifactor", group="Strategy Settings")
precision_lot = input(2, "Number of precision", group="Strategy Settings")
take_profit = input(1, "TakeProfit", group="Strategy Settings")

// PipStep_S1 = input(30)
// PipStepX_S1 = input(1.2)
// dinamicStep = input(false, "Dinamic Step for AVG")

get_size_lot_order(number, multi, prec, avg_from, lot_from) =>
	res = lot_from
	for i = 1 to number
		if i >= avg_from
			res := round(res * multi, precision = prec)
	res

var float[] entry_levels = array.new_float(MaxTrades_Hilo + 1)

for i = 0 to MaxTrades_Hilo
    array.push(entry_levels, 0)

gridSize = input(0.5, title="Grid Size")
gridLevels = int(close / gridSize) * gridSize

var int num_open_orders = 0
var float sum_price_orders = 0
var float entry_lot = 0

buy_condition = num_open_orders < MaxTrades_Hilo and gridLevels[0]<gridLevels[1] and dropdown_selection != "Only Short"

if (buy_condition)

    if num_open_orders == 0
        lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
        sum_price_orders := sum_price_orders + gridLevels[1] * lot 

        strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 
        // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 

        array.set(entry_levels, num_open_orders, gridLevels[1])

        entry_lot := entry_lot + lot
        num_open_orders := num_open_orders + 1

    else
        if gridLevels[1] < (array.get(entry_levels, num_open_orders - 1))
            lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
            sum_price_orders := sum_price_orders + gridLevels[1] * lot 
            entry_lot := entry_lot + lot

            strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 

            // +" S:" + tostring(sum_price_orders / (entry_lot)) + " Prev:" + tostring(array.get(entry_levels, num_open_orders - 1))
            // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 
            array.set(entry_levels, num_open_orders, gridLevels[1])

            num_open_orders := num_open_orders + 1


take = sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) < high ? high : na
plotshape(take, location = location.belowbar, color = color.white)


strategy.exit("tp", comment = "TP " + tostring(num_open_orders), qty = entry_lot, limit = take_profit + (sum_price_orders / entry_lot))


if sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) <= high
    num_open_orders := 0
    sum_price_orders := 0
    entry_lot := 0
    for i = 0 to MaxTrades_Hilo
        array.set(entry_levels, i, 0)

plot(gridLevels, color=color.blue, style=plot.style_circles, linewidth=2)

 

더 많은