커뮤니티

문의 드립니다.

프로필 이미지
즐겁게
2013-07-12 15:55:27
272
글번호 65256
답변완료
안녕하세요. 시스템식을 만들었는데, 옵션 매수만 하도록 했고, 그래서 일단 buy로 엔트리가 된 상태에서만 바로 그 진입명을 써서, ExitLong이 되도록 만들었습니다. 즉 (MarketPosition == 0일 때) 매수진입하고 (그러면 이제 MarketPosition == 1이 됨), 그 게 매수청산(ExitLong) 되어야 (즉 이제 MarketPositoin == 0 이 되면), 다시 매수진입이 되도록 만들었는데, 그냥 시험적용에서는 제대로 매수진입-매수청산, 매수진입-매수청산, ... 순서대로 아주 잘 됩니다. 그런데, 실제 적용에서는, 매수가 된 후에, 매수청산이 제대로 되지도 않았는데 매수진입 신호가 작동해서, 결국 매수가 여러 개 쌓여 버리는 현상이 나타납니다. ('시스템 트레이딩 설정'에서 '피라미딩 설정'은 '허용안함'으로 설정했습니다) 짐작컨대, 신호는 그냥 신호대로 만들어 져서 (즉 실제 제 계좌의 포지션 상태와는 무관하게), 신호가 매수진입-매수청산, 매수진입-매수청산 이렇게 발생하면, 실제로는 매수청산이 이루어지지 않아서 매수가 쌓여 있는데도 또 매수주문이 작동해서 또 하나의 매수가 쌓여 버리는 것으로 생각이 됩니다. 질문 1: 이런 현상이 나타나지 않도록, 즉 실제 자동거래에서도, 매수진입-매수청산, 매수진입-매수청산 순서대로만 이루어 지도록 하려면 어떻게 해야 하는지요? 단순히 신호상으로만이 아니라, 실제 계좌의 포지션 상황에 따라, 실제 계좌에서 MarketPosition == 1이라면, 새로운 매수진입이 발생하지 않도록 되어야 할 텐데, 실제 계좌 포지션이 파악된 후 매수 진입 여부가 이루어지도록 하는 방법이 있으면 좋겠습니다. (아마 YesSpot을 쓰면 뭔가 될 것 같기도 합니다만, 아직 제가 YesSpot 공부를 하지 못했습니다. YesSpot을 써서 해결할 방법이 있다면, 그 것을 YesSpot 수식 예를 들어서 알려 주시면, 열심히 공부하도록 하겠습니다) 질문 2-1: 현재에는, 실제로 매매가 이루어 진 것을 차트 상에 표현하는 방법을 알지 못하겠습니다만, 이 것이 가능한지요? 가령 '실제로' (즉 단순히 신호 상으로만이 아닌) buy 한 계약이 이루어 지면, B1, 이런 식으로 표기될 수 있도록 하는 방법이 있는지요? 질문 2-2: 아니면 앞으로 혹시 그런 기능을 추가해 주실 수 있으실까요? 질문 3: 그리고 조금 전 실제로 소스를 작동시켜 보니까, 신호가 Buy-ExitLong-Buy-ExitLong (이까지 돌리고 중단시켰음. Buy는 안 된 상태에서 ExitLong만 연거푸 작동해서...) 이렇게 나왔는데, Buy는 두 번 다 접수만 되고 실행이 안 됐는데, ExitLong이 작동해 버려서 결국 매도가 두 개나 쌓여 버렸습니다 (숏포 2계약이 됨). 제가 생각하기로, ExitLong은, 당연히 Buy가 된 후, 즉 롱포지션이 있어야, 그 걸 청산하는 기능이어야 할 텐데, 이렇게 아무 포지션도 없는 상태에서 ExitLong이 작동해서 Sell의 기능을 해 버릴 수가 있는지요? 지금 조금 전에 나타난 실제상황으로 봐서 그런 거 같은데, 이 것은 문제가 있다고 봅니다. Sell이 아닌 ExitLong이 Sell로 작동해서 무포를 숏포로 만든다는 것은, 무포-롱포-무포-롱포-무포... 를 기본 방향으로 하는, 전체 소스 구상의 결과를 거꾸로 만들어 버리는 심각한 문제라고 생각되는데, ExitLong은 롱포가 있을 때에만 작동하도록 확실히 하는 방법은 무엇일까요? (이 ExitLong에는 MarketPosition == 1이라는 조건까지 명시적으로 넣어 뒀는데도, 무포에서 매도를 해 버리는군요) 혹시 제가 뭔가 잘 못 알고 있는 것이 있는지, 또는 이런 문제의 원인과 해결책은 무엇인지 알려 주시면 대단히 감사하겠습니다. 감사합니다.
시스템
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2013-07-12 16:04:50

안녕하세요 예스스탁입니다. 1. 예스랭귀지로 작성되는 시스템은 단지 사용자가 지정한 조건에 따라 매수와 매도주문을 반복하게 됩니다. 함수중 MarketPosition과 같은 포지션 관련된 함수들은 모두 차트상(신호상)의 포지션입니다. 잔고포지션이 아닙니다. 잔고의 포지션을 인식해서 주문을 내실 수는 없습니다. 2 진입신호 후 잔고여부를 따지게 되면 더이상 다음 진입도 없고 시뮬레이션은 더욱 되지가 않습니다. 전체 시스템의 체계를 근본적으로 변경해야 하는 부분이라 현재로서는 해당 기능제공에 대해 논의된 부분이 없습니다. 3. 1번 답변 참고하시기 바랍니다. MarketPosition은 차트상 포지션입니다. 4. 시스템은 신호발생까지만 담당하고 신호가 발생하면 시스템 트레이딩 설정창에서 지정하신 가격으로 주문이 나가게 됩니다. 시스템을 자동주문시에 시스템 트레이딩 설정창의 매매가격에서 진입과 청산가격을 현재가 +-5호가나 시장가와 같이 체결율이 높은 주문가격으로 지정하셔야 신호와 잔고 포지션의 괴리를 줄이실수 있습니다. 5. 예스스팟에서 차트신호발생하면 주문나가게 작성하시면 됩니다. 차트에서 청산신호가 발생하면 잔고확인후 잔고에 해당 포지션이 있으면 주문하고 없으면 주문내지 않습니다. 예스스팟은 저희쪽에서 수식은 기본테두리 정도만 작성해 드립니다. 자바스크립트 공부하셔서 수정해 사용하시기 바랍니다. //스크립트 객체화면 설정 //계좌객체 : 객체명 Account1 --> 속성에서 계좌지정 //차트객체 : 객체명 Chart1 --> 속성에서 차트아이디 지정하고 차트에도 동일아이디 부여 //종목객체 : 객체명 MarketData1 --> 속성에서 차트 종목과 같은 종목으로 지정 function Main_OnStart() { Main.MessageList("스팟시작"); } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Main.MessageList("Buy신호발생"); Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(3), 0); } if (Signal.signalKind == 2) { Main.MessageList("ExitLong신호발생"); Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); Main.MessageList("잔고셋팅") //지정한 종목의 잔고수량이 0이상이고 매수포지션이면 //매수3호가로 매도주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(3), 0); } if (Signal.signalKind == 3) { Main.MessageList("Sell신호 발생"); Account1.OrderSell(Main.GetOrderCode(sItemCode), 1, MarketData1.Bid(3), 0); } if (Signal.signalKind == 4) { Main.MessageList("ExitShort신호발생"); Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //지정한 종목의 잔고수량이 0이상이고 매도포지션이면 //매도3호가로 매수주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) Account1.OrderBuy(Main.GetOrderCode(sItemCode), 1, MarketData1.Ask(3), 0); } } 즐거운 하루되세요 > 즐겁게 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 안녕하세요. 시스템식을 만들었는데, 옵션 매수만 하도록 했고, 그래서 일단 buy로 엔트리가 된 상태에서만 바로 그 진입명을 써서, ExitLong이 되도록 만들었습니다. 즉 (MarketPosition == 0일 때) 매수진입하고 (그러면 이제 MarketPosition == 1이 됨), 그 게 매수청산(ExitLong) 되어야 (즉 이제 MarketPositoin == 0 이 되면), 다시 매수진입이 되도록 만들었는데, 그냥 시험적용에서는 제대로 매수진입-매수청산, 매수진입-매수청산, ... 순서대로 아주 잘 됩니다. 그런데, 실제 적용에서는, 매수가 된 후에, 매수청산이 제대로 되지도 않았는데 매수진입 신호가 작동해서, 결국 매수가 여러 개 쌓여 버리는 현상이 나타납니다. ('시스템 트레이딩 설정'에서 '피라미딩 설정'은 '허용안함'으로 설정했습니다) 짐작컨대, 신호는 그냥 신호대로 만들어 져서 (즉 실제 제 계좌의 포지션 상태와는 무관하게), 신호가 매수진입-매수청산, 매수진입-매수청산 이렇게 발생하면, 실제로는 매수청산이 이루어지지 않아서 매수가 쌓여 있는데도 또 매수주문이 작동해서 또 하나의 매수가 쌓여 버리는 것으로 생각이 됩니다. 질문 1: 이런 현상이 나타나지 않도록, 즉 실제 자동거래에서도, 매수진입-매수청산, 매수진입-매수청산 순서대로만 이루어 지도록 하려면 어떻게 해야 하는지요? 단순히 신호상으로만이 아니라, 실제 계좌의 포지션 상황에 따라, 실제 계좌에서 MarketPosition == 1이라면, 새로운 매수진입이 발생하지 않도록 되어야 할 텐데, 실제 계좌 포지션이 파악된 후 매수 진입 여부가 이루어지도록 하는 방법이 있으면 좋겠습니다. (아마 YesSpot을 쓰면 뭔가 될 것 같기도 합니다만, 아직 제가 YesSpot 공부를 하지 못했습니다. YesSpot을 써서 해결할 방법이 있다면, 그 것을 YesSpot 수식 예를 들어서 알려 주시면, 열심히 공부하도록 하겠습니다) 질문 2-1: 현재에는, 실제로 매매가 이루어 진 것을 차트 상에 표현하는 방법을 알지 못하겠습니다만, 이 것이 가능한지요? 가령 '실제로' (즉 단순히 신호 상으로만이 아닌) buy 한 계약이 이루어 지면, B1, 이런 식으로 표기될 수 있도록 하는 방법이 있는지요? 질문 2-2: 아니면 앞으로 혹시 그런 기능을 추가해 주실 수 있으실까요? 질문 3: 그리고 조금 전 실제로 소스를 작동시켜 보니까, 신호가 Buy-ExitLong-Buy-ExitLong (이까지 돌리고 중단시켰음. Buy는 안 된 상태에서 ExitLong만 연거푸 작동해서...) 이렇게 나왔는데, Buy는 두 번 다 접수만 되고 실행이 안 됐는데, ExitLong이 작동해 버려서 결국 매도가 두 개나 쌓여 버렸습니다 (숏포 2계약이 됨). 제가 생각하기로, ExitLong은, 당연히 Buy가 된 후, 즉 롱포지션이 있어야, 그 걸 청산하는 기능이어야 할 텐데, 이렇게 아무 포지션도 없는 상태에서 ExitLong이 작동해서 Sell의 기능을 해 버릴 수가 있는지요? 지금 조금 전에 나타난 실제상황으로 봐서 그런 거 같은데, 이 것은 문제가 있다고 봅니다. Sell이 아닌 ExitLong이 Sell로 작동해서 무포를 숏포로 만든다는 것은, 무포-롱포-무포-롱포-무포... 를 기본 방향으로 하는, 전체 소스 구상의 결과를 거꾸로 만들어 버리는 심각한 문제라고 생각되는데, ExitLong은 롱포가 있을 때에만 작동하도록 확실히 하는 방법은 무엇일까요? (이 ExitLong에는 MarketPosition == 1이라는 조건까지 명시적으로 넣어 뒀는데도, 무포에서 매도를 해 버리는군요) 혹시 제가 뭔가 잘 못 알고 있는 것이 있는지, 또는 이런 문제의 원인과 해결책은 무엇인지 알려 주시면 대단히 감사하겠습니다. 감사합니다.
프로필 이미지

즐겁게

2013-07-12 16:42:46

긴 질문 글에 이처럼 친절하시고 상세한 답변 달아 주셔서 너무나 감사합니다! 특히나 상세한 예스스팟 소스코드를 짜 주셔서 너무나 큰 도움이 되겠습니다. 아직은 예스스팟을 대략적으로만 공부해서 상세한 코딩을 위해서는 공부를 많이 더 해야 하지만, 일단 개괄적으로 보기만 해도 바로 제가 원하던 소스입니다. 역시 해결책은 계좌 관련 함수들이 있는 예스스팟에 있다는 결론이 맞는 것 같습니다. 즉시 올려 주신 예스스팟 소스를 시작점으로 해서 열공해서 멋진 소스를 완성해 보도록 하겠습니다. 다시 한 번, 대단히 감사합니다!