이 전략은 헐 이동 평균, 피셔 변환 지표 및 상품 채널 지표를 적응 가능한 다중 요인 전략으로 결합합니다. 트렌드를 지능적으로 식별하고 매개 변수를 자동으로 조정하고 다른 제품과 주기에 적응 할 수 있습니다.
이 전략의 핵심 논리는 피셔 트랜스포름 지표의 금색 십자와 죽은 십자 를 기반으로 입점과 출구를 결정합니다. 피셔 트랜스포름 지표는 전환점을 더 정확하게 판단하기 위해 이동 평균과 오시레이터의 장점을 결합합니다.
이 전략은 먼저 홀 이동 평균과 피셔 변환 지표를 계산합니다. 그 다음 재화 채널 지표의 도움으로 입구 조건을 형성합니다. 피셔 변환 지표가 제로 선 아래에서 위를 넘거나 설정된 매개 변수 범위 밖에서 위를 넘을 때 긴 신호를 형성하기 위해 황금 십자 조건으로 설정됩니다. 피셔 변환이 제로 선 위 또는 매개 변수 범위 밖에서 아래로 넘을 때 짧은 신호를 형성하기 위해 죽은 십자 조건으로 설정됩니다.
출구 조건은 반대로, 황금 십자가에 열린 긴 주문은 죽은 십자가에 닫히고, 죽은 십자가에 열린 짧은 주문은 황금 십자가에 닫히고, 이는 트렌드 반전 지점을 캡처하기 위해 지표의 크로스오버를 사용합니다.
이 전략의 가장 큰 장점은 적응력 있는 다중 요인이다. 이동 평균, 오시레이터 및 트렌드 지표를 활용하여 하락 및 상승 시장 모두에서 좋은 성과를 거두게 된다. 또한 변수들은 다양성과 주기에 따라 조정하여 적응성을 달성할 수 있다.
또한 전략에는 자동 스톱 로스 메커니즘이 포함되어 있습니다. 가격이 헐 이동 평균 이상으로 떨어지면 자동으로 손실을 중단하여 종료됩니다. 이것은 전략의 손실 위험을 크게 줄입니다.
이 전략의 가장 큰 위험은 지표 사이의 오류 신호입니다. 가격이 옆으로 움직일 때 지표는 불필요한 교차를 일으킬 수 있습니다. 이것은 불필요한 엔트리 및 스톱 로스로 이어질 수 있습니다.
해결책은 일부 작은 신호를 필터링하기 위해 표시기 매개 변수를 적절히 조정하는 것입니다. 또는 확인을 위해 더 많은 보조 표시기를 결합하십시오. 예를 들어 진정한 신호를 결정하기 위해 볼륨 표시기를 추가하십시오.
이 전략은 다음과 같은 방향으로 최적화 될 수 있습니다.
자동 매개 변수 최적화를 위해 기계 학습 알고리즘을 추가합니다. 역사적 데이터에 기반하여 훈련하고 실시간으로 지표 매개 변수를 조정할 수 있습니다.
점수를 위한 더 많은 지표를 추가하고, 다수결정 전략을 취하고, 결정의 정확성을 향상시킵니다.
오류를 피하기 위해 중요한 가격 수준과 채널을 다시 확인하는 브레이크아웃 확인 메커니즘을 추가합니다.
위험 평가 모듈을 추가하여 시장 조건에 따라 자동으로 포지션 크기와 스톱 로스 범위를 조정할 수 있습니다.
전체적으로, 이것은 매우 좋은 적응력 있는 다중 요인 프레임워크입니다. 이동 평균의 트렌드 판단, 오시레이터의 과잉 구매 및 과잉 판매 판단, 그리고 지표 교차의 적용을 결합하여 완전한 입출장 메커니즘을 형성합니다. 추가로 최적화되고 적응력 및 지능적인 구성 요소를 증가시킬 수 있다면, 그것은 매우 높은 상업적 가치를 가진 전략 제품이 될 것입니다.
/*backtest start: 2023-01-09 00:00:00 end: 2024-01-15 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is free to copy/paste/use. no permission required. just do it! // © @SeaSide420 //@version=4 strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25) //=================================== Inputs ========================================================= period =input(title="HullMA Length", type=input.integer, defval=14, minval=2) length =input(9, minval=1, title="Signal Length") line1 = input(5, minval=2, title="Top Line") line5 = input(-5, maxval=-2, title="Bottom Line") price = input(open, type=input.source, title="Price data") entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines") entry2 =input(true,type=input.bool, title="Open when HullFisher past zero") useHMA =input(true,type=input.bool, title="Include Hull_moving_average") useCCI =input(true,type=input.bool, title="Include Commodity_channel_index") fishclose=input(true,type=input.bool, title="Close order when Fisher crossover") HMAclose=input(true,type=input.bool, title="Close order when Hull crossover") //================================ Calculations ====================================================== HMA = hma(price,period) HMA2 = HMA[1] high_ = highest(HMA, length) low_ = lowest(HMA, length) round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val value = 0.0 value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1])) value1 = 0.0 value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1]) value2 = value1[1] CCI1 = cci(price,period) CCI2 = CCI1[1] line2 = line1/2 line4 = line5/2 //================================ Draw Plots ======================================================= colorchange1 =CCI1>CCI2?color.lime:color.red colorchange2 =value1>value2?color.lime:color.red a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line") b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line") c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line") d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line") e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line") f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1") g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2") h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI") fill(f,g,color=colorchange2,transp=20,title="Color fill") plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10) plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8) plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5) //============================= Entry conditions ==================================================== // Outside Lines crossover or zero lines crossover LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA // Use CCI LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA // Use HMA LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA //Use CCI & HMA LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA //========================= Exit & Entry excecution ================================================= if HMAclose and fishclose and value1<value2 and HMA<HMA2 strategy.close("BUY") if HMAclose and fishclose and value1>value2 and HMA>HMA2 strategy.close("SELL") if HMAclose and HMA<HMA2 strategy.close("BUY") if HMAclose and HMA>HMA2 strategy.close("SELL") if fishclose and value1<value2 strategy.close("BUY") if fishclose and value1>value2 strategy.close("SELL") if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8 strategy.entry("BUY", strategy.long) if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8 strategy.entry("SELL", strategy.short)