커뮤니티

강제청산 로직 부탁드립니다

프로필 이미지
기똥찬
2019-05-07 14:50:35
3257
글번호 224851
답변완료
수고가 많으십니다. 저는 유진예스트레이더를 사용하는데, 손매매 비중도 높습니다. 투자대상은 해외선물입니다. 제가 원하는 수식은 예스트레이더를 이용한 자동매매든지, 손매매든지 상관없이 내 계좌의 당일 손실(청산손실+미청산손실)이 -1000달러에 도달하면 미체결주문은 모두 취소되고 현재 보유중인 계약은 시장가로 강제청산되도록 하고 싶습니다. 위의 "당일 손실"에서 "당일"이라함은 한국시간기준으로 당일이 아니라 해외거래소 거래일기준의 당일입니다. 예를들어 저는 크루드오일을 주로 매매하는데 썸머타임이 적용된 현재기준으로 07:00~익일06:00 까지의 손실을 계산합니다. 수고에 감사드리며, 로직 부탁드립니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-05-16 09:35:34

안녕하세요 예스스탁입니다. 스팟에서 이용할수 있는 값은 계좌에서 제공하는 값으로 특정거래소의 시간 기준으로 손익을 알수는 없습니다. 계좌객체에 예수금항목 중에 전일예탁자산과 예탁자산총평가액이 제공되고 있습니다. 선물사의 영업일 변경 기준으로 제공되는 값입니다. 영업일 변경이 오전 6시 정도인것로 알고 있습니다. 식을 2개 작성해 드립니다. 1번식은 예수금항목의 전일예탁자산과 현재 예탁자산총평가액의 차이로 주문을 발생하고 2번식은 스팟의 시작시점의 예탁자산총평가액과 현재와의 차이로 주문을 발생하므로 거래시작에 맞춰 적용해 주시면 됩니다. 스팟은 과거값을 알지 못함므로 인터넷단절등으로 재접속하시게 되면 2번식은 그 시점에서 다시 시작시점이 되므로 사용에 유의하셔야 합니다. 모두 스크립트 객체화면에 계좌객체만 Account1로 셋팅하시면 됩니다. 영문 업데이트가 게시판금칙어입니다. 수식내 해당 단어가 들어간 부분에 Up*date로 중간에 *가 추가되어 있으로 삭제하시기 바랍니다. 1번 var req; function Main_OnStart() { //5초 타이머 Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { //계좌 재조회 Account1.Refresh(); } function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (Account1.number == sAccntNum && lUp*dateID == 30000) { //현재 예탁자산총평가액과 전일예탁자산의 차이 var PL = Account1.GetBalanceETCinfo(10)-Account1.GetBalanceETCinfo(0); //-1000달러 이상 손실 if (PL <= -1000) { //타이머종료 Main.KillTimer(1); //미체결 모두 취수 var num1 = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num1; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유종목 시장가로 모두 청산 var num2 = Account1.GetTheNumberOfBalances(); for (var i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0) { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1) if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1) } } } } } 2 var req,V1; function Main_OnStart() { //5초 타이머 Main.SetTimer(1, 5000); V1 = Account1.GetBalanceETCinfo(10); } function Main_OnTimer(nEventID) { //계좌 재조회 Account1.Refresh(); } function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (Account1.number == sAccntNum && lUp*dateID == 30000) { //현재 예탁자산총평가액과 전일예탁자산의 차이 var PL = Account1.GetBalanceETCinfo(10)-V1; //-1000달러 이상 손실 if (PL <= -1000) { //타이머종료 Main.KillTimer(1); //미체결 모두 취수 var num1 = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num1; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유종목 시장가로 모두 청산 var num2 = Account1.GetTheNumberOfBalances(); for (var i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0) { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1) if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1) } } } } } 즐거운 하루되세요 > 기똥찬 님이 쓴 글입니다. > 제목 : 강제청산 로직 부탁드립니다 > 수고가 많으십니다. 저는 유진예스트레이더를 사용하는데, 손매매 비중도 높습니다. 투자대상은 해외선물입니다. 제가 원하는 수식은 예스트레이더를 이용한 자동매매든지, 손매매든지 상관없이 내 계좌의 당일 손실(청산손실+미청산손실)이 -1000달러에 도달하면 미체결주문은 모두 취소되고 현재 보유중인 계약은 시장가로 강제청산되도록 하고 싶습니다. 위의 "당일 손실"에서 "당일"이라함은 한국시간기준으로 당일이 아니라 해외거래소 거래일기준의 당일입니다. 예를들어 저는 크루드오일을 주로 매매하는데 썸머타임이 적용된 현재기준으로 07:00~익일06:00 까지의 손실을 계산합니다. 수고에 감사드리며, 로직 부탁드립니다.