커뮤니티

질문 있습니다.

프로필 이미지
스오어스
2025-10-21 00:42:12
67
글번호 227079
답변완료

안녕하세요 MACD 크로스 시 조건부 진입 로직 질문입니다.

MACD 크로스 매매 시스템을 만들고 있는데, 특정 조건을 만족하는 크로스에만 진입하려고 합니다.

구현하고자 하는 로직

골드크로스 매수
1. MACD가 Signal을 상향 돌파 (골드크로스 발생)
2., 크로스 발생 직전 MACD 값이 특정 기준값(수평선) 이하일 때만 진입
3. 기준값을 초과한 상태에서(수평선 올라타면) 골드크로스 하면 진입을 하지 않아야 합니다. 

데드크로스 매도
1. MACD가 Signal을 하향 돌파 (데드크로스 발생)
2., 크로스 발생 직전 MACD 값이 특정 기준값(수평선) 이상일 때만 진입
3. 기준값 미만 상태에서(수평선 아래에 있으면) 데드크로스 하면 진입을 하지 않아야 합니다. 

현재 작성한 코드 구조는 아래와 같습니다. 

Input : MACD_Short(12);
Input : MACD_Long(26);
Input : MACD_Signal(9);
Input : UpperLimit(0);    // 예시값
Input : LowerLimit(0);    // 예시값
var : MACDValue(0);
var : MACDSignalValue(0);
MACDValue = MACD(MACD_Short, MACD_Long);
MACDSignalValue = Ema(MACDValue, MACD_Signal);
// 골드크로스 매수
if CrossUp(MACDValue, MACDSignalValue) Then {
    if MACDValue[1] <= LowerLimit Then {
        Buy("GoldBuy", Onclose, Def, 1);
    }
}// 데드크로스 매도
if CrossDown(MACDValue, MACDSignalValue) Then {
    if MACDValue[1] >= UpperLimit Then {
        Sell("DeadSell", Onclose, Def, 1);
    }
}

!!!!문제 상황!!!!
조건 체크는 정상 작동 (Text_New로 확인 시 조건 분기 잘 됨)
하지만 Buy(), Sell() 명령이 실행되지 않습니다......
조건을 만족하는데도 진입 신호(화살표)가 차트에 표시되지 않아서 애먹고 있습니다.

>>질문 드립니다!!!
>>질문 1: CrossUp/CrossDown 함수 내부에서 추가 조건 체크
easylanguageif CrossUp(MACDValue, MACDSignalValue) Then {
    if MACDValue[1] <= LowerLimit Then {  // 이 조건 추가가 문제일까요?
        Buy();
    }
}


이런 식으로 CrossUp 내부에서 추가 조건을 체크하는 것이 정상적으로 작동하나요?
아니면 CrossUp과 조건을 분리해야 하나요?
질문 2: 크로스 감지 타이밍과 조건 체크 타이밍
//방법 A: CrossUp 내부에서 조건 체크

if CrossUp(A, B) Then {
    if 추가조건 Then Buy();
}

// 방법 B: CrossUp을 변수에 저장 후 조건 체크
var : IsCrossUp(0);
IsCrossUp = 0;
if CrossUp(A, B) Then IsCrossUp = 1;
if IsCrossUp == 1 and 추가조건 Then Buy();

어떤 방식이 더 확실한가요?
질문 3: 1봉 전 값 참조 문제
if MACDValue[1] <= LowerLimit Then 크로스 발생 직전(1봉 전) 값을 체크하려면 [1] 참조가 맞나요?
아니면 다른 방식이 필요한가요?
부탁이 있습니다. "지표값이 특정 범위를 벗어난 상태에서만 크로스 신호를 유효하게 인정"하는 로직의 정확한 구현 방법을 알려주시면 감사하겠습니다.
**홈페이지 리뉴얼 축하드립니다. 그런데 게시판 글쓰기 너무 불편해요. 과거 게시판이 제일 좋았습니다.ㅠㅠ**

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

예스스탁 예스스탁 답변

2025-10-21 12:35:58

안녕하세요 예스스탁입니다. 1 올리신 수식에 별도로 문제가 없습니다. 그림과 같이 지정한 조건만족시 신호가 정상적으로 발생합니다. 올리신 내용으로 신호가 발생하는 식입니다.
2 아래 3가지 문장은 모두 같은 내용의 문장입니다. if CrossUp(MACDValue, MACDSignalValue) Then { if MACDValue[1] <= LowerLimit Then { Buy("GoldBuy", Onclose, Def, 1); } } if CrossUp(MACDValue, MACDSignalValue) and MACDValue[1] <= LowerLimit Then { Buy("GoldBuy", Onclose, Def, 1); } IsCrossUp = 0; if CrossUp(MACDValue, MACDSignalValue) Then IsCrossUp = 1; if IsCrossUp == 1 and MACDValue[1] <= LowerLimit Then Buy("GoldBuy", Onclose, Def, 1); 3 이전봉값 참조는 작성하신 내용이 맞습니다. 변수, 함수, 데이터 뒤에 [1]을 붙이면 1봉전, [2]는 두봉전 순입니다. 4 범위가 내용에 따라 식이 다릅니다. 어떤 범위인지 정확하지 않습니다. MACD와 같이 0선 기준이면 올리신 내용과 같이 0보다 크다, 0보다 작다로 표현하시면 됩니다. 신호가 안나오시면 02-3453-1060으로 전화주시기 바랍니다. 아마 설정창의 당일청산 설정과 같이 특정설정과 관련이 있을것 같은데 화면을 보아야 알 수 있을 것 같습니다. 즐거운 하루되세요