커뮤니티
아래 내용 수정 부탁합니다. 실행이 안됩니다
// ─────────────────────────────────────────────
// 고변동성 최적화 버전 (SMA20 / RSI5)
// 1차 진입 → 실패 시 역추세 마틴 진입(2배)
// ─────────────────────────────────────────────
// 사용자 설정값
input : P(20); // SMA 기간
input : RSIlen(5); // RSI 기간
input : StopPoint(1.0); // 기본 손절 1.0pt
input : TakePoint(1.0); // 기본 익절 1.0pt
// 변수 선언
var : sma20(0), rsi5(0), atr14(0);
var : longCond(false), shortCond(false);
var : entryPrice(0), martin(false);
// ─────────────────────────────
// 계산식
// ─────────────────────────────
sma20 = average(Close, P);
rsi5 = RSI(Close, RSIlen);
atr14 = AvgTrueRange(14);
// ─────────────────────────────
// 변동성 필터 (전일 대비 40%↑)
// ─────────────────────────────
if (atr14 > atr14[1] * 1.40) then begin
// 변동성 과다 → 트레이딩 중단
longCond = false;
shortCond = false;
end
else begin
// 정상 구간에서만 신호 활성화
// ─────────────────────────────
// 1차 진입 조건
// ─────────────────────────────
// 상승 매수 조건
longCond = (Close > sma20) and
(Close > Highest(High, 3)[1]) and // 직전 3봉 고점 돌파 종가 기준
(rsi5 > 45 and rsi5 < 70); // RSI 중립 구간 진입 시만
// 하락 매도 조건
shortCond = (Close < sma20) and
(Close < Lowest(Low, 3)[1]) and // 직전 3봉 저점 돌파
(rsi5 < 55 and rsi5 > 30);
end;
// ─────────────────────────────
// 1차 진입 로직
// ─────────────────────────────
if (marketposition = 0 and not martin) then begin
if longCond then begin
buy(1) next bar at market;
entryPrice = Close;
end;
if shortCond then begin
sellshort(1) next bar at market;
entryPrice = Close;
end;
end;
// ─────────────────────────────
// 1차 손절·익절
// 손절폭은 변동성 장 대응으로 1.8배
// ─────────────────────────────
if (marketposition = 1 and not martin) then begin
sell("1_LS") next bar at entryPrice - StopPoint*1.8 stop;
sell("1_LTP") next bar at entryPrice + TakePoint limit;
end;
if (marketposition = -1 and not martin) then begin
buytocover("1_SS") next bar at entryPrice + StopPoint*1.8 stop;
buytocover("1_STP") next bar at entryPrice - TakePoint limit;
end;
// ─────────────────────────────
// 1차 손절 후 2차 (마틴) 역추세 진입
// RSI 반전 + 반대방향 돌파 조합
// ─────────────────────────────
if (marketposition = 0 and martin = false) then begin
// 1차가 매수였을 경우 → 매도 마틴
if (Close < entryPrice - StopPoint*1.8) and (rsi5 < 50) then begin
sellshort(2) next bar at market;
martin = true;
entryPrice = Close;
end;
// 1차가 매도였을 경우 → 매수 마틴
if (Close > entryPrice + StopPoint*1.8) and (rsi5 > 50) then begin
buy(2) next bar at market;
martin = true;
entryPrice = Close;
end;
end;
// ─────────────────────────────
// 2차 마틴 손절·익절 (손절폭 2.2배)
// 수량은 2배 진입이므로 리스크 관리 주의
// ─────────────────────────────
if (marketposition = 1 and martin) then begin
sell("2_LS") next bar at entryPrice - StopPoint*2.2 stop;
sell("2_LTP") next bar at entryPrice + TakePoint limit;
end;
if (marketposition = -1 and martin) then begin
buytocover("2_SS") next bar at entryPrice + StopPoint*2.2 stop;
buytocover("2_STP") next bar at entryPrice - TakePoint limit;
end;
// ─────────────────────────────
// 포지션 종료 시 마틴 초기화
// ─────────────────────────────
if (marketposition = 0) then martin = false;
답변 1
예스스탁 예스스탁 답변
2025-11-26 16:00:32