커뮤니티

문의드립니다

프로필 이미지
재령
2013-10-09 19:52:49
1103
글번호 222617
답변완료
항상 수고 많으십니다 일전에 올려주신 668번 수식을 유용하게 사용하고 있습니다 668번 수식을 다음 조건에 맞게 변형하고 싶습니다. 데이트레이딩 기법을 스팟에 적용하고 싶은데요. 기본로직은 다음과 같습니다. 1. 파워종목검색으로 종목검색 후에 종목객체 생성 2. 해당 종목의 현재 잔고가 0이고 실시간 시세를 감지하고 있다가 전일 종가 대비 -2% 하락 시에 조건만족가격(현재가)으로 정해진 매수금액 만큼 매수주문 3. 한번 매수주문이 나간 종목은 제차 매수진입 금지 4. 매수 진입한 종목이 장중 10%이상 이득이 발생하면 현재가로 청산주문 5. 오늘 매수한 종목객체를 저장하고 있다가 매수 체결된 종목을 장 종반 동시호가에 시장가 청산주문. 감사합니다
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2013-10-18 11:22:04

안녕하세요 예스스탁입니다. 수식에 주석이 붙여 드립니다. 참고하셔서 충분히 검토 후에 수정/보완해 사용하시기 바랍니다. 수식내 게시판 금칙어가 있습니다. 영문 업데이트가 Up*date로 작성이 되어 있습니다 *를 제거하심 됩니다. //종목검색으로 찾은 종목의 코드를 저장할 변수 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") } //종목검색 완료되어 리스트(검색된 종목코드) 수신 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) { if (nEventID == 1) { Main.KillTimer(1); Main.ReqMarketData(NoBalanceList[RcvCount]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { //날짜시간 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //모든 종목 생성 후 14시 55분 전까지 감시(시간조정하시기 바랍니다) if (Start == true && lUp*dateID == 20001 && HHMMSS < 145500 )//*제거 { 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("잔고없음") } } } } //15시 6분(동시호가)에 (시간 조절하시기 바랍니다) if (Start == true && lUp*dateID == 20001 && HHMMSS >= 150600 ) //*제거 { //해당 계좌의 전체 미체결주문 취소 var UFnum = Account1.GetTheNumberOfUnfills() for (var x = 0; x < UFnum; x++) { Account1.SetUnfillIndex(X); Account1.OrderCancel(Account1.Unfill.orderNum); } //주문종목에 대해 잔고에 있으면 모두 시장가로 매도 for (var y = 1; y <= RcvCount; y++) { Account1.SetBalanceItem(TodayOrderList[y],0); if (Account1.Balance.count > 0) { Main.MessageList(Account1.Balance.code,"동시호가-시장가 매도"); ccount1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } } } 즐거운 하루되세요 > 재령 님이 쓴 글입니다. > 제목 : 문의드립니다 > 항상 수고 많으십니다 일전에 올려주신 668번 수식을 유용하게 사용하고 있습니다 668번 수식을 다음 조건에 맞게 변형하고 싶습니다. 데이트레이딩 기법을 스팟에 적용하고 싶은데요. 기본로직은 다음과 같습니다. 1. 파워종목검색으로 종목검색 후에 종목객체 생성 2. 해당 종목의 현재 잔고가 0이고 실시간 시세를 감지하고 있다가 전일 종가 대비 -2% 하락 시에 조건만족가격(현재가)으로 정해진 매수금액 만큼 매수주문 3. 한번 매수주문이 나간 종목은 제차 매수진입 금지 4. 매수 진입한 종목이 장중 10%이상 이득이 발생하면 현재가로 청산주문 5. 오늘 매수한 종목객체를 저장하고 있다가 매수 체결된 종목을 장 종반 동시호가에 시장가 청산주문. 감사합니다