커뮤니티

질문 있습니다.

프로필 이미지
스오어스
2025-10-21 22:06:16
71
글번호 227126
답변완료

안녕하세요.
어제 답변 주셔서 감사합니다!
그나마 해결 되었는데 아직도 어려워 하는 부분이 있습니다. ㅠㅠ
질문을 요약해서 올리니 바쁘시더라도 답변 잘 부탁드리겠습니다. 감사합니다!
질문의 내용은 청산 후 대기 로직 추가 후 신호가 전혀 안 나옵니다!!! ㅠㅠ (변수 유지 관련)
기존에 잘 작동하던 매매 시스템에 "청산 후 30분 동안 진입 금지" 기능을 추가했더니 신호가 전혀 안 나오는 문제가 발생했습니다.
원인을 찾고자 여러 가지 궁금한 점들을 질문드립니다.ㅜㅜ
현재 상황
기존 코드: MACD 0선 돌파 시 매수/매도 신호 → 정상 작동 되었음

수정 코드: 청산 후 StopdownMinutes(30) 동안 진입 금지 추가 → 신호 안 나옵니다.
핵심 코드 구조
// 변수 선언
var : InStopdown(0);           // 휴식 중 (1=휴식, 0=거래가능)
var : LastExitTime(0);         // 마지막 청산 시간
var : IsGoldenCross(0);        // 골드크로스 상태
// 현재 시간
CurrentTime = TimeToMinutes(sTime);
// 이전 상태 유지
InStopdown = InStopdown[1];
LastExitTime = LastExitTime[1];
IsGoldenCross = IsGoldenCross[1];
// 청산 후 휴식 체크
if InStopdown == 1 Then {
    ElapsedTime = CurrentTime - LastExitTime;
    if ElapsedTime >= StopdownMinutes Then {
        InStopdown = 0;  // 휴식 종료
    }
}// MACD 크로스 감지
if CrossUp(MACDValue, 0) Then {
    IsGoldenCross = 1;
}// 청산 로직
if MarketPosition == 1 and C >= AvgEntryPrice + ProfitTicks Then {
    ExitLong("WinL");
    
    if StopdownMinutes > 0 Then {
        LastExitTime = CurrentTime;
        InStopdown = 1;  // 휴식 시작
    }
}// 진입 신호 감지
if MarketPosition == 0 and IsGoldenCross == 1 and InStopdown == 0 Then {
    BuySignal = 1;
    Text_New(sDate, sTime, L - 1.5, "매수신호");
}if MarketPosition == 0 and IsGoldenCross == 1 and InStopdown == 1 Then {
    Text_New(sDate, sTime, L - 1.5, "매수무효(휴식중)");

}
질문 목록입니다.

  1. var 변수의 값 유지 방법이 무엇인가요?

var : InStopdown(0);
InStopdown = InStopdown[1];
질문:1-1: var로 선언한 변수가 [1]로 이전 봉의 값을 참조할 수 있나요? 매 봉마다 초기화되나요?

질문:1-2: 첫 실행 시 (차트 로딩 첫 봉) InStopdown[1]이 존재하지 않으면 어떻게 되나요? 자동으로 0이 되나요? 오류가 나나요?

2. TimeToMinutes 함수 관련
easylanguageCurrentTime = TimeToMinutes(sTime);
ElapsedTime = CurrentTime - LastExitTime;
질문:2-1: sTime093000 (930)일 때 TimeToMinutes는 정확히 무엇을 반환하나요? 570 (9×60+30)인가요?

질문:2-2: TimeToMinutes가 자정(00:00)을 넘어가면 0부터 다시 시작하나요? 그렇다면 시간 차이 계산이 음수가 나오는데 어떻게 처리해야 하나요?

3. MarketPosition 상태 변경 타이밍
if MarketPosition == 1 and C >= AvgEntryPrice + ProfitTicks Then {
    ExitLong("WinL");
    InStopdown = 1;
}// 바로 다음 줄에서
if MarketPosition == 0 and InStopdown == 0 Then {
    BuySignal = 1;
}
질문3: ExitLong() 실행 후 MarketPosition이 즉시 0으로 바뀌나요? 아니면 다음 봉부터 바뀌나요?

4. CrossUp/CrossDown과 상태 변수 유지 충돌
easylanguageIsGoldenCross = IsGoldenCross[1];
if CrossUp(MACDValue, 0) Then {
    IsGoldenCross = 1;
}

질문4: 상태 변수를 [1]로 유지하면서 CrossUp 함수와 함께 쓸 때 문제가 없나요? CrossUp이 매 봉마다 체크하는데, 상태 유지 로직과 충돌하지 않나요?

5. 코드 실행 순서의 중요성
현재 코드 순서:
변수 유지 (InStopdown = InStopdown[1])
청산 후 휴식 체크
MACD 크로스 감지
청산 로직
진입 신호 감지

질문5: 이 순서가 맞나요? 청산 로직을 신호 감지보다 먼저 배치해야 하나요?

  1. 변수 디버깅 방법

Text_New(sDate, sTime, H, "Stop:" + NumToStr(InStopdown, 0));
Text_New(sDate, sTime, H, "Time:" + NumToStr(CurrentTime, 0));


질문6: 매 봉마다 변수 값을 차트에 표시해서 디버깅할 수 있나요? 더 좋은 디버깅 방법이 있나요?

  1. 조건문 실행 및 변수 변경 반영

// 같은 봉에서

ExitLong("WinL");
InStopdown = 1;
// 이후
if InStopdown == 0 Then {
    BuySignal = 1;

} 질문7: 같은 봉 내에서 변수 변경이 즉시 반영되나요? 아니면 다음 봉부터 적용되나요?

  1. StopdownMinutes 조건 체크

if StopdownMinutes > 0 Then {
    LastExitTime = CurrentTime;
    InStopdown = 1;

} 질문8: StopdownMinutes를 30으로 설정했는데, Input 값이 제대로 전달되고 있는지 확인하는 방법이 있나요?

  1. 전체 로직 검증

// 진입 조건

if MarketPosition == 0 and IsGoldenCross == 1 and InStopdown == 0 Then {
    BuySignal = 1;
}// 다음 봉에서
if BuySignal[1] == 1 Then {
    Buy("MACD_Buy", AtMarket, Def, ContractSize);
}
질문9: 신호 감지와 실제 진입을 분리하는 이 구조가 맞나요? BuySignal[1]이 제대로 참조되나요?

 시도해본 것들
1. StopdownMinutes = 0 설정 → 여전히 신호 안 나옴
2. 기존 코드(StopdownMinutes 없는 버전) → 정상 작동 확인

귀한 답변이 도움이 될 것 같습니다! 감사합니다!

시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-10-22 14:22:23

안녕하세요 예스스탁입니다. 1 var : InStopdown(0); InStopdown = InStopdown[1]; 문법상으로는 검증이 통과되지만 내용상 맞지 않는 형태입니다. 차트 첫봉에는 전봉이 없습니다. InStopdown이 최초에는 0이지만 첫봉에서 [1]한봉전값이 없으므로 해당변수에 n/a(계산할수없음)가 저장됩니다, 이후계속 전봉값을 요청하므로 이후봉에서 전봉값이 저장되므로 계속 n/a입니다. var : InStopdown(0); InStopdown = 값; 변수에 값을 저장하고 필요한 시점에 [1]값을 가져오게 사용하셔야 합니다. var : InStopdown(0);는 변수의 타입과 최초값을 지정하는 선언입니다. 매봉 실행되는 부분이 아닙니다. 2 TimeToMinutes은 0시이후 경과한 분입니다. 9시30분이면 570입니다. 0시가 아닌 영업일 변경기준으로 TimeToMinutes 계산하시려면 아래식을 이용하시면 됩니다. var :s1(0),D1(0),TM(0); if Bdate != Bdate[1] Then { S1 = TimeToMinutes(stime); D1 = sdate; } if D1 > 0 then { if sdate == D1 Then TM = TimeToMinutes(stime)-S1; Else TM = TimeToMinutes(stime)+1440-S1; } 3 실제 값은 즉시 변경이 됩니다. if문이 봉완성시에만 최종적으로 조건체크하게 됩니다. 랭귀지에서 조건은 if문으로 지정이 되므로 봉미완성시 중간에 즉시 변경이 의미가 없습니다. 4 수식적으로 CrossUp함수와 특정변수의 [1]값의 조합에 문제는 없습니다. 5 수식은 위에서 아래로 읽어내려가므로 동일봉에서 진입과 청산이 동시 발생하는 경우를 산정한다면 청산로직이 위에 있는게 맞습니다. 6 일반적으로 디버깅은 messagelog함수를 이용해서 예스랭귀지 편집기의 디버깅창에 출력합니다. 차트에 표시한다면 text함수를 사용하셔야 합니다. 7 3번 내용과 같습니다. 봉완성시가 기준이라고 보셔야 합니다. 예스랭귀지 if문은 봉완성기준이라 중간에 값이 변경이 된다고 해도 해당 값을 사용이 불가합니다. 8. MessageLog로 출력해 디버깅창에서 확인하시면 됩니다. input변수는 고정값이므로 아래와 같이 첫봉에서만 출력하게 해서 보셔도 됩니다. if Index == 0 Then MessageLog("%.f",StopdownMinutes); 9. BuySignal = 0; if MarketPosition == 0 and IsGoldenCross == 1 and InStopdown == 0 Then { BuySignal = 1; } 위와 같이 BuySignal이 매봉 0으로 초기화되고 조건만족시 1이 저장된다면 올리신 내용이 맞습니다. 즐거운 하루되세요