예스스탁
예스스탁 답변
2025-03-19 17:27:51
안녕하세요
예스스탁입니다.
////////////////////////////////////////////////////////////////////
// 개선된 Stochastic Slow(이중바닥) + 5/10일선 + 일봉기반 청산 + 7%익절/5%손절
////////////////////////////////////////////////////////////////////
Inputs:
Period(7), // 일봉 평균 계산 기간
Day5(5), // 단기 이동평균
Day10(10); // 장기 이동평균
Vars:
// 스윙포인트 관련
SLV1(0), SLV2(0),
// 스토캐스틱 (두 가지 주기)
stoK(0), stoD(0),
stoK1(0), stoD1(0),
// 5일/10일 이동평균
var1(0), var2(0),
// 일봉 평균 계산용
Sum(0), Sum1(0), cnt(0),
DayMa(0), DayMa2(0), // DayMa2는 Sum1 활용 예시
// 기타
swingBar1(0), swingBar2(0); // 스윙로우 발생 봉 인덱스(20봉 이내인지 체크용)
//------------------------------------------------------------------//
// (1) 이동평균 및 스토캐스틱 계산
//------------------------------------------------------------------//
// --> 입력값 Day5, Day10 활용
var1 = MA(C, Day5); // 5일 이동평균
var2 = MA(C, Day10); // 10일 이동평균
// Stochastic(20,12)와 SlowD(20,12,12)
stoK = StochasticsK(20, 12);
stoD = StochasticsD(20, 12, 12);
// Stochastic(10,6)와 SlowD(10,6,6)
stoK1 = StochasticsK(10, 6);
stoD1 = StochasticsD(10, 6, 6);
//------------------------------------------------------------------//
// (2) 스윙 저점(이중바닥) 탐색
//------------------------------------------------------------------//
// SwingLow(N, 데이터, LeftStrength, RightStrength, 최대바 수)
// N=1 → 가장 최근 스윙 저점 값, N=2 → 이전 스윙 저점 값
SLV1 = SwingLow(1, stoK, 3, 2, 100);
SLV2 = SwingLow(2, stoK, 3, 2, 100);
// 봉 인덱스도 얻을 수 있다면(환경에 따라 다름)
// SwingLowBar(N, 데이터, LeftStr, RightStr, 최대바수)
swingBar1 = SwingLowBar(1, stoK, 3, 2, 100);
swingBar2 = SwingLowBar(2, stoK, 3, 2, 100);
//------------------------------------------------------------------//
// (3) 일봉 평균(DayClose) 계산
//------------------------------------------------------------------//
// 7일간(DayClose) 합산 → DayMa
// Sum1도 함께 구해, 필요시 다른 로직에 활용 (DayMa2)
Sum = 0;
Sum1 = 0;
For cnt = 0 to Period - 1
Begin
Sum = Sum + DayClose(cnt);
Sum1 = Sum1 + DayClose(cnt + 1);
End;
DayMa = Sum / Period;
DayMa2 = Sum1 / Period; // 이 값(DayMa2)은 필요시 다른 조건에 활용 가능
//------------------------------------------------------------------//
// (4) 매수 조건:
// - 스윙저점 SLV1 >= SLV2 (최근 저점이 이전 저점 이상)
// - (var1 > var2) → 5일선이 10일선 위
// - (stoK > stoD) 또는 (stoK1 > stoD1) 중 하나라도 골든크로스
// - (swingBar1 - swingBar2 <= 20) → 최근 두 스윙저점이 20봉 이내(옵션)
//------------------------------------------------------------------//
If MarketPosition == 0 Then
Begin
// “스윙 저점이 20봉 이내”를 확인하고 싶다면 아래 조건 사용:
// (AbsValue(swingBar1 - swingBar2) <= 20)
// 환경마다 swingBar1,2가 큰 값(과거)부터 작은 값(최근) 순으로 나오므로
// 실제 동작을 확인해봐야 합니다.
If MarketPosition == 0 and (TotalTrades == 0 or (TotalTrades >= 1 and BarsSinceExit(1) >= 3)) and
(SLV1 >= SLV2) and
(var1 > var2) and
( (stoK > stoD) or (stoK1 > stoD1) )
// and (AbsValue(swingBar1 - swingBar2) <= 20) // 옵션
Then
Begin
// 중복 매수를 막기 위해 한 봉에 단 한 번의 매수만 발생
Buy("이중바닥매수");
End;
End;
//------------------------------------------------------------------//
// (5) 청산 조건:
// (A) 현재 종가가 DayMa(7일 평균) 아래로 하락(CrossDown) 시 청산
// (B) 추가로 7%익절 / 5%손절(PercentStop) 사용
//------------------------------------------------------------------//
If MarketPosition == 1 Then
{
if CrossDown(c,DayMa) Then
ExitLong();
if MaxEntries == 1 Then
{
Buy("bb",AtLimit,EntryPrice*0.93,CurrentContracts*2);
ExitLong("Bp1",AtLimit,EntryPrice*1.07);
}
Else
{
ExitLong("bp2",AtLimit,LatestEntryPrice(0)*1.03);
ExitLong("bl" ,AtStop,LatestEntryPrice(0)*0.95);
}
}
즐거운 하루되세요
> 망고맨 님이 쓴 글입니다.
> 제목 : 청산관련하여 질문 드립니다.
> ////////////////////////////////////////////////////////////////////
// 개선된 Stochastic Slow(이중바닥) + 5/10일선 + 일봉기반 청산 + 7%익절/5%손절
////////////////////////////////////////////////////////////////////
Inputs:
Period(7), // 일봉 평균 계산 기간
Day5(5), // 단기 이동평균
Day10(10); // 장기 이동평균
Vars:
// 스윙포인트 관련
SLV1(0), SLV2(0),
// 스토캐스틱 (두 가지 주기)
stoK(0), stoD(0),
stoK1(0), stoD1(0),
// 5일/10일 이동평균
var1(0), var2(0),
// 일봉 평균 계산용
Sum(0), Sum1(0), cnt(0),
DayMa(0), DayMa2(0), // DayMa2는 Sum1 활용 예시
// 기타
swingBar1(0), swingBar2(0); // 스윙로우 발생 봉 인덱스(20봉 이내인지 체크용)
//------------------------------------------------------------------//
// (1) 이동평균 및 스토캐스틱 계산
//------------------------------------------------------------------//
// --> 입력값 Day5, Day10 활용
var1 = MA(C, Day5); // 5일 이동평균
var2 = MA(C, Day10); // 10일 이동평균
// Stochastic(20,12)와 SlowD(20,12,12)
stoK = StochasticsK(20, 12);
stoD = StochasticsD(20, 12, 12);
// Stochastic(10,6)와 SlowD(10,6,6)
stoK1 = StochasticsK(10, 6);
stoD1 = StochasticsD(10, 6, 6);
//------------------------------------------------------------------//
// (2) 스윙 저점(이중바닥) 탐색
//------------------------------------------------------------------//
// SwingLow(N, 데이터, LeftStrength, RightStrength, 최대바 수)
// N=1 → 가장 최근 스윙 저점 값, N=2 → 이전 스윙 저점 값
SLV1 = SwingLow(1, stoK, 3, 2, 100);
SLV2 = SwingLow(2, stoK, 3, 2, 100);
// 봉 인덱스도 얻을 수 있다면(환경에 따라 다름)
// SwingLowBar(N, 데이터, LeftStr, RightStr, 최대바수)
swingBar1 = SwingLowBar(1, stoK, 3, 2, 100);
swingBar2 = SwingLowBar(2, stoK, 3, 2, 100);
//------------------------------------------------------------------//
// (3) 일봉 평균(DayClose) 계산
//------------------------------------------------------------------//
// 7일간(DayClose) 합산 → DayMa
// Sum1도 함께 구해, 필요시 다른 로직에 활용 (DayMa2)
Sum = 0;
Sum1 = 0;
For cnt = 0 to Period - 1
Begin
Sum = Sum + DayClose(cnt);
Sum1 = Sum1 + DayClose(cnt + 1);
End;
DayMa = Sum / Period;
DayMa2 = Sum1 / Period; // 이 값(DayMa2)은 필요시 다른 조건에 활용 가능
//------------------------------------------------------------------//
// (4) 매수 조건:
// - 스윙저점 SLV1 >= SLV2 (최근 저점이 이전 저점 이상)
// - (var1 > var2) → 5일선이 10일선 위
// - (stoK > stoD) 또는 (stoK1 > stoD1) 중 하나라도 골든크로스
// - (swingBar1 - swingBar2 <= 20) → 최근 두 스윙저점이 20봉 이내(옵션)
//------------------------------------------------------------------//
If MarketPosition == 0 Then
Begin
// “스윙 저점이 20봉 이내”를 확인하고 싶다면 아래 조건 사용:
// (AbsValue(swingBar1 - swingBar2) <= 20)
// 환경마다 swingBar1,2가 큰 값(과거)부터 작은 값(최근) 순으로 나오므로
// 실제 동작을 확인해봐야 합니다.
If (SLV1 >= SLV2) and
(var1 > var2) and
( (stoK > stoD) or (stoK1 > stoD1) )
// and (AbsValue(swingBar1 - swingBar2) <= 20) // 옵션
Then
Begin
// 중복 매수를 막기 위해 한 봉에 단 한 번의 매수만 발생
Buy("이중바닥매수");
End;
End;
//------------------------------------------------------------------//
// (5) 청산 조건:
// (A) 현재 종가가 DayMa(7일 평균) 아래로 하락(CrossDown) 시 청산
// (B) 추가로 7%익절 / 5%손절(PercentStop) 사용
//------------------------------------------------------------------//
If MarketPosition == 1 Then
{
if CrossDown(c,DayMa) Then
ExitLong();
}
// (A) SetStopProfitTarget(7, PercentStop) → +7% 익절
// (B) SetStopLoss(5, PercentStop) → -5% 손절
SetStopProfitTarget(7, PercentStop);
SetStopLoss(5, PercentStop);
7%익절 -5%손절 부분을
* 7%익절
* -7%하락시 보유수량의 2배만큼 추가매수
* 추가매수된 상태에서는 +3%익절, -5%손절
* 청산 후 3개봉까지는 신호가 발생해도 매수하지 않도록
위와같이 수정하고 싶은데 코드가 잘 만들어지지 않습니다. 도움주시면 감사하겠습니다.
정말 감사합니다. 작성해주신 수식을 적용해 보니
첫번째 매수는 청산(-7%)되고, 바로 추가매수된 후 추가매수 조건에 따라 청산되는데요
첫번째 매수 상태에서 추가매수되면 첫번째 매수는 청산되지 않고, 합산된 평균단가를 기준으로 추가매수 조건(3%익절, -5%순절)에 따라 두개의 포지션 모두 청산되도록 해주시면 감사하겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 청산관련하여 질문 드립니다.
>
안녕하세요
예스스탁입니다.
////////////////////////////////////////////////////////////////////
// 개선된 Stochastic Slow(이중바닥) + 5/10일선 + 일봉기반 청산 + 7%익절/5%손절
////////////////////////////////////////////////////////////////////
Inputs:
Period(7), // 일봉 평균 계산 기간
Day5(5), // 단기 이동평균
Day10(10); // 장기 이동평균
Vars:
// 스윙포인트 관련
SLV1(0), SLV2(0),
// 스토캐스틱 (두 가지 주기)
stoK(0), stoD(0),
stoK1(0), stoD1(0),
// 5일/10일 이동평균
var1(0), var2(0),
// 일봉 평균 계산용
Sum(0), Sum1(0), cnt(0),
DayMa(0), DayMa2(0), // DayMa2는 Sum1 활용 예시
// 기타
swingBar1(0), swingBar2(0); // 스윙로우 발생 봉 인덱스(20봉 이내인지 체크용)
//------------------------------------------------------------------//
// (1) 이동평균 및 스토캐스틱 계산
//------------------------------------------------------------------//
// --> 입력값 Day5, Day10 활용
var1 = MA(C, Day5); // 5일 이동평균
var2 = MA(C, Day10); // 10일 이동평균
// Stochastic(20,12)와 SlowD(20,12,12)
stoK = StochasticsK(20, 12);
stoD = StochasticsD(20, 12, 12);
// Stochastic(10,6)와 SlowD(10,6,6)
stoK1 = StochasticsK(10, 6);
stoD1 = StochasticsD(10, 6, 6);
//------------------------------------------------------------------//
// (2) 스윙 저점(이중바닥) 탐색
//------------------------------------------------------------------//
// SwingLow(N, 데이터, LeftStrength, RightStrength, 최대바 수)
// N=1 → 가장 최근 스윙 저점 값, N=2 → 이전 스윙 저점 값
SLV1 = SwingLow(1, stoK, 3, 2, 100);
SLV2 = SwingLow(2, stoK, 3, 2, 100);
// 봉 인덱스도 얻을 수 있다면(환경에 따라 다름)
// SwingLowBar(N, 데이터, LeftStr, RightStr, 최대바수)
swingBar1 = SwingLowBar(1, stoK, 3, 2, 100);
swingBar2 = SwingLowBar(2, stoK, 3, 2, 100);
//------------------------------------------------------------------//
// (3) 일봉 평균(DayClose) 계산
//------------------------------------------------------------------//
// 7일간(DayClose) 합산 → DayMa
// Sum1도 함께 구해, 필요시 다른 로직에 활용 (DayMa2)
Sum = 0;
Sum1 = 0;
For cnt = 0 to Period - 1
Begin
Sum = Sum + DayClose(cnt);
Sum1 = Sum1 + DayClose(cnt + 1);
End;
DayMa = Sum / Period;
DayMa2 = Sum1 / Period; // 이 값(DayMa2)은 필요시 다른 조건에 활용 가능
//------------------------------------------------------------------//
// (4) 매수 조건:
// - 스윙저점 SLV1 >= SLV2 (최근 저점이 이전 저점 이상)
// - (var1 > var2) → 5일선이 10일선 위
// - (stoK > stoD) 또는 (stoK1 > stoD1) 중 하나라도 골든크로스
// - (swingBar1 - swingBar2 <= 20) → 최근 두 스윙저점이 20봉 이내(옵션)
//------------------------------------------------------------------//
If MarketPosition == 0 Then
Begin
// “스윙 저점이 20봉 이내”를 확인하고 싶다면 아래 조건 사용:
// (AbsValue(swingBar1 - swingBar2) <= 20)
// 환경마다 swingBar1,2가 큰 값(과거)부터 작은 값(최근) 순으로 나오므로
// 실제 동작을 확인해봐야 합니다.
If MarketPosition == 0 and (TotalTrades == 0 or (TotalTrades >= 1 and BarsSinceExit(1) >= 3)) and
(SLV1 >= SLV2) and
(var1 > var2) and
( (stoK > stoD) or (stoK1 > stoD1) )
// and (AbsValue(swingBar1 - swingBar2) <= 20) // 옵션
Then
Begin
// 중복 매수를 막기 위해 한 봉에 단 한 번의 매수만 발생
Buy("이중바닥매수");
End;
End;
//------------------------------------------------------------------//
// (5) 청산 조건:
// (A) 현재 종가가 DayMa(7일 평균) 아래로 하락(CrossDown) 시 청산
// (B) 추가로 7%익절 / 5%손절(PercentStop) 사용
//------------------------------------------------------------------//
If MarketPosition == 1 Then
{
if CrossDown(c,DayMa) Then
ExitLong();
if MaxEntries == 1 Then
{
Buy("bb",AtLimit,EntryPrice*0.93,CurrentContracts*2);
ExitLong("Bp1",AtLimit,EntryPrice*1.07);
}
Else
{
ExitLong("bp2",AtLimit,LatestEntryPrice(0)*1.03);
ExitLong("bl" ,AtStop,LatestEntryPrice(0)*0.95);
}
}
즐거운 하루되세요
> 망고맨 님이 쓴 글입니다.
> 제목 : 청산관련하여 질문 드립니다.
> ////////////////////////////////////////////////////////////////////
// 개선된 Stochastic Slow(이중바닥) + 5/10일선 + 일봉기반 청산 + 7%익절/5%손절
////////////////////////////////////////////////////////////////////
Inputs:
Period(7), // 일봉 평균 계산 기간
Day5(5), // 단기 이동평균
Day10(10); // 장기 이동평균
Vars:
// 스윙포인트 관련
SLV1(0), SLV2(0),
// 스토캐스틱 (두 가지 주기)
stoK(0), stoD(0),
stoK1(0), stoD1(0),
// 5일/10일 이동평균
var1(0), var2(0),
// 일봉 평균 계산용
Sum(0), Sum1(0), cnt(0),
DayMa(0), DayMa2(0), // DayMa2는 Sum1 활용 예시
// 기타
swingBar1(0), swingBar2(0); // 스윙로우 발생 봉 인덱스(20봉 이내인지 체크용)
//------------------------------------------------------------------//
// (1) 이동평균 및 스토캐스틱 계산
//------------------------------------------------------------------//
// --> 입력값 Day5, Day10 활용
var1 = MA(C, Day5); // 5일 이동평균
var2 = MA(C, Day10); // 10일 이동평균
// Stochastic(20,12)와 SlowD(20,12,12)
stoK = StochasticsK(20, 12);
stoD = StochasticsD(20, 12, 12);
// Stochastic(10,6)와 SlowD(10,6,6)
stoK1 = StochasticsK(10, 6);
stoD1 = StochasticsD(10, 6, 6);
//------------------------------------------------------------------//
// (2) 스윙 저점(이중바닥) 탐색
//------------------------------------------------------------------//
// SwingLow(N, 데이터, LeftStrength, RightStrength, 최대바 수)
// N=1 → 가장 최근 스윙 저점 값, N=2 → 이전 스윙 저점 값
SLV1 = SwingLow(1, stoK, 3, 2, 100);
SLV2 = SwingLow(2, stoK, 3, 2, 100);
// 봉 인덱스도 얻을 수 있다면(환경에 따라 다름)
// SwingLowBar(N, 데이터, LeftStr, RightStr, 최대바수)
swingBar1 = SwingLowBar(1, stoK, 3, 2, 100);
swingBar2 = SwingLowBar(2, stoK, 3, 2, 100);
//------------------------------------------------------------------//
// (3) 일봉 평균(DayClose) 계산
//------------------------------------------------------------------//
// 7일간(DayClose) 합산 → DayMa
// Sum1도 함께 구해, 필요시 다른 로직에 활용 (DayMa2)
Sum = 0;
Sum1 = 0;
For cnt = 0 to Period - 1
Begin
Sum = Sum + DayClose(cnt);
Sum1 = Sum1 + DayClose(cnt + 1);
End;
DayMa = Sum / Period;
DayMa2 = Sum1 / Period; // 이 값(DayMa2)은 필요시 다른 조건에 활용 가능
//------------------------------------------------------------------//
// (4) 매수 조건:
// - 스윙저점 SLV1 >= SLV2 (최근 저점이 이전 저점 이상)
// - (var1 > var2) → 5일선이 10일선 위
// - (stoK > stoD) 또는 (stoK1 > stoD1) 중 하나라도 골든크로스
// - (swingBar1 - swingBar2 <= 20) → 최근 두 스윙저점이 20봉 이내(옵션)
//------------------------------------------------------------------//
If MarketPosition == 0 Then
Begin
// “스윙 저점이 20봉 이내”를 확인하고 싶다면 아래 조건 사용:
// (AbsValue(swingBar1 - swingBar2) <= 20)
// 환경마다 swingBar1,2가 큰 값(과거)부터 작은 값(최근) 순으로 나오므로
// 실제 동작을 확인해봐야 합니다.
If (SLV1 >= SLV2) and
(var1 > var2) and
( (stoK > stoD) or (stoK1 > stoD1) )
// and (AbsValue(swingBar1 - swingBar2) <= 20) // 옵션
Then
Begin
// 중복 매수를 막기 위해 한 봉에 단 한 번의 매수만 발생
Buy("이중바닥매수");
End;
End;
//------------------------------------------------------------------//
// (5) 청산 조건:
// (A) 현재 종가가 DayMa(7일 평균) 아래로 하락(CrossDown) 시 청산
// (B) 추가로 7%익절 / 5%손절(PercentStop) 사용
//------------------------------------------------------------------//
If MarketPosition == 1 Then
{
if CrossDown(c,DayMa) Then
ExitLong();
}
// (A) SetStopProfitTarget(7, PercentStop) → +7% 익절
// (B) SetStopLoss(5, PercentStop) → -5% 손절
SetStopProfitTarget(7, PercentStop);
SetStopLoss(5, PercentStop);
7%익절 -5%손절 부분을
* 7%익절
* -7%하락시 보유수량의 2배만큼 추가매수
* 추가매수된 상태에서는 +3%익절, -5%손절
* 청산 후 3개봉까지는 신호가 발생해도 매수하지 않도록
위와같이 수정하고 싶은데 코드가 잘 만들어지지 않습니다. 도움주시면 감사하겠습니다.