전략에 따라 이동 평균 봉투 채널 트렌드

저자:차오장, 날짜: 2023-11-23 15:06:32
태그:

img

전반적인 설명

이동 평균 앙벨프 채널 트렌드 다음 전략은 이동 평균 선과 채널 지표를 기반으로하는 트렌드 다음 전략이다. 다단계 이동 평균 채널을 설정하여 가격 트렌드의 판단과 추적을 실현합니다. 이 전략은 또한 더 큰 트렌드를 파악하는 데 도움이되는 멀티 타임프레임 융합을 달성하기 위해 다른 시간 프레임의 이동 평균 계산을 결합합니다.

전략 논리

이 전략의 핵심 원칙은 이동 평균 라인의 트렌드 추적 기능과 엔벨프 지표의 채널 판단에 기반합니다. 전략은 이동 평균 기간, 부드러운 유형, 가격 소스 등과 같은 구성 가능한 매개 변수를 사용하여 기본 이동 평균을 구축합니다. 그 다음 매개 변수에서 설정된 비율 변화 값에 따라 상승 및 하락 채널이 설정됩니다. 가격이 하위 채널을 통과하면 길게 이동합니다. 가격이 상위 채널을 통과하면 짧게 이동합니다. 동시에 전략은 독립적인 이동 평균을 중지 손실 라인으로 도입합니다.

특히 전략은 다음과 같은 특징을 가지고 있습니다.

  1. 길고 짧은 연산을 모두 지원합니다. 위와 아래 채널을 통해 트렌드 방향을 판단합니다.

  2. 최대 4개의 오더를 열고, 폴리라인 레이어를 통해 피라미드 오더를 열어서 더 큰 수익을 추구합니다.

  3. 정확한 스톱 손실을 달성하기 위해 독립적인 개시 이동 평균과 폐쇄 이동 평균을 구성합니다.

  4. 여러 시간 프레임 융합을 달성하기 위해 다른 시간 프레임 (1분에서 1일) 의 이동 평균 계산을 지원합니다.

  5. 열기와 닫는 이동 평균은 다양한 품종과 사이클에 최적화 될 수있는 6 가지 다른 평형 모드의 선택을 지원합니다.

  6. 긍정적인 오프셋과 부정적인 오프셋을 입력하여 채널을 조정하고 더 정확한 돌파구를 추구할 수 있습니다.

전략의 구체적인 거래 논리는 다음과 같습니다.

  1. 벤치마크의 개시 이동 평균을 계산하고, 설정된 매개 변수 비율에 따라 4개의 돌파선을 얻습니다.

  2. 가격이 하위 채널 라인을 뚫고 갈 때, 긴 지점을 개척하고, 가격이 상위 채널 라인을 뚫고 갈 때, 짧은 지점을 개척합니다.

  3. 독립적인 폐쇄 이동 평균을 스톱 로스 라인으로 계산합니다. 가격이 다시 라인 아래로 떨어지면 레이어에서 긴 주문을 중지하십시오. 가격이 다시 라인 위로 상승하면 레이어에서 짧은 주문을 중지하십시오.

  4. 최대 4개의 오더를 열 수 있습니다. 더 큰 수익을 추구하기 위해 계층화된 피라미드 오더 오픈을 사용하세요.

이 전략의 원칙을 통해, 이 전략은 이동 평균 라인의 트렌드 추적, 채널 판단의 돌파 신호 및 독립적인 스톱 로스 라인의 설정과 같은 요소를 통합하여 비교적 엄격하고 완전한 트렌드 시스템을 형성한다는 것을 알 수 있습니다.

이점 분석

코드와 논리 분석에 따르면, 이동 평균은 채널 트렌드를 따라 전략을 가지고 다음과 같은 장점을 가지고 있습니다.

  1. 멀티 타임프레임 융합은 대규모 트렌드를 포착하는 확률을 향상시킵니다. 전략은 1 분에서 1 일까지의 다른 사이클의 이동 평균을 계산하는 것을 지원합니다. 다른 사이클과 함께 오픈 및 스톱-손실 이동 평균을 구성하면 멀티 타임프레임 트렌드 판단 능력의 융합을 달성 할 수 있습니다. 이는 대규모 트렌드를 포착하는 데 더 유리한 것입니다.

  2. 피라미드 오더 오픈 방법은 더 큰 수익을 추구합니다. 전략은 최대 4 개의 오더를 열 수 있습니다. 계층화 된 오더 오픈을 통해 수익 비율을 균형있게 유지하며 위험을 제어하면서 더 큰 수익을 추구합니다.

  3. 6 가지 유형의 이동 평균이 선택 가능하며 적응력이 강합니다. 오픈 및 스톱 로스 이동 평균은 적응력을 향상시키기 위해 다양한 품종과 주기에 최적화 할 수있는 SMA / EMA / 동적 이동 평균을 포함한 6 가지 모드의 선택을 지원합니다.

  4. 조정 가능한 채널 라인은 돌파구 판단을 더 정확하게합니다. 전략은 돌파구 판단의 정확성을 향상시키는 다른 품종 또는 시장 환경에 대한 최적화를 위해 채널 너비를 조정하기 위해 채널 이동 비율 매개 변수를 입력 할 수 있습니다.

  5. 독립적 인 스톱 로스 라인은 위험 통제에 도움이 됩니다. 전략은 독립적인 이동 평균 라인을 장기 또는 짧은 주문을 중단하기 위한 폐쇄 라인으로 계산하여 거래 위험을 크게 줄이고 손실 주문으로 추격을 피할 수 있습니다.

  6. 코드 구조는 명확하고 쉽게 개발할 수 있다. 전략은 파인 스크립트로 작성되어 명확한 구조와 이해하기 쉽고 개발할 수 있다. 사용자는 기존 프레임워크를 기반으로 매개 변수를 최적화하거나 다른 논리를 추가할 수 있다.

위험 분석

전체적인 전략 논리가 엄격하고 위험 통제가 이루어졌지만, 여전히 몇 가지 거래 위험을 알아야 합니다. 특히 다음과 같습니다.

  1. 대규모 트렌드 역전 위험. 전략의 핵심 가정은 가격이 일정하게 추세와 함께 계속 진행될 것이라는 것입니다. 그러나 대규모 트렌드가 역전되면 전략의 수익성에 더 큰 영향을 미칠 것입니다. 손실을 통제하기 위해 적시에 손실을 중단해야합니다.

  2. 유효하지 않은 돌파구 위험. 측면 또는 쇼크 시장에서, 가격은 돌파구를 통과 한 후 채널 라인 아래로 다시 떨어질 수 있으며, 이로 인해 주문을 잃어 버리는 것을 초래할 수 있습니다. 이러한 경우를 줄이기 위해 매개 변수를 최적화해야합니다.

  3. 기대 관리 위험. 전략은 더 큰 수익을 추구하기 위해 4 층의 피라미드 주문을 설정하여 수익 기간 동안 상당한 수익을 창출하지만 손실 기간 동안 기대의 급격한 하락을 초래합니다. 이것은 투자자가 전문적인 심리적 관리 기술을 갖추어야합니다.

  4. 신호 최적화 위험. 이 전략은 채널 너비와 이동 평균 사이클과 같은 여러 매개 변수에서 조정 및 최적화를 포함합니다. 이는 과도한 적합성을 피하기 위해 전문 쿼트가 최적화 경험을 갖도록 요구합니다.

  5. 특별한 시장 조건 위험: 빠른 격차 또는 짧은 라인 제한과 같은 극단적인 시장 조건은 전략 논리를 크게 손상시킬 것입니다. 따라서 적절한 시간 stop 손실을 위해 체계적 위험 측정에주의를 기울여야합니다.

일반적으로 전략은 수익성을 위해 주로 대규모 트렌드 이득에 의존하고 있으며 장기 지속성 특성을 가진 품종과 시장 환경에만 적용됩니다. 또한 전략의 안정적인 수익성을 보장하기 위해 다중 매개 변수 최적화 및 사고력 통제도 중요합니다.

최적화 방향

이 이동 평균은 채널 트렌드를 따라 전략을 위해 주요 최적화 방향은 다음을 포함합니다.

  1. 기계 학습 알고리즘을 기반으로 채널 라인과 스톱 로스 라인의 적응 최적화. LSTM 및 궤도 예측과 같은 모델은 더 똑똑한 가격 예측 및 위험 피기를 달성하기 위해 채널 및 스톱 로스 라인 모델을 훈련하는 데 사용할 수 있습니다.

  2. 감정 지표, 포트폴리오 가중 비율과 같은 보조 요인을 포함하여 피라미드 논리를 최적화하십시오. 절대 변동성 및 시장 정서와 같은 요인은 포트폴리오 위험을 제어하고 피라미드 주문 개시 논리를 최적화하기 위해 추가 될 수 있습니다.

  3. 거래 비용 및 미끄러짐 모델을 도입하여 백테스팅의 진정성을 향상시킵니다. 현재 백테스팅은 실제 거래의 중요한 요소인 수학 모델에 포함되어야하는 거래 비용의 영향을 고려하지 않습니다.

  4. 동일한 자산 클래스를 통한 상관 분석을 확장하여 단일 리스크 제어 프레임워크를 구축합니다. 현재 단일 자산 전략을 상품 및 암호화폐와 같은 여러 유사한 시장으로 확장하고 전략 안정성을 향상시키기 위해 상관 분석을 통해 위험 통제를 통합하십시오.

  5. 사용자 친화성을 개선하기 위해 전략 설명성을 높입니다. SHAP와 같은 방법을 사용하여 전략 결과에 대한 각 입력 변수의 중요성을 분석하고, 출력 중요성 순위를 높이고, 전략 논리를 사용자에게 더 투명하고 해석 할 수 있습니다.

머신러닝과 멀티 팩터 모델과 같은 알고리즘을 도입하여 전략 안정성, 진정성 및 사용성을 더욱 최적화하는 것이 앞으로 나아가는 주요 개선 방향입니다.

요약

요약하자면, 이동 평균은 이동 평균의 트렌드 추적, 채널 지표의 트렌드 식별 및 위험 통제를 위한 독립적인 스톱 로스 라인 등의 세 가지 핵심 요점을 통합합니다. 엄격한 트렌딩 시장에서 전략은 수익에 따른 트렌드의 합리적인 양과 함께 안정적인 수익을 제공할 수 있습니다. 그러나 사용자는 거시 시장 환경에주의를 기울이고 매개 변수를 적절히 최적화하고 위험을 관리해야 전략이 복잡하고 끊임없이 변화하는 거래 시장에 적응 할 수 있습니다. 전반적으로 전략은 사용자에게 비교적 완전하고 엄격한 트렌드 추적 솔루션을 제공하고 독자 개발 및 2차 개발에 매우 적합한 양적 전략 프레임워크입니다.


/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the GNU Affero General Public License v3.0 at https://www.gnu.org/licenses/agpl-3.0.html
//@version=4
strategy(title = "HatiKO Envelopes", shorttitle = "HatiKO Envelopes", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 4, initial_capital=10, calc_on_order_fills=false)

//Settings
isLotSizeAvgShifts=input(true, title ="Calculate lot size with avgPrice shifts (HatiKO  calculate)")

lotsize_Short = input(100, defval = 100, minval = 0, maxval = 10000, title = "Lot short, %")
lotsize_Long = input(100, defval = 100, minval = 0, maxval = 10000, title = "Lot long, %")

//Shorts Open Config
timeFrame_Short =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Short")
ma_type_Short = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Short")
Short_Data_input = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Short")
len_Short = input(3, minval = 1, title = "MA Length Short")
offset_Short = input(0, minval = 0, title = "MA offset Short")

//Longs Open Config
timeFrame_Long =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Long")
ma_type_Long = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Long")
Long_Data_input = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Long")
len_Long = input(3, minval = 1, title = "MA Length Long")
offset_Long = input(0, minval = 0, title = "MA offset Long")

//Shorts Close Config
isEnableShortCustomClose=input(false, title ="Mode close MA Short")
timeFrame_close_Short = input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Short Close")
ma_type_close_Short = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Close Short")
Short_Data_input_close = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Short Close")
len_Short_close = input(3, minval = 1, title = "MA Length Short Close")
shortDeviation = input( 0.0, title = "Short Deviation %",step=0.1)
offset_Short_close = input(0, minval = 0, title = "MA offset Short Close")

//Longs Close Config
isEnableLongCustomClose=input(false, title ="Mode close MA Long")
timeFrame_close_Long =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Long Close")
ma_type_close_Long = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Close Long")
Long_Data_input_close = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Long Close")
len_Long_close = input(3, minval = 1, title = "MA Length Long Close")
longDeviation = input( -0.0, title = "Long Deviation %",step=0.1)
offset_Long_close = input(0, minval = 0, title = "MA offset Long Close")

shift_Short4_percent = input(0.0, title = "Short Shift 4")
shift_Short3_percent = input(10.0, title = "Short Shift 3")
shift_Short2_percent = input(7.0, title = "Short Shift 2")
shift_Short1_percent = input(4.0, title = "Short Shift 1")
shift_Long1_percent = input(-4.0, title = "Long Shift 1")
shift_Long2_percent = input(-7.0, title = "Long Shift 2")
shift_Long3_percent = input(-10.0, title = "Long Shift 3")
shift_Long4_percent = input( -0.0, title = "Long Shift 4")
isEnableDoubleLotShift3_Long=input(false, title ="Shift3 Long LotSize*2")
isEnableDoubleLotShift3_Short=input(false, title ="Shift3 Short LotSize*2")

year_Start = input(19, defval = 19, minval = 10, maxval = 99, title = "From Year 20XX")
year_End = input(99, defval = 99, minval = 10, maxval = 99, title = "To Year 20XX")
month_Start = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
month_End = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
day_Start = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
day_End = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

short4_isActive = shift_Short4_percent != 0 and lotsize_Short > 0
short3_isActive = shift_Short3_percent != 0 and lotsize_Short > 0
short2_isActive = shift_Short2_percent != 0 and lotsize_Short > 0
short1_isActive = shift_Short1_percent != 0 and lotsize_Short > 0
long1_isActive = shift_Long1_percent != 0 and lotsize_Long > 0
long2_isActive = shift_Long2_percent != 0 and lotsize_Long > 0
long3_isActive = shift_Long3_percent != 0 and lotsize_Long > 0
long4_isActive = shift_Long4_percent != 0 and lotsize_Long > 0

mult = 1 / syminfo.mintick
is_time_true = time > timestamp(2000+year_Start, month_Start, day_Start, 00, 00) and time < timestamp(2000+ year_End, month_End, day_End, 23, 59)

//MA
TFsecurity_Short = timeFrame_Short == "4H"?60*4:timeFrame_Short=="3H"?60*3:timeFrame_Short=="2H"?60*2:timeFrame_Short=="1H"?60:timeFrame_Short=="45m"?45:timeFrame_Short=="30m"?30:timeFrame_Short=="20m"?20:timeFrame_Short=="15m"?15:timeFrame_Short=="10m"?10:timeFrame_Short=="5m"?5:timeFrame_Short=="3m"?3:1
TFsecurity_Long = timeFrame_Long == "4H"?60*4:timeFrame_Long=="3H"?60*3:timeFrame_Long=="2H"?60*2:timeFrame_Long=="1H"?60:timeFrame_Long=="45m"?45:timeFrame_Long=="30m"?30:timeFrame_Long=="20m"?20:timeFrame_Long=="15m"?15:timeFrame_Long=="10m"?10:timeFrame_Long=="5m"?5:timeFrame_Long=="3m"?3:1

oc2 = (open + close) / 2
lag_Short = (len_Short - 1) / 2//floor((len_Short - 1) / 2)
lag_Long = (len_Long - 1) / 2 //floor((len_Long - 1) / 2)

source_Short = Short_Data_input == "1.Open" ? open : Short_Data_input == "2.High" ? high : Short_Data_input == "3.Low" ? low : Short_Data_input == "4.Close" ? close : Short_Data_input == "5.HL2" ? hl2 : Short_Data_input == "6.HLC3" ? hlc3 : Short_Data_input == "7.OHLC4" ? ohlc4 : Short_Data_input == "8.OC2" ? oc2: close
source_Long = Long_Data_input == "1.Open" ? open : Long_Data_input == "2.High" ? high : Long_Data_input == "3.Low" ? low : Long_Data_input == "4.Close" ? close : Long_Data_input == "5.HL2" ? hl2 : Long_Data_input == "6.HLC3" ? hlc3 : Long_Data_input == "7.OHLC4" ? ohlc4 : Long_Data_input == "8.OC2" ? oc2: close

preS_MA_Short = ma_type_Short == "1. SMA" ? sma(source_Short, len_Short) : ma_type_Short == "2. PCMA"? (highest(high, len_Short) + lowest(low, len_Short)) / 2 : ma_type_Short == "3. EMA" ? ema(source_Short, len_Short) : ma_type_Short == "4. WMA" ? wma(source_Short, len_Short) : ma_type_Short == "5. DEMA" ? (2 * ema(source_Short,len_Short) - ema(ema(source_Short,len_Short), len_Short)) : ma_type_Short == "6. ZLEMA" ? ema(source_Short + (source_Short - source_Short[lag_Short]), len_Short) : na
preS_MA_Long = ma_type_Long == "1. SMA" ? sma(source_Long, len_Long) :ma_type_Long == "2. PCMA"? (highest(high, len_Long) + lowest(low, len_Long)) / 2 : ma_type_Long == "3. EMA" ? ema(source_Long, len_Long) : ma_type_Long == "4. WMA" ? wma(source_Long, len_Long) : ma_type_Long == "5. DEMA" ? (2 * ema(source_Long,len_Long) - ema(ema(source_Long,len_Long), len_Long)) : ma_type_Long == "6. ZLEMA" ? ema(source_Long + (source_Long - source_Long[lag_Long]), len_Long) : na
pre_MA_Short = timeFrame_Short == "Current." ? preS_MA_Short : security(syminfo.tickerid, tostring(TFsecurity_Short), preS_MA_Short)
pre_MA_Long = timeFrame_Long == "Current." ? preS_MA_Long : security(syminfo.tickerid, tostring(TFsecurity_Long), preS_MA_Long)

MA_Short = (round(pre_MA_Short * mult) / mult)[offset_Short]
MA_Long = (round(pre_MA_Long * mult) / mult)[offset_Long]

Level_Long1 = long1_isActive ? round((MA_Long + MA_Long* shift_Long1_percent / 100) * mult) / mult : na
Level_Long2 = long2_isActive ? round((MA_Long + MA_Long* shift_Long2_percent / 100) * mult) / mult : na
Level_Long3 = long3_isActive ? round((MA_Long + MA_Long* shift_Long3_percent / 100) * mult) / mult : na
Level_Long4 = long4_isActive ? round((MA_Long + MA_Long* shift_Long4_percent / 100) * mult) / mult : na
Level_Short1 = short1_isActive ? round((MA_Short + MA_Short*shift_Short1_percent/ 100) * mult) / mult : na
Level_Short2 = short2_isActive ? round((MA_Short + MA_Short*shift_Short2_percent/ 100) * mult) / mult : na
Level_Short3 = short3_isActive ? round((MA_Short + MA_Short*shift_Short3_percent/ 100) * mult) / mult : na
Level_Short4 = short4_isActive ? round((MA_Short + MA_Short*shift_Short4_percent/ 100) * mult) / mult : na

//MA_Close
lag_Short_close = (len_Short_close - 1) / 2 //floor((len_Short_close - 1) / 2)
lag_Long_close = (len_Long_close - 1) / 2 //floor((len_Long_close - 1) / 2)

pre_PCMA_Short_close = (highest(high, len_Short_close) + lowest(low, len_Short_close)) / 2
pre_PCMA_Long_close = (highest(high, len_Long_close) + lowest(low, len_Long_close)) / 2

source_Short_close = Short_Data_input_close == "1.Open" ? open : Short_Data_input_close == "2.High" ? high : Short_Data_input_close == "3.Low" ? low : Short_Data_input_close == "4.Close" ? close : Short_Data_input_close == "5.HL2" ? hl2 : Short_Data_input_close == "6.HLC3" ? hlc3 : Short_Data_input_close == "7.OHLC4" ? ohlc4 : Short_Data_input_close == "8.OC2" ? oc2: close
source_Long_close = Long_Data_input_close == "1.Open" ? open : Long_Data_input_close == "2.High" ? high : Long_Data_input_close == "3.Low" ? low : Long_Data_input_close == "4.Close" ? close : Long_Data_input_close == "5.HL2" ? hl2 : Long_Data_input_close == "6.HLC3" ? hlc3 : Long_Data_input_close == "7.OHLC4" ? ohlc4 : Long_Data_input_close == "8.OC2" ? oc2: close

preS_MA_Short_close = ma_type_close_Short == "1. SMA" ? sma(source_Short_close, len_Short_close) : ma_type_close_Short == "2. PCMA"? (highest(high, len_Short_close) + lowest(low, len_Short_close)) / 2 : ma_type_close_Short == "3. EMA" ? ema(source_Short_close, len_Short_close) : ma_type_close_Short == "4. WMA" ? wma(source_Short_close, len_Short_close) : ma_type_close_Short == "5. DEMA" ? (2 * ema(source_Short_close,len_Short_close) - ema(ema(source_Short_close,len_Short_close), len_Short_close)) : ma_type_close_Short == "6. ZLEMA" ? ema(source_Short_close + (source_Short_close - source_Short_close[lag_Short_close]), len_Short_close) : na
preS_MA_Long_close = ma_type_close_Long == "1. SMA" ? sma(source_Long_close, len_Long_close) : ma_type_close_Long == "2. PCMA"? (highest(high, len_Long_close) + lowest(low, len_Long_close)) / 2 : ma_type_close_Long == "3. EMA" ? ema(source_Long_close, len_Long_close) : ma_type_close_Long == "4. WMA" ? wma(source_Long_close, len_Long_close) : ma_type_close_Long == "5. DEMA" ? (2 * ema(source_Long_close,len_Long_close) - ema(ema(source_Long_close,len_Long_close), len_Long_close)) : ma_type_close_Long == "6. ZLEMA" ? ema(source_Long_close + (source_Long_close - source_Long_close[lag_Long_close]), len_Long_close) : na

TFsecurity_close_Short=timeFrame_close_Short=="4H"?60*4:timeFrame_close_Short=="3H"?60*3:timeFrame_close_Short=="2H"?60*2:timeFrame_close_Short=="1H"?60:timeFrame_close_Short=="45m"?45:timeFrame_close_Short=="30m"?30:timeFrame_close_Short=="20m"?20:timeFrame_close_Short=="15m"?15:timeFrame_close_Short=="10m"?10:timeFrame_close_Short=="5m"?5:timeFrame_close_Short=="3m"?3:1
TFsecurity_close_Long=timeFrame_close_Long=="4H"?60*4:timeFrame_close_Long=="3H"?60*3:timeFrame_close_Long=="2H"?60*2:timeFrame_close_Long=="1H"?60:timeFrame_close_Long=="45m"?45:timeFrame_close_Long=="30m"?30:timeFrame_close_Long=="20m"?20:timeFrame_close_Long=="15m"?15:timeFrame_close_Long=="10m"?10:timeFrame_close_Long=="5m"?5:timeFrame_close_Long=="3m"?3:1

pre_MA_close_Short = isEnableShortCustomClose? security(syminfo.tickerid, timeFrame_close_Short=="Current."?timeframe.period:tostring(TFsecurity_close_Short), preS_MA_Short_close) : preS_MA_Short_close
pre_MA_close_Long = isEnableLongCustomClose?  security(syminfo.tickerid, timeFrame_close_Long=="Current."?timeframe.period:tostring(TFsecurity_close_Long), preS_MA_Long_close) : preS_MA_Long_close

MA_Short_close =  (round(pre_MA_close_Short * mult) / mult)[offset_Short_close]
MA_Long_close = (round(pre_MA_close_Long * mult) / mult)[offset_Long_close]

countShifts_Long = 0
countShifts_Long:=long1_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long2_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long3_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long4_isActive?countShifts_Long+1:countShifts_Long
avgPriceForLotShiftLong_Data_input = MA_Long+ (MA_Long*((shift_Long1_percent+shift_Long2_percent+shift_Long3_percent+shift_Long4_percent)/countShifts_Long/100))

countShifts_Short = 0
countShifts_Short:=short1_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short2_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short3_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short4_isActive?countShifts_Short+1:countShifts_Short
avgPriceForLotShiftShort_Data_input = MA_Short + (MA_Short*((shift_Short1_percent+shift_Short2_percent+shift_Short3_percent+shift_Short4_percent)/countShifts_Short/100))
strategy.initial_capital = 50000
balance=strategy.initial_capital + strategy.netprofit
lotlong = 0.0
lotshort = 0.0
lotlong := (balance / avgPriceForLotShiftLong_Data_input) * (lotsize_Long / 100)     //strategy.position_size == 0 ? (strategy.equity / close) * (lotsize_Long / 100) : lotlong[1]
lotshort := (balance / avgPriceForLotShiftShort_Data_input) * (lotsize_Short / 100)    //strategy.position_size == 0 ? (strategy.equity / close) * (lotsize_Short / 100) : lotshort[1]
lotlong:= lotlong>1000000000?1000000000:lotlong
lotshort:=lotshort>1000000000?1000000000:lotshort

if isLotSizeAvgShifts==false
    lotlong := (strategy.equity / open) * (lotsize_Long / 100) 
    lotshort := (strategy.equity / open) * (lotsize_Short / 100) 

value_deviationLong=0.0
value_deviationShort=0.0

if(isEnableLongCustomClose == false )
    MA_Long_close:=MA_Long
else 
    value_deviationLong := round(MA_Long_close * longDeviation /100 * mult) / mult
    
if(isEnableShortCustomClose == false )
    MA_Short_close:=MA_Short
else 
    value_deviationShort := round(MA_Short_close * shortDeviation /100 * mult) / mult

if MA_Short > 0 and lotshort > 0// and strategy.position_size<=0
    lotShort_Data_input = strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    strategy.entry("S1", strategy.short, lotshort, limit = Level_Short1, when = (lotShort_Data_input == 0  and short1_isActive and is_time_true ))

    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    strategy.entry("S2", strategy.short, lotshort, limit = Level_Short2, when = (lotShort_Data_input <= 1 and short2_isActive and is_time_true ))

    lotshort3 = isEnableDoubleLotShift3_Short? lotshort*2 :lotshort
    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    maxLotsshift3=isEnableDoubleLotShift3_Short?3:2
    strategy.entry("S3", strategy.short, lotshort3, limit = Level_Short3, when = (lotShort_Data_input <= maxLotsshift3 and short3_isActive and is_time_true ))

    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    maxLotsshift4=isEnableDoubleLotShift3_Short?4:3
    strategy.entry("S4", strategy.short, lotshort, limit = Level_Short4, when = (lotShort_Data_input <= maxLotsshift4 and short4_isActive and is_time_true))
    
    strategy.exit("TPS", "S1" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S2" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S3" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S4" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    
if MA_Long > 0 and lotlong > 0// and strategy.position_size>=0
    lotLong_Data_input = strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L1", strategy.long, lotlong, limit = Level_Long1, when = (lotLong_Data_input ==0 and long1_isActive and is_time_true))
    
    lotLong_Data_input := strategy.position_size > 0 ?  round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L2", strategy.long, lotlong, limit = Level_Long2, when = ( lotLong_Data_input <= 1 and long2_isActive and is_time_true))
        
    lotlong3 = isEnableDoubleLotShift3_Long? lotlong*2 : lotlong 
    lotLong_Data_input := strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    maxLotsshift3=isEnableDoubleLotShift3_Long?3:2
    strategy.entry("L3", strategy.long, lotlong3, limit = Level_Long3, when = (lotLong_Data_input <= maxLotsshift3 and long3_isActive and is_time_true))
    
    maxLotsshift4=isEnableDoubleLotShift3_Long?4:3
    lotLong_Data_input := strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L4", strategy.long, lotlong, limit = Level_Long4, when = ( lotLong_Data_input<maxLotsshift4 and long4_isActive and is_time_true))
    
    strategy.exit( "TPL", "L1",limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L2", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L3", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L4", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    
if (MA_Long_close < close)
    strategy.close("L1")
    strategy.close("L2")
    strategy.close("L3")
    strategy.close("L4")

if (MA_Short_close > close)
    strategy.close("S1")
    strategy.close("S2")
    strategy.close("S3")
    strategy.close("S4")
    
if time > timestamp(2000+year_End, month_End, day_End, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    
//Lines
colorlong = color.green
colorshort = color.red

value_long1 = long1_isActive ? Level_Long1 : na
value_long2 = long2_isActive ? Level_Long2 : na
value_long3 = long3_isActive ? Level_Long3 : na
value_long4 = long4_isActive ? Level_Long4 : na
value_short1 = short1_isActive ? Level_Short1 : na
value_short2 = short2_isActive ? Level_Short2 : na
value_short3 = short3_isActive ?Level_Short3 : na
value_short4 = short4_isActive? Level_Short4 : na

value_maShort_close= isEnableShortCustomClose ? MA_Short_close : na
value_maLong_close= isEnableLongCustomClose ? MA_Long_close : na

plot(value_maShort_close + value_deviationShort, offset = 1, color = color.orange, title = "MA line Short Close")

plot(value_short4, offset = 1, color = colorshort, title = "Short Shift 4")
plot(value_short3, offset = 1, color = colorshort, title = "Short Shift 3")
plot(value_short2, offset = 1, color = colorshort, title = "Short Shift 2")
plot(value_short1, offset = 1, color = colorshort, title = "Short Shift 1")
plot(countShifts_Short>0 and lotsize_Short>0 ? MA_Short:na, offset = 1, color = color.purple, title = "MA line Short")
plot(countShifts_Long>0 and lotsize_Long>0? MA_Long:na, offset = 1, color = color.lime, title = "MA line Long")
plot(value_long1, offset = 1, color = colorlong, title = "Long Shift 1")
plot(value_long2, offset = 1, color = colorlong, title = "Long Shift 2")
plot(value_long3, offset = 1, color = colorlong, title = "Long Shift 3")
plot(value_long4, offset = 1, color = colorlong, title = "Long Shift 4")

plot(value_maLong_close + value_deviationLong, offset = 1, color = color.blue, title = "MA line Long Close")

더 많은