커뮤니티

77274 추가질문 드립니다

프로필 이미지
jshwang2
2022-05-19 17:25:38
888
글번호 159071
답변완료

첨부 이미지

안녕하세요~ 77274 에서 질문드렸던부분 추가질문 드립니다 이전에 올렸던 수식을 1분봉으로 설정하고 1분 단위로 끊어서 로그를 확인해봤는데 ex) 7:30에 진입이 일어났으면, 7:29 ~ 7:31 까지, stime =< 73000 이런 식으로 설정해 1분 단위로 끊어 1분봉의 로그를 확인 정상적으로 진입이 일어난 경우를 진입 시점 전후로 로그의 변화를 체크해보니 1. SC1 == true, SC2 == true, marketposition == 0 2. SC1 == true, SC2 == true, marketposition == -1 3. SC1 == true, SC2 == true, marketposition == -1 이런 식으로 일어났습니다 수식에 진입가격(=LL[i]) 도달시, SC1, SC2를 false로 바꾸도록 설정했는데 - 진입조건 if MarketPosition == 0 && BC1[i] == true && BC2[i] == true Then Buy("b01", AtLimit, LL[i]); if CrossUp(H, LL[i+1]) Then BC1[i] = true; if BC1[i] == true && CrossUp(H, LL[i-1]) Then BC2[i] = true; - 청산조건 if EntryPrice <= (LL[i]+LL[i-1])/2 && EntryPrice >= (LL[i]+LL[i+1])/2 Then { ExitLong("exitL01-1", AtLimit, (LL[i]+LL[i-1])/2); ExitLong("exitL01-2", AtStop, LL[i+1]); } - SC1,2 false로 바꾸는 조건 if (CrossDown(L, LL[i])&& BC1[i] == true && BC2[i] == true) or CrossUp(H, LL[i-2]) Then { BC1[i] = False; BC2[i] = False; } marketposition은 진입이 일어난 봉에서 바로 변하는데 SC1, SC2는 조건을 만족한 봉에서 한봉 더 지나야 변했습니다 이전 글에서 첨부한 사진의 문제도 다시 확인해보면 의도한대로라면 1-1에서 기존의 매수 표지션도 청산되고, SC2 또한 L[5](=11884)에 도달해 true로 바뀌어야 했으나 1-1 완성 이후엔 marketposition만 1 => 0으로 바뀌었고, SC2는 여전히 false였습니다 의도한대로라면 1-2에서 L[4](=11894)에 도달해 s04가 체결되어야 했으나 이때는 SC2 == false이어서 체결되지 않았고 1-2의 봉이 완성되고 나서야 SC2가 true로 바뀌었고, 1-3의 시가가 원래의 atlimit 체결가인 11894보다 높기 때문에 시가로 체결된 상황입니다 이후에도 청산 될때마다 s04 진입이 지속된건 SC1, SC2를 false로 리셋하는 조건이, SC1, SC2 둘 다 true이면서 L[i]를 crossup하는 상황인데 1-2에서 SC2가 false였고, 1-3이 되서야 SC2가 true로 바뀌었지만, 이미 1-3의 시가 > L[4]인 상황에서 양봉으로 마무리되었기 때문에, L[4]를 crossup을 하지 않아 s04가 청산될때마다 계속 진입이 일어난것이었습니다 문제의 원인은 marketposition은 event가 발생한 봉이 완성된 직후 바로 바뀌는데 제가 설정해놓은 SC1, SC2는 event가 발생한 봉에서 한 봉이 더 완성되고 나서 바뀌기 때문이고 사진상의 봉 뿐만 아니라 다른 봉들 및 매도가 아닌 매수 상황까지 포함해 여러개 확인해봤을때 BC1, BC2, SC1, SC2가 한봉 지연되어 바뀌는 문제가 전부 확인되었습니다 이런 문제가 발생하는 원인이 무엇인지 해결하려면 어떻게 해야하는지 알고싶습니다 감사합니다
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2022-05-20 11:07:42

안녕하세요 예스스탁입니다. 수식은 차트에 적용하면 차트 첫봉부터 마지막봉으로 수행되고 매봉 수식도 코드상 위에서 아래로만 읽어들어가게 됩니다. MessageLog("start %s %s",SC1[i],SC2[i]); if MarketPosition == 0 && SC1[i] == true && SC2[i] == true Then Sell("s03", AtLimit, LL[i]); if CrossDown(L, LL[i-1]) Then SC1[i] = true; if SC1[i] == true && CrossDown(L, LL[i+1]) Then SC2[i] = true; if (CrossUp(H, LL[i])&& SC1[i] == true && SC2[i] == true) or CrossDown(L, LL[i+2]) Then { SC1[i] = False; SC2[i] = False; } MessageLog("end %s %s",SC1[i],SC2[i]); 위와 같이 현재 작성하신 수식들은 진입식이 BC1,BC2나 SC1,SC2에 값을 저장하는 것보다 위에 있습니다. 진입의 if문을 읽을때는 해당 변수에 기존에 저장한 값(한봉전값)을 사용하고 변수에 값을 나중에 변경하는 형태입니다. 위와 같이 메세지로그를 상하단에 넣어보시면 해당문장의 시작시점과 끝시점에서 값이 어떻게 변경되는지 알수 있습니다. 그러므로 작성하신 수식은 진입도 만약 가격 하락해 현재봉에서 [i+1]을 터치하고 다음봉에서 바로 상승해 [i]을 터치해도 매도신호가 나오지 않고 다다음봉에서 발생하게 됩니다. 현재봉 시세를 포함해서 변수에 값을 저장하고 해당 변수를 if문에서 사용한다면 변수의 값저장이 if문 보다 위에 있게 작성하셔야 합니다. if CrossDown(L, LL[i-1]) Then SC1[i] = true; if SC1[i] == true && CrossDown(L, LL[i+1]) Then SC2[i] = true; if (CrossUp(H, LL[i])&& SC1[i] == true && SC2[i] == true) or CrossDown(L, LL[i+2]) Then { SC1[i] = False; SC2[i] = False; } if MarketPosition == 0 && SC1[i] == true && SC2[i] == true Then Sell("s04", AtLimit, LL[i]); if EntryPrice <= (LL[i]+LL[i-1])/2 && EntryPrice >= (LL[i]+LL[i+1])/2 Then { ExitShort("exitS4-1", AtLimit, (LL[i]+LL[i+1])/2); ExitShort("exitS4-2", AtStop, LL[i-1]); } 추가로 궁금하신 내용이 있으시면 02-3453-1060으로 전화주시기 바랍니다. 즐거운 하루되세요 > jshwang2 님이 쓴 글입니다. > 제목 : 77274 추가질문 드립니다 > 안녕하세요~ 77274 에서 질문드렸던부분 추가질문 드립니다 이전에 올렸던 수식을 1분봉으로 설정하고 1분 단위로 끊어서 로그를 확인해봤는데 ex) 7:30에 진입이 일어났으면, 7:29 ~ 7:31 까지, stime =< 73000 이런 식으로 설정해 1분 단위로 끊어 1분봉의 로그를 확인 정상적으로 진입이 일어난 경우를 진입 시점 전후로 로그의 변화를 체크해보니 1. SC1 == true, SC2 == true, marketposition == 0 2. SC1 == true, SC2 == true, marketposition == -1 3. SC1 == true, SC2 == true, marketposition == -1 이런 식으로 일어났습니다 수식에 진입가격(=LL[i]) 도달시, SC1, SC2를 false로 바꾸도록 설정했는데 - 진입조건 if MarketPosition == 0 && BC1[i] == true && BC2[i] == true Then Buy("b01", AtLimit, LL[i]); if CrossUp(H, LL[i+1]) Then BC1[i] = true; if BC1[i] == true && CrossUp(H, LL[i-1]) Then BC2[i] = true; - 청산조건 if EntryPrice <= (LL[i]+LL[i-1])/2 && EntryPrice >= (LL[i]+LL[i+1])/2 Then { ExitLong("exitL01-1", AtLimit, (LL[i]+LL[i-1])/2); ExitLong("exitL01-2", AtStop, LL[i+1]); } - SC1,2 false로 바꾸는 조건 if (CrossDown(L, LL[i])&& BC1[i] == true && BC2[i] == true) or CrossUp(H, LL[i-2]) Then { BC1[i] = False; BC2[i] = False; } marketposition은 진입이 일어난 봉에서 바로 변하는데 SC1, SC2는 조건을 만족한 봉에서 한봉 더 지나야 변했습니다 이전 글에서 첨부한 사진의 문제도 다시 확인해보면 의도한대로라면 1-1에서 기존의 매수 표지션도 청산되고, SC2 또한 L[5](=11884)에 도달해 true로 바뀌어야 했으나 1-1 완성 이후엔 marketposition만 1 => 0으로 바뀌었고, SC2는 여전히 false였습니다 의도한대로라면 1-2에서 L[4](=11894)에 도달해 s04가 체결되어야 했으나 이때는 SC2 == false이어서 체결되지 않았고 1-2의 봉이 완성되고 나서야 SC2가 true로 바뀌었고, 1-3의 시가가 원래의 atlimit 체결가인 11894보다 높기 때문에 시가로 체결된 상황입니다 이후에도 청산 될때마다 s04 진입이 지속된건 SC1, SC2를 false로 리셋하는 조건이, SC1, SC2 둘 다 true이면서 L[i]를 crossup하는 상황인데 1-2에서 SC2가 false였고, 1-3이 되서야 SC2가 true로 바뀌었지만, 이미 1-3의 시가 > L[4]인 상황에서 양봉으로 마무리되었기 때문에, L[4]를 crossup을 하지 않아 s04가 청산될때마다 계속 진입이 일어난것이었습니다 문제의 원인은 marketposition은 event가 발생한 봉이 완성된 직후 바로 바뀌는데 제가 설정해놓은 SC1, SC2는 event가 발생한 봉에서 한 봉이 더 완성되고 나서 바뀌기 때문이고 사진상의 봉 뿐만 아니라 다른 봉들 및 매도가 아닌 매수 상황까지 포함해 여러개 확인해봤을때 BC1, BC2, SC1, SC2가 한봉 지연되어 바뀌는 문제가 전부 확인되었습니다 이런 문제가 발생하는 원인이 무엇인지 해결하려면 어떻게 해야하는지 알고싶습니다 감사합니다