커뮤니티

수식 부탁드립니다.

프로필 이미지
spek
2015-05-18 12:28:38
195
글번호 86131
답변완료

첨부 이미지

안녕하십니까? 매번 성의있는 답변 감사드립니다. 1. 얼마전에 짜주신 수식중에서 아래와 같은 것있는데요. (제가 살짝 변경, if MarketPosition <= 0 따위를 == 으로 변경. 왜냐하면 계속 며칠간 보유하고 싶은데, <= 따위 때문에 청산되고 다른 포지션으로 재진입한다던가 해서.....) 이렇게 하니 진입신호가 떠야 되는데 안뜨는 경우가 있더군요. 예를들어, 매수 진입의 경우 1.01 보다 최고가가 낮다가 1.01을 때리는 순간 진입하게 되어있는데, 만약 며칠전에 보유한 계약을 청산하고 진입하려고 하니 이미 최고가가 진입가보다 높아져서 더이상 진입을 안하더라고요. 제가 첨부한 그림을 보시면 sx1 은 5.12 에 진입한 것을 청산한 것이고, 5.13 10시 시가를 기준으로 1.01 상승하면 13470 이라 이때 다시 진입하려고 하는데, 동그라미로 표시한 부분의 최고가가 이미 13470 을 넘어서 있어서 진입이 안됩니다. 또, 비슷한 경우가 있는데, 예를들어 60.01 에 매도진입한 것이 청산된 후 다음에 다시 60.01 이 되었을 때 재진입 하려고 하는데, 이 때도 역시 매도진입 조건이 최저가를 계속해서 낮추다고 0.99 하락변동 하는 순간 진입하게 되있는데, 최저가가 이미 더 낮은 상태이고, 그상태에서 고가만 60.01 까지 갔다가 다시 내려가니 진입이 안됩니다. atlimit 이나 isexitname 등 함수를 써가며 해봤는데, 부분적으로만 맞고 전체적으로는 자꾸 꼬이고 해서 질문드립니다. input : N(3); var : loss(0); if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{ var1 = O; Loss = 0; } if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and (IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then loss = loss+1; if loss < N then{ if MarketPosition == 0 and stime == 155000 Then buy("b1",AtStop,round(NextBarOpen*1.01,3)); if MarketPosition == 0 and stime == 155000 Then sell("s1",AtStop,round(NextBarOpen*0.99,3)); if MarketPosition == 0 and H < var1*1.01 Then buy("b",AtStop,round(var1*1.01,3)); if MarketPosition == 0 and L > var1*0.99 Then sell("s",AtStop,round(var1*0.99,3)); } if MarketPosition == 1 Then ExitLong("bx",AtStop,round(EntryPrice*0.99,3)); if MarketPosition == -1 Then ExitShort("sx",AtStop,round(EntryPrice*1.01,3)); 2. 썸머타임 적용하는 수식 가능한지요? 유럽 섬머타임 기간 : 3월 마지막주 일요일~10월 마지막주 일요일 / 미국 섬머타임 기간 : 3월 2째주 일요일~11월 첫째주 일요일 인데, 위에 적힌대로, 3월 마지막 주 일요일 따위의 용어가 수식으로 변경 가능한지요? 그래서 섬머타임 기간에는 시간을 1시간씩 당기려고 합니다. 그게 안되면 직접 날짜를 정해서 특정 기간은 제가 정한 시간보다 한시간 당긴다던가 하는 수식이 가능한지요? 3. 해외선물 롤오버 문제인데, 날짜를 미리 설정하여 그날만 되면 청산하고 다음월물로 넘어가는 수식을 부탁드립니다. 다음월물 종목코드라던가 표시해서 매월 정해진 날짜가 되면, 다음달로 롤오버하려고 합니다. 즉, 현재 보유 포지션을 청산하고 다음달에 그대로 같은 것으로 진입하는 것입니다. 예를들어 매수청산후 다음월물 바로 매수진입. 만약에 이렇게 안되면 최소한 정해진 몇월 몇일 몇시에 청산할 수 있도록 하고싶습니다. 그리고 만약 현재월물 포지션을 청산하고 다음월물로 롤오버 하는 날, 다음월로 롤오버하여 진입하는데, 호가 스프레드 차이 등으로 현재의 청산조건에 걸리게 된다면 롤오버하지 않고, 그냥 그날 청산만 했으면 합니다. 예를들어 롤오버하면 현재의 시스템식에서 손절에 걸린다던가, 아니면 트레일링스탑에 걸린다던가 하면 그냥 청산했으면 합니다. 하지만 그렇다고 해도 새로운 거래는 다음 월물을 겨냥하여 시스템이 작동했으면 합니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-05-18 15:04:19

안녕하세요 예스스탁입니다. 1. 문의하신 내용은 NextBarOpen을 이용하면 될것같습니다. 봉완성이 다음봉 시가가 수신될때 인데 NextBarOpen이 다음봉 시가값을 리턴합니다. 매수에서 다음봉 시가가 round(var1*1.01,3) 이하이면 상승해서 round(var1*1.01,3)를 터치할때 매수진입(b1)하고 다음봉 시가가 round(var1*1.01,3) 보다 크면 하락해서 round(var1*1.01,3)를 터치할때 매수진입(b2)합니다. 반대로 매도에서 다음봉 시가가 round(var1*0.99,3) 이상이면 하락해서 round(var1*0.99,3)를 터치할때 매도진입(s1)하고 다음봉 시가가 round(var1*0.99,3)보다 작으면 상승해서 round(var1*0.99,3)값을 터치할때 매도진입(s2)합니다. b2나 s2는 허용치 않으시면 해당 내용은 삭제하시기 바랍니다. input : N(3); var : loss(0); if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{ var1 = O; Loss = 0; } if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and (IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then loss = loss+1; if loss < N then{ if MarketPosition == 0 and stime == 155000 Then buy("b",AtStop,round(NextBarOpen*1.01,3)); if MarketPosition == 0 and stime == 155000 Then sell("s",AtStop,round(NextBarOpen*0.99,3)); if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then buy("b1",AtStop,round(var1*1.01,3)); if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then buy("b2",Atlimit,round(var1*1.01,3)); if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then sell("s1",AtStop,round(var1*0.99,3)); if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then sell("s2",AtLimit,round(var1*0.99,3)); } if MarketPosition == 1 Then ExitLong("bx",AtStop,round(EntryPrice*0.99,3)); if MarketPosition == -1 Then ExitShort("sx",AtStop,round(EntryPrice*1.01,3)); 2. 차트의 데이터중 Bdate라는 데이터가 있습니다. Bdate는 영업일을 리턴하는 함수로 선물사에서 자동으로 Bdate값을 변경해 주게 됩니다. 문의하신 날짜나 요일로 지정은 어렵고 작성된다면 아래와 같이 영업일이 변경되는 시간을 기준으로 시가를 저장해서 사용하셔야 합니다. 썸머타임 모두 반영되어 영업일 변경시간을 기준으로 시초가를 저장해서 사용하실수 있습니다. input : N(3); var : loss(0); if Bdate != Bdate[1] Then{ var1 = O; Loss = 0; } if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and (IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then loss = loss+1; if loss < N then{ if MarketPosition == 0 and stime == 155000 Then buy("b",AtStop,round(NextBarOpen*1.01,3)); if MarketPosition == 0 and stime == 155000 Then sell("s",AtStop,round(NextBarOpen*0.99,3)); if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then buy("b1",AtStop,round(var1*1.01,3)); if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then buy("b2",Atlimit,round(var1*1.01,3)); if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then sell("s1",AtStop,round(var1*0.99,3)); if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then sell("s2",AtLimit,round(var1*0.99,3)); } if MarketPosition == 1 Then ExitLong("bx",AtStop,round(EntryPrice*0.99,3)); if MarketPosition == -1 Then ExitShort("sx",AtStop,round(EntryPrice*1.01,3)); 3. 롤오버는 수식에서 자동으로 가능하지 않습니다. 수식은 차트 데이터만 사용가능하고 주문이 집행되므로 차기월물에 대한 종목코드등 데이터가 없고 스프레드등을 알수가 없습니다. 또한 해외선물의 경우에는 특정일에 월물이 변경되는 것이아닌 근월물이 변경이 거래량으로 판단해 변경이 되고 있어 수식으로 해당 내용을 코딩이 가능하지 않습니다. 해당내용은 수동으로 마춰주셔야 할것 같습니다. 즐거운 하루되세요 > spek 님이 쓴 글입니다. > 제목 : 수식 부탁드립니다. > 안녕하십니까? 매번 성의있는 답변 감사드립니다. 1. 얼마전에 짜주신 수식중에서 아래와 같은 것있는데요. (제가 살짝 변경, if MarketPosition <= 0 따위를 == 으로 변경. 왜냐하면 계속 며칠간 보유하고 싶은데, <= 따위 때문에 청산되고 다른 포지션으로 재진입한다던가 해서.....) 이렇게 하니 진입신호가 떠야 되는데 안뜨는 경우가 있더군요. 예를들어, 매수 진입의 경우 1.01 보다 최고가가 낮다가 1.01을 때리는 순간 진입하게 되어있는데, 만약 며칠전에 보유한 계약을 청산하고 진입하려고 하니 이미 최고가가 진입가보다 높아져서 더이상 진입을 안하더라고요. 제가 첨부한 그림을 보시면 sx1 은 5.12 에 진입한 것을 청산한 것이고, 5.13 10시 시가를 기준으로 1.01 상승하면 13470 이라 이때 다시 진입하려고 하는데, 동그라미로 표시한 부분의 최고가가 이미 13470 을 넘어서 있어서 진입이 안됩니다. 또, 비슷한 경우가 있는데, 예를들어 60.01 에 매도진입한 것이 청산된 후 다음에 다시 60.01 이 되었을 때 재진입 하려고 하는데, 이 때도 역시 매도진입 조건이 최저가를 계속해서 낮추다고 0.99 하락변동 하는 순간 진입하게 되있는데, 최저가가 이미 더 낮은 상태이고, 그상태에서 고가만 60.01 까지 갔다가 다시 내려가니 진입이 안됩니다. atlimit 이나 isexitname 등 함수를 써가며 해봤는데, 부분적으로만 맞고 전체적으로는 자꾸 꼬이고 해서 질문드립니다. input : N(3); var : loss(0); if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{ var1 = O; Loss = 0; } if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and (IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then loss = loss+1; if loss < N then{ if MarketPosition == 0 and stime == 155000 Then buy("b1",AtStop,round(NextBarOpen*1.01,3)); if MarketPosition == 0 and stime == 155000 Then sell("s1",AtStop,round(NextBarOpen*0.99,3)); if MarketPosition == 0 and H < var1*1.01 Then buy("b",AtStop,round(var1*1.01,3)); if MarketPosition == 0 and L > var1*0.99 Then sell("s",AtStop,round(var1*0.99,3)); } if MarketPosition == 1 Then ExitLong("bx",AtStop,round(EntryPrice*0.99,3)); if MarketPosition == -1 Then ExitShort("sx",AtStop,round(EntryPrice*1.01,3)); 2. 썸머타임 적용하는 수식 가능한지요? 유럽 섬머타임 기간 : 3월 마지막주 일요일~10월 마지막주 일요일 / 미국 섬머타임 기간 : 3월 2째주 일요일~11월 첫째주 일요일 인데, 위에 적힌대로, 3월 마지막 주 일요일 따위의 용어가 수식으로 변경 가능한지요? 그래서 섬머타임 기간에는 시간을 1시간씩 당기려고 합니다. 그게 안되면 직접 날짜를 정해서 특정 기간은 제가 정한 시간보다 한시간 당긴다던가 하는 수식이 가능한지요? 3. 해외선물 롤오버 문제인데, 날짜를 미리 설정하여 그날만 되면 청산하고 다음월물로 넘어가는 수식을 부탁드립니다. 다음월물 종목코드라던가 표시해서 매월 정해진 날짜가 되면, 다음달로 롤오버하려고 합니다. 즉, 현재 보유 포지션을 청산하고 다음달에 그대로 같은 것으로 진입하는 것입니다. 예를들어 매수청산후 다음월물 바로 매수진입. 만약에 이렇게 안되면 최소한 정해진 몇월 몇일 몇시에 청산할 수 있도록 하고싶습니다. 그리고 만약 현재월물 포지션을 청산하고 다음월물로 롤오버 하는 날, 다음월로 롤오버하여 진입하는데, 호가 스프레드 차이 등으로 현재의 청산조건에 걸리게 된다면 롤오버하지 않고, 그냥 그날 청산만 했으면 합니다. 예를들어 롤오버하면 현재의 시스템식에서 손절에 걸린다던가, 아니면 트레일링스탑에 걸린다던가 하면 그냥 청산했으면 합니다. 하지만 그렇다고 해도 새로운 거래는 다음 월물을 겨냥하여 시스템이 작동했으면 합니다.