커뮤니티

수식을 수정부탁드립니다.

프로필 이미지
하리마우
2026-07-29 13:04:13
35
글번호 233014
답변완료

첨부 이미지

// 요청: 최초 제공하신 수식을 현재 수정된 재진입 판단 로직으로 변환

// 전략식(modified): 최초 수식 구조 유지 + 엄밀한 재진입 판단(시도가격/완료체결가 보정 포함)


Input : StartDate(20260728); // 매매 시작일 (YYYYMMDD)

Var : Use200MAFilter(1); // 200일 MA 필터 사용 여부: 1=적용, 0=미적용

Var : MAFilterLen(200); // 필터용 이동평균 기간

Var : ShortLen(6), LongLen(20), StopLossTicks(0), ProfitTargetTicks(0);

Var : TotalTaxPercent(0.315); // 세금/수수료 합계(%)

var : maShort(0), maLong(0), maFilter(0);

var : requiredPct(0);


// 추가 변수: 완료체결가 및 시도가격 추적

Var : LastLongCompletedFillPrice(0), LastShortCompletedFillPrice(0);

Var : LastLongAttemptPrice(0), LastShortAttemptPrice(0);

Var : LastReservedPrice(0), LastReservedType("");

Var : prevTotalTrades(0), prevMarketPos(0);


// 이동평균 계산

maShort = MA(C, ShortLen);

maLong = MA(C, LongLen);

maFilter = MA(C, MAFilterLen); // 필터용 이동평균


// 필요한 최소 세후 수익률

requiredPct = TotalTaxPercent + 0.5; // 백분율 기준


// 이전 봉 상태

prevTotalTrades = TotalTrades[1];

prevMarketPos = MarketPosition[1];


// 완료거래 감지 및 체결가 보정

If TotalTrades > prevTotalTrades Then

{

Var : estimatedFill(0);

estimatedFill = EntryPrice(1);


If LastReservedType == "ATSTOP" Then

{

If prevMarketPos <= 0 And MarketPosition == 1 Then

estimatedFill = max(LastReservedPrice, NextBarOpen);

Else If prevMarketPos >= 0 And MarketPosition == -1 Then

estimatedFill = min(LastReservedPrice, NextBarOpen);

}

Else If LastReservedType == "ATLIMIT" Then

{

If prevMarketPos <= 0 And MarketPosition == 1 Then

estimatedFill = min(LastReservedPrice, NextBarOpen);

Else If prevMarketPos >= 0 And MarketPosition == -1 Then

estimatedFill = max(LastReservedPrice, NextBarOpen);

}


If prevMarketPos <= 0 And MarketPosition == 1 Then

LastLongCompletedFillPrice = estimatedFill;

Else If prevMarketPos >= 0 And MarketPosition == -1 Then

LastShortCompletedFillPrice = estimatedFill;

Else

{

If MarketPosition == 1 Then

LastLongCompletedFillPrice = EntryPrice(1);

Else If MarketPosition == -1 Then

LastShortCompletedFillPrice = EntryPrice(1);

}


// 완료 시도 초기화

If prevMarketPos <= 0 And MarketPosition == 1 Then

LastLongAttemptPrice = 0;

If prevMarketPos >= 0 And MarketPosition == -1 Then

LastShortAttemptPrice = 0;


LastReservedPrice = 0;

LastReservedType = "";

}


// 매수진입 (원본 로직 유지: Bdate 조건 및 MA필터) - 재진입 판단만 강화

If Bdate >= StartDate And CrossUp(maShort, maLong) Then

{

If (Use200MAFilter == 0 Or C > maFilter) Then

{

Var : comparePrice(0);

comparePrice = 0;

If LastLongAttemptPrice > 0 Then

comparePrice = LastLongAttemptPrice;

Else If LastLongCompletedFillPrice > 0 Then

comparePrice = LastLongCompletedFillPrice;


If MarketPosition == 0 Or (MarketPosition == 1 And (comparePrice == 0 Or C < comparePrice)) Then

{

Buy("매수", onclose, Def);

// 시도가격 기록(피라미딩 비교용)

LastLongAttemptPrice = C;

}

}

}


// 롱포지션 청산 (원본 로직 유지, requiredPct 적용)

If Bdate >= StartDate And MarketPosition == 1 And CrossDown(maShort, maLong) And C >= AvgEntryPrice*(1+(requiredPct)/100) Then

ExitLong("매수청산", onclose, Def);


// 매도진입 (원본 로직 유지) - 재진입 판단 강화

If Bdate >= StartDate And CrossDown(maShort, maLong) Then

{

If (Use200MAFilter == 0 Or C < maFilter) Then

{

Var : comparePriceS(0);

comparePriceS = 0;

If LastShortAttemptPrice > 0 Then

comparePriceS = LastShortAttemptPrice;

Else If LastShortCompletedFillPrice > 0 Then

comparePriceS = LastShortCompletedFillPrice;


If MarketPosition == 0 Or (MarketPosition == -1 And (comparePriceS == 0 Or C > comparePriceS)) Then

{

Sell("매도", onclose, Def);

LastShortAttemptPrice = C;

}

}

}


// 숏포지션 청산

If Bdate >= StartDate And MarketPosition == -1 And CrossUp(maShort, maLong) And C <= AvgEntryPrice*(1-(requiredPct)/100) Then

ExitShort("매도청산", onclose, Def);


// 포지션 완전청산 시 시도기록 초기화

If MarketPosition == 0 And prevMarketPos != 0 Then

{

LastLongAttemptPrice = 0;

LastShortAttemptPrice = 0;

}


위 수식에서 당일 매수/재진입/청산이 이루어지고 다음날에는 청산신호 전까지만 이루어지고 청산이 되면 이후 매수신호가 나오지 않도록 부탁드립니다. 예스나와 한참을 해도 수정이 되지 않아 부탁드립니다.

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

예스스탁 예스스탁 답변

2026-07-29 14:18:35

안녕하세요 예스스탁입니다.

"당일매수/재진입/청산이 이루어지고 다음날에는 청산신호 전까지만 이루어지고 매수금지"
문의하신 내용을 정확히 이해하지 못했습니다. 전일 매수된 종목이 다음날 청산되면 매수를 금지하는 내용인지 진입과 추가매수후에 매도되면 매수를 금지하는 내용인지 모르겠습니다. 청산이 발생하면 당일은 더이상 진입이 발생하지 않게 수정해 드립니다. 위 내용이 아니시면 좀더 자세한 내용을 올려주시기 바랍니다. Input : StartDate(20260728); // 매매 시작일 (YYYYMMDD) Var : Use200MAFilter(1); // 200일 MA 필터 사용 여부: 1=적용, 0=미적용 Var : MAFilterLen(200); // 필터용 이동평균 기간 Var : ShortLen(6), LongLen(20), StopLossTicks(0), ProfitTargetTicks(0); Var : TotalTaxPercent(0.315); // 세금/수수료 합계(%) var : maShort(0), maLong(0), maFilter(0); var : requiredPct(0); // 추가 변수: 완료체결가 및 시도가격 추적 Var : LastLongCompletedFillPrice(0), LastShortCompletedFillPrice(0); Var : LastLongAttemptPrice(0), LastShortAttemptPrice(0); Var : LastReservedPrice(0), LastReservedType(""); Var : prevTotalTrades(0), prevMarketPos(0); var : X(false); // 이동평균 계산 maShort = MA(C, ShortLen); maLong = MA(C, LongLen); maFilter = MA(C, MAFilterLen); // 필터용 이동평균 if Bdate != Bdate[1] Then X = False; if TotalTrades > TotalTrades[1] Then X = true; // 필요한 최소 세후 수익률 requiredPct = TotalTaxPercent + 0.5; // 백분율 기준 // 이전 봉 상태 prevTotalTrades = TotalTrades[1]; prevMarketPos = MarketPosition[1]; // 완료거래 감지 및 체결가 보정 If TotalTrades > prevTotalTrades Then { Var : estimatedFill(0); estimatedFill = EntryPrice(1); If LastReservedType == "ATSTOP" Then { If prevMarketPos <= 0 And MarketPosition == 1 Then estimatedFill = max(LastReservedPrice, NextBarOpen); Else If prevMarketPos >= 0 And MarketPosition == -1 Then estimatedFill = min(LastReservedPrice, NextBarOpen); } Else If LastReservedType == "ATLIMIT" Then { If prevMarketPos <= 0 And MarketPosition == 1 Then estimatedFill = min(LastReservedPrice, NextBarOpen); Else If prevMarketPos >= 0 And MarketPosition == -1 Then estimatedFill = max(LastReservedPrice, NextBarOpen); } If prevMarketPos <= 0 And MarketPosition == 1 Then LastLongCompletedFillPrice = estimatedFill; Else If prevMarketPos >= 0 And MarketPosition == -1 Then LastShortCompletedFillPrice = estimatedFill; Else { If MarketPosition == 1 Then LastLongCompletedFillPrice = EntryPrice(1); Else If MarketPosition == -1 Then LastShortCompletedFillPrice = EntryPrice(1); } // 완료 시도 초기화 If prevMarketPos <= 0 And MarketPosition == 1 Then LastLongAttemptPrice = 0; If prevMarketPos >= 0 And MarketPosition == -1 Then LastShortAttemptPrice = 0; LastReservedPrice = 0; LastReservedType = ""; } // 매수진입 (원본 로직 유지: Bdate 조건 및 MA필터) - 재진입 판단만 강화 If Bdate >= StartDate And CrossUp(maShort, maLong) Then { If (Use200MAFilter == 0 Or C > maFilter) Then { Var : comparePrice(0); comparePrice = 0; If LastLongAttemptPrice > 0 Then comparePrice = LastLongAttemptPrice; Else If LastLongCompletedFillPrice > 0 Then comparePrice = LastLongCompletedFillPrice; If X == False and (MarketPosition == 0 Or (MarketPosition == 1 And (comparePrice == 0 Or C < comparePrice))) Then { Buy("매수", onclose, Def); // 시도가격 기록(피라미딩 비교용) LastLongAttemptPrice = C; } } } // 롱포지션 청산 (원본 로직 유지, requiredPct 적용) If Bdate >= StartDate And MarketPosition == 1 And CrossDown(maShort, maLong) And C >= AvgEntryPrice*(1+(requiredPct)/100) Then ExitLong("매수청산", onclose, Def); // 매도진입 (원본 로직 유지) - 재진입 판단 강화 If Bdate >= StartDate And CrossDown(maShort, maLong) Then { If (Use200MAFilter == 0 Or C < maFilter) Then { Var : comparePriceS(0); comparePriceS = 0; If LastShortAttemptPrice > 0 Then comparePriceS = LastShortAttemptPrice; Else If LastShortCompletedFillPrice > 0 Then comparePriceS = LastShortCompletedFillPrice; If X == False and (MarketPosition == 0 Or (MarketPosition == -1 And (comparePriceS == 0 Or C > comparePriceS))) Then { Sell("매도", onclose, Def); LastShortAttemptPrice = C; } } } // 숏포지션 청산 If Bdate >= StartDate And MarketPosition == -1 And CrossUp(maShort, maLong) And C <= AvgEntryPrice*(1-(requiredPct)/100) Then ExitShort("매도청산", onclose, Def); // 포지션 완전청산 시 시도기록 초기화 If MarketPosition == 0 And prevMarketPos != 0 Then { LastLongAttemptPrice = 0; LastShortAttemptPrice = 0; } 즐거운 하루되세요
프로필 이미지

하리마우

2026-07-29 15:09:57

Input : StartDate(20260728), Use200MAFilter(1), MAFilterLen(200), ShortLen(6), LongLen(20), StopLossTicks(0), ProfitTargetTicks(0), TotalTaxPercent(0.315); Var : maShort(0), maLong(0), maFilter(0), requiredPct(0); Var : LastLongCompletedFillPrice(0), LastShortCompletedFillPrice(0); Var : LastLongAttemptPrice(0), LastShortAttemptPrice(0); Var : LastReservedPrice(0), LastReservedType(""); Var : prevTotalTrades(0), prevMarketPos(0); Var : comparePrice(0), comparePriceS(0), estimatedFill(0); Var : DayLocked(false); // 이동평균 계산 maShort = MA(C, ShortLen); maLong = MA(C, LongLen); maFilter = MA(C, MAFilterLen); // 세후 기준 수익률 requiredPct = TotalTaxPercent + 0.5; // 손절/익절 설정 If StopLossTicks > 0 Then SetStopLoss(PriceScale * StopLossTicks, PointStop); Else SetStopLoss(0); If ProfitTargetTicks > 0 Then SetStopProfitTarget(PriceScale * ProfitTargetTicks, PointStop); Else SetStopProfitTarget(0); // 이전 봉 상태 prevTotalTrades = TotalTrades[1]; prevMarketPos = MarketPosition[1]; // 완료거래 감지 및 체결가 보정 If TotalTrades > prevTotalTrades Then { estimatedFill = EntryPrice; If estimatedFill == 0 Then estimatedFill = LastReservedPrice; If LastReservedType == "ATSTOP" Then { If prevMarketPos <= 0 And MarketPosition == 1 Then estimatedFill = max(LastReservedPrice, NextBarOpen); Else If prevMarketPos >= 0 And MarketPosition == -1 Then estimatedFill = min(LastReservedPrice, NextBarOpen); } Else If LastReservedType == "ATLIMIT" Then { If prevMarketPos <= 0 And MarketPosition == 1 Then estimatedFill = min(LastReservedPrice, NextBarOpen); Else If prevMarketPos >= 0 And MarketPosition == -1 Then estimatedFill = max(LastReservedPrice, NextBarOpen); } If prevMarketPos <= 0 And MarketPosition == 1 Then LastLongCompletedFillPrice = estimatedFill; Else If prevMarketPos >= 0 And MarketPosition == -1 Then LastShortCompletedFillPrice = estimatedFill; If prevMarketPos <= 0 And MarketPosition == 1 Then LastLongAttemptPrice = 0; If prevMarketPos >= 0 And MarketPosition == -1 Then LastShortAttemptPrice = 0; LastReservedPrice = 0; LastReservedType = ""; } // 영업일 변경 시 잠금 해제 If Bdate != Bdate[1] Then DayLocked = false; // 공통 비교값 comparePrice = 0; comparePriceS = 0; If LastLongAttemptPrice > 0 Then comparePrice = LastLongAttemptPrice; Else If LastLongCompletedFillPrice > 0 Then comparePrice = LastLongCompletedFillPrice; If LastShortAttemptPrice > 0 Then comparePriceS = LastShortAttemptPrice; Else If LastShortCompletedFillPrice > 0 Then comparePriceS = LastShortCompletedFillPrice; // 매수진입: 원본 흐름 유지, 청산 후 당일만 잠금 If Bdate >= StartDate And DayLocked == false And CrossUp(maShort, maLong) Then { If Use200MAFilter == 0 Or C > maFilter Then { If MarketPosition == 0 Or (MarketPosition == 1 And (comparePrice == 0 Or C < comparePrice)) Then { Buy("매수", onclose, Def); LastLongAttemptPrice = C; LastReservedPrice = C; LastReservedType = "ONCLOSE"; } } } // 롱포지션 청산: 원본 조건 + 2026/07/29 10:22 강제 청산 안전장치 If Bdate >= StartDate And MarketPosition == 1 And ((CrossDown(maShort, maLong) And C >= EntryPrice * (1 + requiredPct / 100)) Or (Bdate == 20260729 And sTime >= 102200)) Then { ExitLong("매수청산", onclose, Def, "", CurrentContracts, 1); If Bdate >= 20260729 Then DayLocked = true; } // 매도진입: 원본 흐름 유지 If Bdate >= StartDate And DayLocked == false And CrossDown(maShort, maLong) Then { If Use200MAFilter == 0 Or C < maFilter Then { If MarketPosition == 0 Or (MarketPosition == -1 And (comparePriceS == 0 Or C > comparePriceS)) Then { Sell("매도", onclose, Def); LastShortAttemptPrice = C; LastReservedPrice = C; LastReservedType = "ONCLOSE"; } } } // 숏포지션 청산 If Bdate >= StartDate And MarketPosition == -1 And CrossUp(maShort, maLong) And C <= EntryPrice * (1 - requiredPct / 100) Then { ExitShort("매도청산", onclose, Def, "", CurrentContracts, 1); If Bdate >= 20260729 Then DayLocked = true; } // 포지션 완전청산 시 시도기록 초기화 If MarketPosition == 0 And prevMarketPos != 0 Then { LastLongAttemptPrice = 0; LastShortAttemptPrice = 0; } 예스나와 다시 대화를해서 완벽하게 처리되었습니다. 그냥 제대로 된 것인지 코칭만 해주셔요^^

프로필 이미지

예스스탁 예스스탁 답변

2026-07-30 14:32:37

안녕하세요 예스스탁입니다. 시작일 다음날에 청산이 발생하면 이후 모든 진입을 금지하는 내용이면 해당식이 맞습니다. 즐거운 하루되세요