커뮤니티
로직 문의
안녕하세요.
현재 예스스탁 자동매매를 실계좌에서 운용 중인데 포지션 표시와 관련하여 몇 가지 문의드립니다.
1. 현재 사용 중인 전략은 롱 전용 전략입니다.
진입은 아래 코드만 사용하고 있습니다.
Buy("LONG_ENTRY");
그리고 청산은
ExitLong(...)
SetStopLoss(...)
SetStopProfitTarget(...)
만 사용하고 있으며,
SellShort(...)
Sell(...)
ExitShort(...)
와 같은 숏 진입 코드는 전혀 사용하지 않고 있습니다.
2. 그런데 실시간 계좌 화면에서는
* 구분 : 매도
* 수량 : 1
* 선물매도 1계약 보유
와 같이 표시되고 있습니다.
질문 1)
위 코드 구조에서 예스스탁이 자동으로 신규 매도(숏) 포지션을 생성할 가능성이 있나요?
질문 2)
ExitLong, SetStopLoss, SetStopProfitTarget에 의해 청산 주문이 나갈 때,
일부 상황에서 신규 매도 포지션으로 반전 진입될 가능성이 있나요?
질문 3)
실계좌 포지션과 MarketPosition 값이 서로 다르게 표시될 수 있나요?
예를 들어,
실계좌 = 매도 1
MarketPosition = 1 또는 0
과 같이 동기화가 어긋나는 경우가 있는지 궁금합니다.
질문 4)
재접속이나 서버 재시작 이후에
기존 포지션이 Long에서 Short로 잘못 인식되거나,
차트 신호 기준으로 MarketPosition이 재설정되는 경우가 있는지도 확인 부탁드립니다.
현재 사용 중인 전략은 롱 전용이므로,
실시간 계좌에 "매도 1"이 표시되는 이유가 궁금합니다.
제 로직 입니다
// =====================================================
// 롱 전용 개선본 v2
// - 손절 단순화 (SetStopLoss 단독 사용)
// - 진입 조건 완화 (1.005 → 1.002)
// - 횡보장 필터 추가 (변동폭 확대)
// - ExitLong 중복 제거
// - MDD 감소 목표
// =====================================================
Input : 단기(20), 장기(60);
Input : 손절(2.5), 익절(3.7);
Input : 최소일변동폭(3.0);
Input : 최소수익(3.2);
Input : 수익감소(2.0);
Input : MFE1(3.0), Lock1(1.2);
Input : MFE2(5.0), Lock2(3.3);
Input : 시작시간(090000);
Input : 종료시간(110000);
// [추가] 횡보장 필터용
Input : 국면완화(0.995); // 일봉 국면 완화값
Input : MA승수(1.000); // 분봉 MA 진입 승수 (기존 1.005 → 완화)
Input : 변동폭승수(1.6); // 최소변동폭 승수 (1.0 = 기존 유지)
Var : 단기평(0), 장기평(0);
Var : Tcond(false);
Var : AvgRange(0);
Var : bh(0);
Var : 일봉단기평(0);
Var : 일봉장기평(0);
Var : 상승국면(false);
Var : 현재MFE율(0);
Var : 트레일선(0);
Var : 잠금선(0);
Var : 최종청산선(0);
// =====================================================
// 1. 분봉 이동평균
// =====================================================
단기평 = ma(C, 단기);
장기평 = ma(C, 장기);
// =====================================================
// 2. 일봉 이동평균
// =====================================================
일봉단기평 =
(
DayClose(1) + DayClose(2) + DayClose(3) + DayClose(4) +
DayClose(5) + DayClose(6) + DayClose(7) + DayClose(8) +
DayClose(9) + DayClose(10) + DayClose(11) + DayClose(12) +
DayClose(13) + DayClose(14) + DayClose(15) + DayClose(16) +
DayClose(17) + DayClose(18) + DayClose(19) + DayClose(20)
) / 20;
일봉장기평 =
(
DayClose(1) + DayClose(2) + DayClose(3) + DayClose(4) +
DayClose(5) + DayClose(6) + DayClose(7) + DayClose(8) +
DayClose(9) + DayClose(10) + DayClose(11) + DayClose(12) +
DayClose(13) + DayClose(14) + DayClose(15) + DayClose(16) +
DayClose(17) + DayClose(18) + DayClose(19) + DayClose(20) +
DayClose(21) + DayClose(22) + DayClose(23) + DayClose(24) +
DayClose(25) + DayClose(26) + DayClose(27) + DayClose(28) +
DayClose(29) + DayClose(30) + DayClose(31) + DayClose(32) +
DayClose(33) + DayClose(34) + DayClose(35) + DayClose(36) +
DayClose(37) + DayClose(38) + DayClose(39) + DayClose(40) +
DayClose(41) + DayClose(42) + DayClose(43) + DayClose(44) +
DayClose(45) + DayClose(46) + DayClose(47) + DayClose(48) +
DayClose(49) + DayClose(50) + DayClose(51) + DayClose(52) +
DayClose(53) + DayClose(54) + DayClose(55) + DayClose(56) +
DayClose(57) + DayClose(58) + DayClose(59) + DayClose(60)
) / 60;
// =====================================================
// 3. 국면 판단
// =====================================================
상승국면 = false;
if 일봉단기평 > 일봉장기평 * 국면완화 then
상승국면 = true;
// =====================================================
// 4. 최근 5일 평균 변동폭
// =====================================================
AvgRange =
(
(DayHigh(1)-DayLow(1)) +
(DayHigh(2)-DayLow(2)) +
(DayHigh(3)-DayLow(3)) +
(DayHigh(4)-DayLow(4)) +
(DayHigh(5)-DayLow(5))
) / 5;
// =====================================================
// 5. 날짜 변경 시 진입 허용
// =====================================================
if sdate != sdate[1] then
Tcond = true;
// =====================================================
// 6. LONG 진입
// [변경] MA승수 파라미터화 (1.005 → 최적화 가능)
// [변경] 변동폭 조건 승수 추가 (횡보 필터 강화 가능)
// =====================================================
if stime >= 시작시간 and stime <= 종료시간
and Tcond == true
and 상승국면 == true then
{
if AvgRange >= 최소일변동폭 * 변동폭승수 then
{
if 단기평 > 장기평 * MA승수
and C > O then
{
Buy("LONG_ENTRY");
Tcond = false;
}
}
}
// =====================================================
// 7. 포지션 보유 중 청산 로직
// [변경] ExitLong 중복 제거
// SetStopLoss 단독으로 손절 처리
// 트레일링 + 수익잠금 유지
// =====================================================
if MarketPosition == 1 then
{
bh = Highest(H, BarsSinceEntry);
현재MFE율 = (bh - EntryPrice) / EntryPrice * 100;
트레일선 = bh * (1 - 수익감소 / 100);
잠금선 = EntryPrice;
if 현재MFE율 >= MFE1 then
잠금선 = EntryPrice * (1 + Lock1 / 100);
if 현재MFE율 >= MFE2 then
잠금선 = EntryPrice * (1 + Lock2 / 100);
최종청산선 = 트레일선;
if 잠금선 > 트레일선 then
최종청산선 = 잠금선;
if bh >= EntryPrice * (1 + 최소수익 / 100) then
{
ExitLong(
"LONG_TRAIL",
AtStop,
최종청산선
);
}
}
// =====================================================
// 8. 손절 / 익절
// [변경] ExitLong AtMarket 손절 제거
// SetStopLoss 단독 사용으로 단순화
// 충돌 가능성 제거
// =====================================================
SetStopLoss(손절, PercentStop);
SetStopProfitTarget(익절, PercentStop);
//////////////////
LONG 전용 전략인데 실계좌에 매도 1계약이 잡혀 있습니다. 예스스탁에서 ExitLong이 신규 매도로 전환될 수 있는지 확인 부탁드립니다
- 1. 스크린샷 2026-06-23 235657.png (0.03 MB)
답변 1
예스스탁 예스스탁 답변
2026-06-24 09:46:49