커뮤니티

한정된 예수금으로 두 개의 전략 운용 수식

프로필 이미지
songjs12
2020-04-28 20:10:28
3168
글번호 225212
답변완료
안녕하세요 국내/해외선물 거래를 하고 있습니다. (하이투자, 한국투자) 예스랭기지 챠트신호를 자동매매를 하고 있는데 잔고가 연동이 안되어서 예스스팟으로 전략을 구성하려고 합니다. 예수금이 적은 경우 두개의 예스랭귀지 챠트 전략을 수행하던 중 한 개 전략이 포지션을 가지게 되면 다른 전략은 진입을 하지 못하다가 포지션이 청산되면 예수금 부족 오류로 진입하지 못하였던 청산신호가 발생되게 됩니다. 따라서 한 개의 전략을 시행하고 있을 때 다른 전략에서 처음부터 진입신호가 발생하지 않도록 하는 수식이 필요합니다. 즉, 잔고를 실시간으로 확인하여 잔고가 없는 경우만 두 번 째 전략의 진입신호가 발생하는 것입니다. 잔고가 있는 경우 진입신호가 발생되지 않도록 하는 수식을 부탁드립니다. 아울러 당일 예탁자산평가액의 최소값(금액 혹은 퍼센트)과 최대값을 설정하여 그 이하 혹은 이상이 되면 모두 청산하고 더이상 거래를 하지 않는 수식도 부탁드립니다. 그리고 간혹 밤에 해외선물챠트상에서 신호는 발생되었으나 실제 진입 주문이 나가지 않고 있다가 나중에 청산주문만 나가서 꼬이는 경우가 있었습니다. 이런 경우를 대비해서 청산주문만 단독으로 나가지 못하도록 하는 수식도 필요합니다. (만약 이게 가능하다면 앞서 요청드린 두개의 전략을 동시에 돌리는 문제도 해결될 듯 합니다.) 요약하여 요청드리면, 1. 잔고를 확인하여 다른 잔고(동일 및 다른 종목)가 없는 경우만 진입주문이 나간다 2. 당일 예탁자산평가액의 최소/최대를 설정하여 모두 청산 및 거래 중지한다. 3. 진입주문없는 청산주문만 나가는 경우가 없게 한다. 감사합니다. 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-06-02 18:42:44

안녕하세요 예스스탁입니다. 아래 가이드 수식을 참고하셔서 수정보완해 사용하시기 바랍니다. 종목은 2개종목으로 작성해 드립니다. 국내와 해외가 주문함수의 4번째 매개변수(주문유형지정)가 다릅니다. Account1.OrderBuy(종목코드,수량,주문가격,주문유형); 국내는 0이 지정가, 1이 시장가 해외는 2가 지정가, 1이 시장가입니다. 예탁자산평가금도 증권사별로 모두 다릅니다. 국내(하이투자증권, NH투자증권)은 100번, 한국투자증권 해외는 4번입니다. 1번은 국내용, 2번은 해외용입니다. 스크립트 객체설정은 아래와 같습니다.(이부분은 국내/해외 동일합니다.) 차트객체 추가 --> 속성에서 객체명은 Chart1, 신호적용된 차트와 동일아이디 부여 차트객체 추가 --> 속성에서 객체명은 Chart2, 신호적용된 차트와 동일아이디 부여 종목객체 추가 --> 속성에서 객체명은 MarketData1, 차트1과 동일종목으로 지정 종목객체 추가 --> 속성에서 객체명은 MarketData2, 차트2과 동일종목으로 지정 계좌객체 추가 --> 속성에서 객체명은 Account1, 주문낼 계좌번호 지정 1 var 예탁자산최대 = 20000000; var 예탁자산최소 = 10000000; var BID,SID,BNum,SNum; function Main_OnStart() { Main.MessageList("Start"); //5초 타이머 (예탁자산 체크용) Main.SetTimer(1, 5000); Trade = true; } //차트1에서 신호 발생 function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매수 if (Anum == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Signal.count,MarketData1.Ask(3),0); } } //매수청산신호 발생 if (Signal.signalKind == 2 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매수포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(3),0) } } //매도진입신호 발생 if (Signal.signalKind == 3 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매도 if (Anum == 0) { SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData1.Bid(3),0); } } if (Signal.signalKind == 4 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매도포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(1),0) } } } //차트2에서 신호 발생 function Chart2_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매수 if (Anum == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Signal.count,MarketData2.Ask(3),0); } } //매수청산신호 발생 if (Signal.signalKind == 2 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매수포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData2.Bid(3),0) } } //매도진입신호 발생 if (Signal.signalKind == 3 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매도 if (Anum == 0) { SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData2.Bid(3),0); } } if (Signal.signalKind == 4 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매도포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData2.Ask(1),0) } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { var mm = Account1.GetBalanceETCinfo(100); if (mm >= 예탁자산최대 || mm <= 예탁자산최소) { //타이머 종료 Main.KillTimer(1); //Trade변수를 false로 만들어 이후 차트 신호 발생시 주문을 하지 않게 함 Trade = false; //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //계좌 보유 종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목 모두 시장가 청산 if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0, 1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0, 1); } } } } } } 2 var 예탁자산최대 = 20000000; var 예탁자산최소 = 10000000; var BID,SID,BNum,SNum; function Main_OnStart() { Main.MessageList("Start"); //5초 타이머 (예탁자산 체크용) Main.SetTimer(1, 5000); Trade = true; } //차트1에서 신호 발생 function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매수 if (Anum == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Signal.count,MarketData1.Ask(3),2); } } //매수청산신호 발생 if (Signal.signalKind == 2 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매수포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(3),2) } } //매도진입신호 발생 if (Signal.signalKind == 3 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매도 if (Anum == 0) { SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),Signal.count,MarketData1.Bid(3),2); } } if (Signal.signalKind == 4 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매도포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(1),2) } } } //차트2에서 신호 발생 function Chart2_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매수 if (Anum == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Signal.count,MarketData2.Ask(3),2); } } //매수청산신호 발생 if (Signal.signalKind == 2 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매수포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData2.Bid(3),2) } } //매도진입신호 발생 if (Signal.signalKind == 3 && Trade == true) { //계좌 보유종목수 var Anum = Account1.GetTheNumberOfBalances(); //보유 종목이 없을떄만 매도 if (Anum == 0) { SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),Signal.count,MarketData2.Bid(3),2); } } if (Signal.signalKind == 4 && Trade == true) { //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //해당종목 잔고 셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); //보유한 매도포지션 수량만큼만 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData2.Ask(1),2) } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { var mm = Account1.GetBalanceETCinfo(4); if (mm >= 예탁자산최대 || mm <= 예탁자산최소) { //타이머 종료 Main.KillTimer(1); //Trade변수를 false로 만들어 이후 차트 신호 발생시 주문을 하지 않게 함 Trade = false; //계좌 미체결 모두 취소 var Unum = Account1.GetTheNumberOfUnfills(); if (Unum > 0) { for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } } } //계좌 보유 종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목 모두 시장가 청산 if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0, 1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0, 1); } } } } } } 즐거운 하루되세요 > songjs12 님이 쓴 글입니다. > 제목 : 한정된 예수금으로 두 개의 전략 운용 수식 > 안녕하세요 국내/해외선물 거래를 하고 있습니다. (하이투자, 한국투자) 예스랭기지 챠트신호를 자동매매를 하고 있는데 잔고가 연동이 안되어서 예스스팟으로 전략을 구성하려고 합니다. 예수금이 적은 경우 두개의 예스랭귀지 챠트 전략을 수행하던 중 한 개 전략이 포지션을 가지게 되면 다른 전략은 진입을 하지 못하다가 포지션이 청산되면 예수금 부족 오류로 진입하지 못하였던 청산신호가 발생되게 됩니다. 따라서 한 개의 전략을 시행하고 있을 때 다른 전략에서 처음부터 진입신호가 발생하지 않도록 하는 수식이 필요합니다. 즉, 잔고를 실시간으로 확인하여 잔고가 없는 경우만 두 번 째 전략의 진입신호가 발생하는 것입니다. 잔고가 있는 경우 진입신호가 발생되지 않도록 하는 수식을 부탁드립니다. 아울러 당일 예탁자산평가액의 최소값(금액 혹은 퍼센트)과 최대값을 설정하여 그 이하 혹은 이상이 되면 모두 청산하고 더이상 거래를 하지 않는 수식도 부탁드립니다. 그리고 간혹 밤에 해외선물챠트상에서 신호는 발생되었으나 실제 진입 주문이 나가지 않고 있다가 나중에 청산주문만 나가서 꼬이는 경우가 있었습니다. 이런 경우를 대비해서 청산주문만 단독으로 나가지 못하도록 하는 수식도 필요합니다. (만약 이게 가능하다면 앞서 요청드린 두개의 전략을 동시에 돌리는 문제도 해결될 듯 합니다.) 요약하여 요청드리면, 1. 잔고를 확인하여 다른 잔고(동일 및 다른 종목)가 없는 경우만 진입주문이 나간다 2. 당일 예탁자산평가액의 최소/최대를 설정하여 모두 청산 및 거래 중지한다. 3. 진입주문없는 청산주문만 나가는 경우가 없게 한다. 감사합니다. 감사합니다.