커뮤니티

진입별 청산 오류

프로필 이미지
건곤대
2022-10-21 14:56:04
1290
글번호 163191
답변완료
안녕하세요. 진입별로 청산이 정상작동하지 않아 문의드립니다. 약간 복잡할 수 있지만, 아래 식과 같이 손익절을 진입별로 구분해서 쓰고 있습니다. 다른 진입에 대한 익절과 손절은 다 잘 작동하는데, 유독 "A_MT"라는 진입에 대해서 특정한 날에 손절이 작동하지 않는것을 거래내역을 통해 알았습니다. 특정한 날이라 하면, 매수 "D" 진입이 A_MT라는 매수진입으로 청산되면서 진입되는 날에는 A_MT에 원하는 손절이 적용안되고, 1분후에 바로 청산되고, 매수되기를 반복하는 현상이 발생합니다. 다른 진입과 간섭이 문제가 되는거 같아서, 나머지 진입들과 청산조건을 모두 삭제하고 A_MT에 대한 진입과 청산만 남겨두고 테스트를 해보면 정상적으로 작동하는것을 확인했습니다. 따라서, 반대포지션과 바로 스위칭되었을때 원하는 손절이 안되고 있는것으로 보이는데요, 버그같기도 하구요. (*아래는 대강의 구조만 작성했습니다. minor한 오류는 있을수 있습니다) ------------------------------------------ IF MT condition = true then { if ~ then sell("D"); if ~ then buy("A_MT"); } Else { if ~ then buy("A"); if ~ then buy("B"); if ~ then Sell("C"); } if Marketposition() == 1 then{ if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "A" Then var3 = LatestEntryPrice(0); if LatestEntryName(0) == "A_MT" Then var9 = LatestEntryPrice(0); } if var9 > 0 Then { ExitLong("A_MT손절",AtStop,var9*(1-cut1_l/100),"A_MT",2*k); } if var3 > 0 Then { ExitLong("B익절",Atlimit,var3*(1+gain_gl/100),"B",2*k); ExitLong("B손절",AtStop,Var3*(1-cut_gl/100),"B",2*k); } } else if Marketposition() == -1 then{ if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "C" Then var5 = LatestEntryPrice(0); if LatestEntryName(0) == "D" Then var6 = LatestEntryPrice(0); } if var5 > 0 Then { ExitShort("C익절",Atlimit,Var5*(1-gain_gs/100),"C",2*k); } if var6 > 0 Then ExitShort("D손절",AtStop,var6*(1+cut_mt/100),"D",2*k); } else{ SetStopProfittarget(0); setstoploss(0); }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2022-10-21 16:36:04

안녕하세요 예스스탁입니다. 수식의 var3,var9는 매수포지션이 아니면 0으로 초기화가 되게 하셔야 합니다. 새로 진입하고 지정한 이름의 진입이 발생하면 새로운 값을 저장하게 됩니다. 청산식에 var3 > 0, var9 > 0이라는 조건이 있는 이유도 매수진입후 지정한 이름의 진입이 발생해서 값이 저장되었다는 의미입니다. 초기화가 없으면 기존값이 유지가 되므로 다음 매수진입하게 되면 기존 저장된 값 대비로 신호가 발생하게 됩니다. if Marketposition() == 1 then { if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "A" Then var3 = LatestEntryPrice(0); if LatestEntryName(0) == "A_MT" Then var9 = LatestEntryPrice(0); } if var9 > 0 Then { ExitLong("A_MT손절",AtStop,var9*(1-cut1_l/100),"A_MT",2*k); } if var3 > 0 Then { ExitLong("B익절",Atlimit,var3*(1+gain_gl/100),"B",2*k); ExitLong("B손절",AtStop,Var3*(1-cut_gl/100),"B",2*k); } } Else { Var3 = 0; Var9 = 0; } if Marketposition() == -1 then { if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "C" Then var5 = LatestEntryPrice(0); if LatestEntryName(0) == "D" Then var6 = LatestEntryPrice(0); } if var5 > 0 Then ExitShort("C익절",Atlimit,Var5*(1-gain_gs/100),"C",2*k); if var6 > 0 Then ExitShort("D손절",AtStop,var6*(1+cut_mt/100),"D",2*k); } Else { Var5 = 0; Var6 = 0; } if MarketPosition == 0 Then { SetStopProfittarget(0); setstoploss(0); } 즐거운 하루되세요 > 건곤대 님이 쓴 글입니다. > 제목 : 진입별 청산 오류 > 안녕하세요. 진입별로 청산이 정상작동하지 않아 문의드립니다. 약간 복잡할 수 있지만, 아래 식과 같이 손익절을 진입별로 구분해서 쓰고 있습니다. 다른 진입에 대한 익절과 손절은 다 잘 작동하는데, 유독 "A_MT"라는 진입에 대해서 특정한 날에 손절이 작동하지 않는것을 거래내역을 통해 알았습니다. 특정한 날이라 하면, 매수 "D" 진입이 A_MT라는 매수진입으로 청산되면서 진입되는 날에는 A_MT에 원하는 손절이 적용안되고, 1분후에 바로 청산되고, 매수되기를 반복하는 현상이 발생합니다. 다른 진입과 간섭이 문제가 되는거 같아서, 나머지 진입들과 청산조건을 모두 삭제하고 A_MT에 대한 진입과 청산만 남겨두고 테스트를 해보면 정상적으로 작동하는것을 확인했습니다. 따라서, 반대포지션과 바로 스위칭되었을때 원하는 손절이 안되고 있는것으로 보이는데요, 버그같기도 하구요. (*아래는 대강의 구조만 작성했습니다. minor한 오류는 있을수 있습니다) ------------------------------------------ IF MT condition = true then { if ~ then sell("D"); if ~ then buy("A_MT"); } Else { if ~ then buy("A"); if ~ then buy("B"); if ~ then Sell("C"); } if Marketposition() == 1 then{ if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "A" Then var3 = LatestEntryPrice(0); if LatestEntryName(0) == "A_MT" Then var9 = LatestEntryPrice(0); } if var9 > 0 Then { ExitLong("A_MT손절",AtStop,var9*(1-cut1_l/100),"A_MT",2*k); } if var3 > 0 Then { ExitLong("B익절",Atlimit,var3*(1+gain_gl/100),"B",2*k); ExitLong("B손절",AtStop,Var3*(1-cut_gl/100),"B",2*k); } } else if Marketposition() == -1 then{ if CurrentContracts > CurrentContracts[1] Then { if LatestEntryName(0) == "C" Then var5 = LatestEntryPrice(0); if LatestEntryName(0) == "D" Then var6 = LatestEntryPrice(0); } if var5 > 0 Then { ExitShort("C익절",Atlimit,Var5*(1-gain_gs/100),"C",2*k); } if var6 > 0 Then ExitShort("D손절",AtStop,var6*(1+cut_mt/100),"D",2*k); } else{ SetStopProfittarget(0); setstoploss(0); }