이 전략은 2차 곡선의 K 선의 높고 낮은 점을 활용하여 거래 신호를 형성한다. 실제 가격이 조화 곡선을 돌파할 때 구매 및 판매 신호를 생성한다. 이 전략은 수학 모델을 사용하여 중요한 지원 및 저항을 식별하여 거래의 돌파를 시도한다.
이 전략의 주요 구성 요소와 규칙은 다음과 같습니다.
적합 높낮이점: 이차 곡선의 최소 2배를 사용하여 K선 적합 높낮이점
구매 신호: K선 종식 가격이 상궤도 곡선을 돌파했을 때 구매 신호가 발생한다.
판매 신호: K선 상장 가격이 하향 곡선을 돌파했을 때 판매 신호가 발생한다.
N주기 검증: 돌파구가 지속되는 N주기를 요구하여 효력이 발생하고, 허위 돌파구를 피한다.
평소 위치 신호: 명확한 평소 위치 신호가 없으며, 피드백 최적화를 통해 포지션 보유 시간을 결정한다.
이 전략은 수학적 모델을 통해 핵심 가격을 식별하고, 돌파할 때 진입하려고 시도하며, 전형적인 돌파 시스템 중 하나이다.
이 전략의 주요 장점들은 다음과 같습니다.
수학적 모델이 적용되어 주관적인 판단보다 객관적인 판단이 가능합니다.
거래 기술과 통계 모델을 결합한 새로운 방법.
여러 주기 검증을 도입하여 가짜 돌파구를 필터링할 수 있다.
회귀 최적화는 최적의 포지션 보유 시간을 찾습니다.
이 프로젝트의 경우, 이 프로젝트의 진행 과정이 복잡하지 않고,
모델은 자동으로 업데이트되며, 수동적인 유지보수가 필요하지 않습니다.
다양한 품종과 주기별로 파라미터 체력을 검사할 수 있다.
기계 학습을 도입하여 더 나은 최적화와 검증을 할 수 있습니다.
전체적으로 보면, 신기한 점이 많아서 탐색할 가치가 있습니다.
그러나 이 전략에는 다음과 같은 위험도 있습니다.
매칭 효과는 매개 변수 선택에 따라 달라지며, 과대 최적화될 수 있다.
이 곡선에서 손실을 완전히 피할 수 없습니다.
거래량이 고려되지 않은 채, 거래량이 상쇄될 위험이 있습니다.
통계적 중개는 장기적으로 안정적으로 초과 수익을 얻는 데 어려움이 있습니다.
복사주기는 짧고, 모델의 안정성을 검증해야 한다.
다중 품종 환경 적응성은 검증될 것이다.
고정된 포지션은 동적으로 조정할 수 없습니다.
수익 회수율은 엄격하게 평가해야 합니다.
위와 같은 분석에 따르면, 이 전략은 다음과 같은 측면에서 개선될 수 있습니다.
다양한 시장 환경에서 매개 변수의 강도를 테스트한다.
거래량 확인 지표에 가입하십시오.
출전 논리를 최적화하고 신호 품질을 향상시킵니다.
동적 포지션 관리 모델을 구축한다.
손실을 제한하는 스톱 손실 전략을 도입하십시오.
자금 관리 전략을 최적화하라
롤러블 확인
여러 품종의 안정적인 수익 능력을 평가한다.
기계 학습을 통해 모델을 최적화합니다.
이 전략은 전체적으로 혁신적이고 실험적인 가치가 있다. 그러나 통계적 중재의 장기적인 안정적인 수익은 여전히 시험에 직면해 있다. 전략의 안정성, 위험-수익 상황을 재검토하는 동안 전체적으로 검토해야 하며, 과도한 적응을 방지하고, 전략이 변화하는 시장에서 적응력을 유지하도록 한다.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
strategy(title = " Strategy Quadratic Semaphore ",
shorttitle = "SQS",
overlay = true,
precision = 8,
calc_on_order_fills = true,
calc_on_every_tick = true,
backtest_fill_limits_assumption = 0,
default_qty_type = strategy.fixed,
default_qty_value = 2,
initial_capital = 10000,
pyramiding=5,
currency = currency.USD,
linktoseries = true)
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)
FromMonth = input(defval = 1, title = "Month", minval = 1)
FromDay = input(defval = 1, title = "Day", minval = 1)
FromYear = input(defval = 2019, title = "Year", minval = 2014)
backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth = input(defval = 31, title = "Month", minval = 1)
ToDay = input(defval = 12, title = "Day", minval = 1)
ToYear = input(defval = 9999, title = "Year", minval = 2014)
Config = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length
//
max1 = sma(x1,length)
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
for i = period+1 to p+1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
if countH==p
pivotH = high[period]
buy := 1
if countL==p
pivotL = low[period]
sell := 1
//
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//
if (backTestPeriod())
strategy.entry("long", true, 1, when = buy == 1)
strategy.entry("short", false, 1, when = sell == 1)