커뮤니티

수식 작성 부탁드립니다.

프로필 이미지
adino30
2019-06-06 08:26:32
3242
글번호 224894
답변완료
매번 도움 감사드립니다. 하기와 같은 수식 작성 부탁드립니다. (종목검색 후 매매 수식은 게시판에도 많은데, 검색 이후 매수/매도 시, 미체결에 대한 정정 기능은 구현을 못하겠습니다ㅜㅜ) 1) 종목검색 하여 차트생성 2) 생성된 차트에 시스템 적용 3) 시스템 신호 발생시 매수/매도 4) 미체결 시 주문 정정 (매수미체결시: 매도1호가로 정정, 매도미체결: 매수1호가로 정정)
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-06-14 11:06:21

안녕하세요 예스스탁입니다. 수식및 주석 내용을 참고하셔서 사용하시는 전략의 구조에 맞게 수정보완해 사용하시기 바랍니다. 주문이 일정시간을 체크하기 위해서는 타이머를 이용해야 합니다 만들어진 차트객체를 배열에 저장하고 차트에서 신호가 발생하면 해당 차트객체의 배열방번호와 동일번호로 타이머 아이디 지정하여 동작하고 타이머가 동작하면 해당 종목의 종목객체를 생성해 가격을 가져와 정정합니다. var list; //차트객체 순서대로 저장할 변수 var ct = []; //스파시작 function Main_OnStart() { //종목검색 Main.ReqPowerSearch("aaa"); } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목을 전역변수에 저장 //list = aItemList; list = ["005930","000660","010950","090430","299660"]; //요청카운트 (첫종목 0으로 시작) req = 0; //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } //차트객체 생성완료 function Main_OnRcvChartEx(ChartEx) { //ct배열에 차트객체 저장 ct[req] = ChartEx; Main.MessageList(req,ct[req].GetCode(1)); //요청횟수 1 증가 req = req+1; //요청횟수가 검색된 종목수 보다 작으면 //다음종목 요청 if (req < list.length) { //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝 { Main.MessageList("차트객체 생성끝"); } } //차트에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { Main.MessageList("신호발생 : ",Signal.code,Signal.signalKind); for (var i = 0; i < ct.length; i++) { //전체 차트 객체 중 신호발생된 객체를 찾고 if (ChartEx.GetCode(1) == ct[i].GetCode(1)) { //매수신호이면 신호가격으로 10주 주문 if (Signal.signalKind == 1) { Main.MessageList("매수주문 : ",i,ct[i].GetCode(1)); Account1.OrderBuy(ct[i].GetCode(1), 10, Signal.price,0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } //매도신호이면 if (Signal.signalKind == 2) { //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결은 모두 취소 for (var z = 0; z < num; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == ChartEx.GetCode(1)) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고셋팅 Account1.SetBalance(ct[i].GetCode(1), 0); //잔고수량이 있으면 신호가격으로 전량청산 if (Account1.Balance.count > 0) { Main.MessageList("매도주문 : ",i,ct[i].GetCode(1)); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Signal.price, 0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } } break; } } } //타이머가 동작하면 function Main_OnTimer(nEventID) { Main.MessageList("타이머 : ",nEventID); //동작된 타이머 번호의 차트객체에서 종목코드 가져와 종목객체생성 Main.ReqMarketData(ct[nEventID].GetCode(1)); //1회 동작 후 타이머 종료 Main.KillTimer(nEventID); } //종목객체 생성되면 function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체생성 : ",MarketData.code); //종목객체 MD변수에 저장 var MD = MarketData; //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결을 찾아 for (var z = 0; z < num; i++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == MD.code) { //매수주문이면 if (Account1.Unfill.orderKind == 2) { //정정할 가격 매도1호가 var ReplacePrice = MD.Ask(1); //정정할 가격이 주문가겨과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } //매도주문이면 if (Account1.Unfill.orderKind == 1) { //정정할 가격 매수 1호가 var ReplacePrice = MD.Bid(1); //정정할 가격이 주문가격과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } } break; } //종목객체 삭제 Main.RemoveObject(MD); } 즐거운 하루되세요 > adino30 님이 쓴 글입니다. > 제목 : 수식 작성 부탁드립니다. > 매번 도움 감사드립니다. 하기와 같은 수식 작성 부탁드립니다. (종목검색 후 매매 수식은 게시판에도 많은데, 검색 이후 매수/매도 시, 미체결에 대한 정정 기능은 구현을 못하겠습니다ㅜㅜ) 1) 종목검색 하여 차트생성 2) 생성된 차트에 시스템 적용 3) 시스템 신호 발생시 매수/매도 4) 미체결 시 주문 정정 (매수미체결시: 매도1호가로 정정, 매도미체결: 매수1호가로 정정)