커뮤니티
수식을 수정부탁드립니다.
// 요청: 최초 제공하신 수식을 현재 수정된 재진입 판단 로직으로 변환
// 전략식(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;
}
위 수식에서 당일 매수/재진입/청산이 이루어지고 다음날에는 청산신호 전까지만 이루어지고 청산이 되면 이후 매수신호가 나오지 않도록 부탁드립니다. 예스나와 한참을 해도 수정이 되지 않아 부탁드립니다.
- 1. 화면 캡처 2026-07-29 130326.jpg (0.35 MB)
답변 3
예스스탁 예스스탁 답변
2026-07-29 14:18:35
하리마우
2026-07-29 15:09:57
예스스탁 예스스탁 답변
2026-07-30 14:32:37