커뮤니티

예스스팟 Q&A

답변완료

호가 오류

아래의 스팟스크립트를 실행하면 옵션종목에 대해서는 청산이 정상 수행되는데, 선물의 경우 첨부 그림과 같이 호가가 이상한 숫자로 되어 있어 에러처리됩니다. 어떻게 해야 할까요? function Main_OnStart() { Main.MessageLog("즉시 청산 시작"); num = A1.GetTheNumberOfBalances(); Main.MessageLog("밸런스"+num); for (var i = 0; i < num; i++) { A1.SetBalanceIndex(i); if (A1.Balance.code == F1.code && A1.Balance.count!=0) { if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code, A1.Balance.count, F1.Ask(2), 0); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code, A1.Balance.count, F1.Bid(2), 0); } if (A1.Balance.code != F1.code && A1.Balance.count!=0) { if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code, A1.Balance.count, Op1.GetAsk(A1.Balance.code, 5), 0); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code, A1.Balance.count, Op1.GetBid(A1.Balance.code, 5), 0); } } }
프로필 이미지
좋은선물
2015-07-30
1863
글번호 223597
답변완료

포지션 전환 방법

트레이더에서는 현재 포지션이 있는 상태에서 반대 포지션에 대한 주문을 낼 경우, 한 번의 주문으로 포지션 전환이 가능합니다. 예) 매수 포지션 --> 매도 주문 --> 매도 포지션 매수 포지션 --> 먀수 청산 --> 포지션 제로 그런데 스팟을 이용할 경우, 예) 매수 포지션 --> 매도주문(OrderSell) --> 포지션 제로 매수 포지션 --> 매수청산(OrderSell) --> 포지션 제로 트레이더와 같은 결과를 원한다면 예) 매수 포지션 --> 매도주문(OrderSell, 2계약) --> 매도 포지션 매수 포지션 --> 매수청산(OrderSell, 1계약) --> 포지션 제로 이렇게 해야 맞는것인지 확인 부탁드립니다.
프로필 이미지
좋은선물
2015-07-29
1892
글번호 223596
답변완료

프로그램 검토요청

수고하십니다. 선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요.. 진입신호는 나오나 청산신호가 나오지 않습니다. 초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^ 확인좀 부탁드리겠습니다. ------------------------------------------------------------------------ var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 10000);//1번타이머 10초 } } } if (T == 1 && Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 10000);//2번타이머 10초 } } } if (T == -1 && Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); //PutOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); T = 0; } } } function Main_OnTimer(nEventID) { //1번 타이머 동작 T가 1일이면(Buy신호 이후) if (nEventID == 1 && T == 1) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수 "); //1번 타이머종료 Main.KillTimer(1); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); } } } //2번 타이머 동작하고 T가 -1이면(Sell신호 이후) if (nEventID == 2 && T == -1) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도 "); //2번 타이머종료 Main.KillTimer(2); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); } } } }
프로필 이미지
왼손잡이
2015-07-28
1831
글번호 223592
답변완료

프로그램 검토요청

수고하십니다. 선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요.. 진입신호는 나오나 청산신호가 나오지 않습니다. 초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^ 확인좀 부탁드리겠습니다. ------------------------------------------------------------------------ var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 10000);//1번타이머 10초 } } } if (T == 1 && Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 10000);//2번타이머 10초 } } } if (T == -1 && Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); //PutOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); T = 0; } } } function Main_OnTimer(nEventID) { //1번 타이머 동작 T가 1일이면(Buy신호 이후) if (nEventID == 1 && T == 1) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수 "); //1번 타이머종료 Main.KillTimer(1); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); } } } //2번 타이머 동작하고 T가 -1이면(Sell신호 이후) if (nEventID == 2 && T == -1) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도 "); //2번 타이머종료 Main.KillTimer(2); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); } } } }
프로필 이미지
왼손잡이
2015-07-28
1873
글번호 223591

왼손잡이 님에 의해서 삭제되었습니다.

프로필 이미지
왼손잡이
2015-07-28
0
글번호 223590

왼손잡이 님에 의해서 삭제되었습니다.

프로필 이미지
왼손잡이
2015-07-27
0
글번호 223587
답변완료

문의 드립니다.

수고하십니다. 서로 다른 컴퓨터에서 발생한 신호를 동일하게 유지 하고 싶습니다. 1. 갑 이라는 컴퓨터 A계좌(account 1 or account2) 에서 발생한 신호 또는 잔고 확인후 2. 을 이라는 컴퓨터 B계좌(account 3) 에서 동일하게 잔고 또는 동일하게 매매하고 싶습니다. 답변을 찾아보니 이래저래 찾아보니 ..아래와 같이 구현하면 가능할런지요? 그럼 좋은 답변 부탁드리겠습니다. ============================================================================================ //각 주문을 매수/매도 5호가로 주문내게 수정했습니다. //Account1 (시스템 거래) //Account2 (손매매) //Account3 (앞의 두계좌 연동), //아래는 1분 단위로 Account1계좌를 원장과 동기화하는 내용입니다 function Main_OnStart() { Main.SetTimer(1, 100) } function Main_OnTimer(nEventID) { if(nEventID == 1) { //Main.MessageList("타이머 발생"); Main.RefreshAccount(Account1.number); } } //체결이벤트 발생 function Main_OnNotifyFill(NotifyFill) { // Account1이나 Account2에서 체결이 발생하면 if (NotifyFill.accountNum == Account1.number || NotifyFill.accountNum == Account2.number) { //매도 체결일 경우 if (NotifyFill.orderKind == 1) { //선물인 경우 if (NotifyFill.code == Main.GetOrderCode(MarketData1.code)) { //체결수량만큼 매수5호가로 매도주문 Account3.OrderSell(NotifyFill.code, NotifyFill.fillCount,MarketData1.Bid(5),0); } //선물이 아닐경우(선옵계좌이므로 이경우 옵션종목) if (NotifyFill.code != Main.GetOrderCode(MarketData1.code)) { //체겨수량만큼 매수5호가로 매도주문 Account3.OrderSell(NotifyFill.code, NotifyFill.fillCount,Option.GetBidByCode(NotifyFill.code,5),1); } } //매수 체결일 경우 if (NotifyFill.orderKind == 1) { //선물인 경우 if (NotifyFill.code == Main.GetOrderCode(MarketData1.code)) { //체결수량만큼 매도5호가로 매수주문 Account3.OrderBuy(NotifyFill.code, NotifyFill.fillCount,MarketData1.Ask(5),0); } //선물이 아닐경우(선옵계좌이므로 이경우 옵션종목) if (NotifyFill.code != Main.GetOrderCode(MarketData1.code)) { //체결수량만큼 매도5호가로 매수주문 Account3.OrderBuy(NotifyFill.code, NotifyFill.fillCount,Option.GetAskByCode(NotifyFill.code,5),1); } } } }
프로필 이미지
왼손잡이
2015-07-27
1807
글번호 223586
답변완료

특정 이벤트가 발생하면 계좌잔고의 모든 종목을 청산하는 수식

제가 손으로 선물 옵션 합성포지션을 구축합니다. 그래서 예를 들자면 잔고에 선물 매수 1계약 , 콜245 매수 1계약 , 콜247 매도 1계약 , 풋245 매수 1계약 , 풋242 매도 1계약을 가지고 있습니다. 이경우 14시 40분이 되면 잔고의 모든 계약을 자동으로 청산하는 예스스팟 식을 알고 싶습니다. 부탁드립니다. 더운데 건강 조심하시고, 오늘도 좋은 하루 되세요. ^^
프로필 이미지
자오지환웅
2015-07-26
1782
글번호 223583
답변완료

동시호가 문의

예제에 보면 1510분 등의 특정 시간으로 동시호가 시장가 청산 주문이 있는데요... 그것 말고 HTS에 보면 동시호가에 진입했다고 알려주는데 그렇다면 동시혹가 진입했음을 신호로 받고 그 뒤로 청산 주문을 내게 할 수 있나요? 수능날이나 특정한 날에 장이 1515분이 아닌 다른 시간에 끝나기 때문에 특정 시간 청산이 아닌 이것을 해결할 수 있는 다른 방법을 알고 싶습니다.
프로필 이미지
궁금궁금123
2015-07-25
1712
글번호 223582
답변완료

글자색 지정

YT , yes spot 프로그램을 만들어 주셔서 감사히 잘 쓰고 있습니다. 의문이 해결이 안되어 문의 드립니다. 1. Main.MessageLog("Put 가격 : "); 이 부분을 빨강 , 핑크 , 파랑 , 하늘색 으로 각각 표시하고 싶습니다. SetColorText(col, row, color) 를 사용해서 할 수 있나요? 예시 부탁 드립니다. 2, 글자크기나 두께도 설정 할 수 있나요? 요청 드립니다 ~~~~
프로필 이미지
피니트
2015-07-23
1662
글번호 223578