커뮤니티
질문 있습니다.
안녕하세요.
어제 답변 주셔서 감사합니다!
그나마 해결 되었는데 아직도 어려워 하는 부분이 있습니다. ㅠㅠ
질문을 요약해서 올리니 바쁘시더라도 답변 잘 부탁드리겠습니다. 감사합니다!
질문의 내용은 청산 후 대기 로직 추가 후 신호가 전혀 안 나옵니다!!! ㅠㅠ (변수 유지 관련)
기존에 잘 작동하던 매매 시스템에 "청산 후 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, "매수무효(휴식중)");}
질문 목록입니다.
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: sTime이 093000 (9시 30분)일 때 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: 이 순서가 맞나요? 청산 로직을 신호 감지보다 먼저 배치해야 하나요?
변수 디버깅 방법
Text_New(sDate, sTime, H, "Stop:" + NumToStr(InStopdown, 0));
Text_New(sDate, sTime, H, "Time:" + NumToStr(CurrentTime, 0));
질문6: 매 봉마다 변수 값을 차트에 표시해서 디버깅할 수 있나요? 더 좋은 디버깅 방법이 있나요?
조건문 실행 및 변수 변경 반영
// 같은 봉에서
ExitLong("WinL");
InStopdown = 1;
// 이후
if InStopdown == 0 Then {
    BuySignal = 1;}
질문7: 같은 봉 내에서 변수 변경이 즉시 반영되나요? 아니면 다음 봉부터 적용되나요?
StopdownMinutes 조건 체크
if StopdownMinutes > 0 Then {
    LastExitTime = CurrentTime;
    InStopdown = 1;}
질문8: StopdownMinutes를 30으로 설정했는데, Input 값이 제대로 전달되고 있는지 확인하는 방법이 있나요?
전체 로직 검증
// 진입 조건
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