if marketposition == 1 then
{
if sdate == EntryDate Then
{
setstoploss(1,PercentStop);
}
if sdate >= EntryDate+1 and sdate < EntryDate+3 Then
{
setstoploss(0.5,PercentStop);
if CrossDown(C,삼일저가평균) Then
{
ExitLong("EX1",AtStop,삼일저가평균);
}
}
if sdate >= EntryDate+3 Then
{
setstoploss(0.2,PercentStop);
if CrossDown(C,삼일저가평균) Then
{
ExitLong("EX2",AtStop,삼일저가평균);
}
}
}
이렇게 작성했는데 시뮬을 돌리면 stop 값이 일별 진행과 상관없이 전부 동일하게 작은값으로 적용이 되어버립니다.
로직이 잘못된 것 같아 보이지는 않는데 이유를 모르겠어요.
답변 1
예스스탁
예스스탁 답변
2021-12-24 09:57:43
안녕하세요
예스스탁입니다.
1
강제청산은 한번셋팅이 되면 다음 if조건이 만족해 변경될때까지 그 값이 유지가 됩니다.
if문은 봉완성이 기준입니다.
if marketposition == 1 then
{
if sdate == EntryDate Then
{
위 조건은 진입이 후 최소 한개봉은 완성이 되어야 조건이 성립되고
진입이후 첫봉 봉완성시 if조건이 만족해서 셋팅이 되면
두번째 봉부터 새로운 스탑조건으로 감시를 하게 됩니다.
즉 작성하신 수식은 진입이후 두번쨰 봉부터 1%손절을 감시하게 됩니다.
2
청산후에 다음진입까지 값이 유지가 되므로
진입봉에서 셋팅은 이전에 셋팅해 놓은 값입니다.
그러므로 직전 진입이 0.2%에 손절되었다면
다음 진입봉후 첫봉에 0.2% 하락하면 손절이 나오게 됩니다.
1% 손절이 진입과 동시에 셋팅이 되어야 하므로
아래와 같이 지정하시면 진입과 동시에 1%손절셋팅으로 시작하게 됩니다.
3
sdate >= EntryDate+1 and sdate < EntryDate+3
랭귀지에서 날짜는 단지 8자리(천만단위) 숫자입니다.
진입일이 20211130이고 다음날이 20211201이면 아래와 같은 계산식과 조건문이 됩니다.
20211201 >= 20211131(20211130+1) and 20211201 < 20211133(20211130+3)
날짜에 +1이나 +3을 해서 자동으로 아래와 같이 변환되는 것이 아닙니다.
EntryDate+1 --> 20211201
EntryDate+3 --> 20211203
진입이후 N일경과는 아래와 같이 날짜변경을 카운트해서 이용하셔야 합니다.
4
var : Didx(0);
if Bdate != Bdate[1] Then
Didx = Didx+1;
if marketposition == 1 then
{
//진입후 1거래일 이후 3거래일 미만에서만 0.5% 설정
if Didx >= Didx[BarsSinceEntry]+1 and Didx < Didx[BarsSinceEntry]+3 Then
{
setstoploss(0.5,PercentStop);
}
//진입후 3거래일 이후에는 0.2% 설정
if Didx >= Didx[BarsSinceEntry]+3 Then
{
setstoploss(0.2,PercentStop);
}
}
Else //marketposition이 1이 되기 전에 1% 셋팅
setstoploss(1,PercentStop);
즐거운 하루되세요
> 윤이 님이 쓴 글입니다.
> 제목 : 진입 후 일자별로 stoploss를 다르게 설정하려고 합니다.
> if marketposition == 1 then
{
if sdate == EntryDate Then
{
setstoploss(1,PercentStop);
}
if sdate >= EntryDate+1 and sdate < EntryDate+3 Then
{
setstoploss(0.5,PercentStop);
if CrossDown(C,삼일저가평균) Then
{
ExitLong("EX1",AtStop,삼일저가평균);
}
}
if sdate >= EntryDate+3 Then
{
setstoploss(0.2,PercentStop);
if CrossDown(C,삼일저가평균) Then
{
ExitLong("EX2",AtStop,삼일저가평균);
}
}
}
이렇게 작성했는데 시뮬을 돌리면 stop 값이 일별 진행과 상관없이 전부 동일하게 작은값으로 적용이 되어버립니다.
로직이 잘못된 것 같아 보이지는 않는데 이유를 모르겠어요.