커뮤니티

730번 수식 다시 문의드립니다

프로필 이미지
재령
2013-12-10 16:08:31
997
글번호 222734
답변완료
항상 수고 많으십니다.장문의 수식을 짜주셔서 감사합니다. 730번 수식 다시 문의 드립니다. 진입과 장중 10%이득 청산은 문제 없이 제대로 돌아갑니다. 1. 우선 14시50분에서 3시까지 장종반 동시호가에 청산주문이 나가지 않습니다. 시간을 145100으로 바꿔서 장종반 동시호가에 시장가로 청산되도록 하였는데 여러 가지 방법을 써 보았지만(예상체결업데이트를 써보았지만 실폐함 20003번), 동시호가 주문이 나가지 않습니다. 우선 2시 51분에 동시호가에 주문이 나갈 수 있도록 수정 부탁 드립니다. 2. 아 그리고 제가 뭔가 착각하고 글을 수정했는데요.. 지금 주문은 Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,12); 하고 시간외종가 주문을 내고 있느데 15시 01분에 주문이 나가도록 설정해 놓은 상태인데 15시 10분에 주문이 나가는데 15시 10분이전에 주문이 나가게 할려면 어떻게 해야하나요.. 그리고, TodayOrderList는 종목의 가격을 불러 오는 변수값인듯 하여, SetBalanceItem에 에 종목코드를 리턴하는 변수값을 새로 만들었습니다. 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2013-12-17 19:07:34

안녕하세요 예스스탁입니다. 1. 식을 수정했습니다. 동시호가 청산의 이벤트 위치를 타이머로 변경했습니다. 3번타이머로 5초 간격으로 시간을 체킹하고 14시51분 이후면 타이머 중지되고 계좌의 모든 미체결 취소하고 매도 주문 집행합니다. 현재 수식이 종목검색 후에 잔고에 없는 종목에 대해서만 종목객체를 모두 생성하고 시세를 감시해서 전일종가 2% 하락하는 시세 발생하면 매수주문하고 평균단가 대비 10% 이상 상승하면 매도하면서 해당 종목의 종목객체는 삭제를 합니다. 14시 51분에 미체결 물량 모두 취소하고 현재 삭제되지 않고 남아 있는 종목객체의 종목에 대해 잔고를 셋팅하고 수량이 0 이상이면 시장가로 모두 청산하는 흐름입니다. 내용 참고하시기 바랍니다. //종목검색으로 찾은 종목의 코드를 저장할 변수 var List; //종목검색으로 찾은 종목수를 저장할 변수 var ListCnt; //종목검색 후 잔고에 없는 종목을 리스트할 배열변수 var NoBalanceList = new Array(200); //종목검색 후 생성 순서에 따라 종목객체를 저장할 배열변수 var ItemObject = new Array(200); //주문이 실행되면 ItemObject와 동일방번호에 특정값을 입력해 주문했음을 인지할 배열변수 var TodayOrderList = new Array(200); //종목객체 생성 순서를 기록할 변수 var RcvCount = 0; //종목객체의 생성이 모두 완료됨을 인지할 변수 초기값 false var Start = false; //스팟 첫 실행시 function Main_OnStart() { //배열을 초기값을 0으로 지정 for (var a = 0; a <= 199; a++) { TodayOrderList[a] = 0; } //생성횟수 카운트 0 RcvCount = 0; //잔고에 없는 종목수 카운트 0 NoBalanceCnt = 0; // 파워종목검색의 사용자검색조건 검색 요청 Main.ReqPowerSearch("test Search"); Main.SetTimer(3, 5000);//3번 타이머 } //종목검색 완료되어 리스트(검색된 종목코드) 수신 function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목코드를 저장 List = aItemList; //검색된 종목수 저장 ListCnt = nCount; //종목코드 디버깅창에 출력 Main.MessageList("종목검색리스트 수신 - 전체종목수",ListCnt); NoBalanceCnt = 0; for (var i = 0; i < ListCnt; i++) { Account1.SetBalanceItem(List[i],0); if (Account1.Balance.count == 0) { Main.MessageList(i,"번째 종목 - 잔고 없음 : ",Account1.Balance.code); NoBalanceList[NoBalanceCnt] = List[i]; NoBalanceCnt = NoBalanceCnt+1; } if (Account1.Balance.count > 0) { Main.MessageList(i,"번째 종목-잔고 있음!!!!!! :",Account1.Balance.code); } } Main.MessageList("감시대상종목수 : ",NoBalanceCnt); //검색된 종목에 대해 종목객체 요청 Main.ReqMarketData(NoBalanceList[0]); } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { //생성 횟수 카운트 RcvCount = RcvCount+1; //종목객체 저장 ItemObject[RcvCount] = MarketData; //생성횟수와 해당 종목의 코드와 현재가, 매매단위를 디버깅창에 출력 Main.MessageList("생성순번",RcvCount, "종목코드",ItemObject[RcvCount].code, "현재가",ItemObject[RcvCount].current, "주문수량단위",ItemObject[RcvCount].tradeUnit); if (RcvCount < NoBalanceCnt) { var TimeLimit = Main.ReqMarketData(NoBalanceList[RcvCount]); if (TimeLimit == -1) { Main.MessageList("제한시간 걸림 : ",Main.GetLimitedTime(0),"타이머 셋팅"); //15초 타이머 셋팅 Main.SetTimer(1,15000); } } //모든 종목 요청과 생성이 완료되면 Start는 true if (RcvCount == NoBalanceCnt) { Start = true; Main.MessageList("모든 감시종목 생성완료 - 리스트 확인"); for (var j = 1; j <= RcvCount; j++) { Main.MessageList(j,"-",ItemObject[j].code,ItemObject[j].current); } Main.MessageList("감시시작",Start); } } //타이머 동작 function Main_OnTimer(nEventID) { //날짜시간 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1) { Main.KillTimer(1); Main.ReqMarketData(NoBalanceList[RcvCount]); } //3번 타이머 작동 if (nEventID == 3) { //14시 51분(동시호가)에 if (HHMMSS > 145100 ) { Main.KillTimer(3);//3번 타이머 종료 //해당 계좌의 전체 미체결주문 취소 var UFnum = Account1.GetTheNumberOfUnfills() for (var x = 0; x < UFnum; x++) { Account1.SetUnfillIndex(X); Account1.OrderCancel(Account1.Unfill.orderNum); } //생성중인 종목객체에 대해 잔고를 셋팅해 수량이 0이상이면 매도주문 실행 for (var y = 1; y <= RcvCount; y++) { //종목객체의 현재가가 0 이상이면(청산되면 해당 종목객체가 삭제되므로 값이 없음) if (ItemObject[y].current > 0) { Account1.SetBalanceItem(ItemObject[y].code,0); //잔고에 수량이 0이상이면 if (Account1.Balance.count > 0) { //시장가로 매도 ccount1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); Main.MessageList(Account1.Balance.code,"동시호가-시장가 매도"); } } } } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { //날짜시간 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //모든 종목 생성 후 14시 50분 전까지 감시(시간조정하시기 바랍니다) if (Start == true && lUp*dateID == 20001 && HHMMSS < 145000 )//*제거 { for (var j = 1; j <= RcvCount; j++) { //수신된 종목의 현재가가 전일종가대비 2% 이하의 시세이고 오늘 주문되지 않은 종목이면 if (sItemCode == ItemObject[j].code && ItemObject[j].current <= ItemObject[j].prevClose *0.98 && TodayOrderList[j] == 0) { Main.MessageList("전일종가대비 2% 하락 - ","매수주문",ItemObject[j].name,ItemObject[j].code,ItemObject[j].current,ItemObject[j].prevClose); //매수주문 var Vol = 0; if (ItemObject[j].tradeUnit == 1) Vol = Math.floor(1000000/ItemObject[j].current ); else Vol = Math.floor((1000000/ItemObject[j].current )/ItemObject[j].tradeUnit)*10; Account1.OrderBuy(ItemObject[j].code, Vol, ItemObject[j].current, 0); //기초값이 0인 TodayOrderList의 동일 배열방에 주문했음을 인지하기 위해 현재가를 저장 TodayOrderList[j] = ItemObject[j].current; Main.MessageList("현재가 입력 :",TodayOrderList[OrderCnt]); } //시세 수신된 종목이 주문된 종목이면 if (sItemCode == ItemObject[j].code && TodayOrderList[j] > 0) { //해당 종목의 잔고를 셋팅하고 Account1.SetBalanceItem(ItemObject[j].code, 0) //잔고의 수량이 0이상이고(체결이 되었고) 현재가가 평균단가보다 10% 이상이면 if (Account1.Balance.count > 0 && ItemObject[j].current >= Account1.Balance.avgUnitCost*1.10 ) { //해당 종목 시장가로 매도주문 Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,ItemObject[j].current ,0); Main.MessageList(ItemObject[j].code,"종목 평균단가대비 10% 상승-현재가 매도"); //오늘 주문후 매도주문 되었으므로 ItemObject[j]종목객체는 삭제 Main.MessageList(ItemObject[j].code,"종목객체 삭제"); Main.RemoveMarketData(ItemObject[j]); } if (Account1.Balance.count == 0) { //주문된 종목인데 잔고가 0이면 체결이 안된 종목 Main.MessageList("잔고없음") } } } } } 2. 주문구분에서 12번은 시간외 종가입니다. 시간외종가는 3시부터 3시 10분까지는 주문만 받고, 3시 10분에 일괄적으로 거래가 체결되며, 3시 10분 - 3시 30분까지는 실시간으로 매도와 매수 주문에 따라 체결되게 됩니다. 제도상 되어 있는 부분이라 따로 그 이전에 주문을 나가게 할수는 없습니다. 즐거운 하루되세요 > 재령 님이 쓴 글입니다. > 제목 : 730번 수식 다시 문의드립니다 > 항상 수고 많으십니다.장문의 수식을 짜주셔서 감사합니다. 730번 수식 다시 문의 드립니다. 진입과 장중 10%이득 청산은 문제 없이 제대로 돌아갑니다. 1. 우선 14시50분에서 3시까지 장종반 동시호가에 청산주문이 나가지 않습니다. 시간을 145100으로 바꿔서 장종반 동시호가에 시장가로 청산되도록 하였는데 여러 가지 방법을 써 보았지만(예상체결업데이트를 써보았지만 실폐함 20003번), 동시호가 주문이 나가지 않습니다. 우선 2시 51분에 동시호가에 주문이 나갈 수 있도록 수정 부탁 드립니다. 2. 아 그리고 제가 뭔가 착각하고 글을 수정했는데요.. 지금 주문은 Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,12); 하고 시간외종가 주문을 내고 있느데 15시 01분에 주문이 나가도록 설정해 놓은 상태인데 15시 10분에 주문이 나가는데 15시 10분이전에 주문이 나가게 할려면 어떻게 해야하나요.. 그리고, TodayOrderList는 종목의 가격을 불러 오는 변수값인듯 하여, SetBalanceItem에 에 종목코드를 리턴하는 변수값을 새로 만들었습니다. 감사합니다.