커뮤니티

문의드립니다.

프로필 이미지
음양조파
2015-03-06 10:51:08
1348
글번호 223337
답변완료
안녕하세요? 질문답변으로 얻은 수식을 나름대로 변형해서 아래 식을 짠 후 모의투자로 돌려보았습 니다. 가격이 오르면 따라 사고 내리면 따라 파는 식입니다. 그런데, 스팟을 시작하고나서 기준가보다 크거나 작을 때 한 번은 진입을 하는데 그 후에는 가격이 오르거나 내려도 추가진입이 이루어지지 않네요. 종목객체, 계좌객체, 다 제대로 설정했는지도 확인했고 일간데이터도 사용으로 설정했는 지 확인했는데 거기에는 문제가 없었습니다. 아무래도 제가 만든 코딩 자체에 문법적 잘못이 있거나 구조적으로 무언가를 잘못한 것 아 닐까 하는 생각이 드는데, 아래 코딩이 제가 원하는 것을 구현하고자 할 때에 코딩 자체의 문제는 없는 것인지 좀 봐 주시면 감사하겠습니다. 저 혼자 추측하기에는, ckey의 사용법에 문제가 있나 하는 생각을 합니다. 가격이 변화하 는 순간 수도 없는 진입을 방지하려고, 일단 스팟 시작하면 ckey를 1로 놓았다가 가격변화 를 포착하면 일단 ckey를 0으로 놓고 매수도를 수행한 후에 체결통보를 받으면 ckey를 다 시 1로 다시 놓는 것으로 식을 짠다고 아래 식을 짰는데, 이게 뭔가 코딩 방법 상 잘못된 것은 아닌지 궁금합니다. 가르쳐 주시면 감사하겠습니다. //진입컨트롤키 var ckey; //기준가 var sprice; //저장값 var lfprice; //스팟이 시작하면 function Main_OnStart() { //컨트롤키를 진입가능하도록 ckey=1; //저장된 값이 있는지 확인하여 저장값 변수에 대입 lfprice = parseFloat(Main.GetUserValue('lfprice')); //만일 저장값 변수가 양이면 그 값을 기준가로 하고 메시지출력 if (lfprice > 0) { sprice = lfprice; Main.MessageLog("저장된 최종체결가를 기준가로 : " + lfprice); } //그렇지 않다면 어제의 종가를 기준가 변수에 대입하고 메시지출력 else { sprice = MarketData1.GetPrevClose(1); Main.MessageLog("어제의 종가를 기준가로 : " + MarketData1.GetPrevClose(1)); } } //시장정보가 갱신되고 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//금칙어땜에 별표,실제 실행시에는 별표 지움 //갱신된 시장정보가 해당종목의 시세정보이며 시가가 접수 즉 장이 시작된 경우 { if (sItemCode == MarketData1.code && lUp*dateID == 20001 && MarketData1.open > 0)//실제 실행시에는 별표 지워야 { //계좌를 체크하여 잔고를 세팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //키가 진입허용상태이고 현재가가 기준가보다 일정가격 이상 커지면 if (ckey==1 && MarketData1.current >= sprice+0.05 ) { //일단 무한진입 방지 ckey=0; //매도잔고가 있으면 2개매수 if (Account1.Balance.count >= 1 && Account1.Balance.position == 1 ) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 2, MarketData1.current, 0); } //매도잔고가 없으면 1개매수 if (Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } //진입허용 상태이고 현재가가 기준가보다 일정가격 이상 작아지면 if (ckey==1 && MarketData1.current <= sprice-0.05) { //일단 무한진입 방지 ckey=0; //매수잔고가 있으면 2개 매도 if (Account1.Balance.count >= 1 && Account1.Balance.position == 2 ) {Account1.OrderSell(Main.GetOrderCode(MarketData1.code),2, MarketData1.current, 0); } //매수잔고가 없으면 1개매도 if (Account1.Balance.count == 0) {Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } } } //체결통보를 받으면 기준가에 체결가를 저장하고 컨트롤키를 진입가능케하면서 계좌를 새롭게 갱신 function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.code == MarketData1.code) { sprice = NotifyFill.fillPrice; ckey=1; Account1.Refresh(); } } //스팟 종료시에는 기준가를 저장값으로 저장하고 미체결주문 취소 function Main_OnClose() { Main.SetUserValue('lfprice', sprice); var numOfUnfills = Account1.GetTheNumberOfUnfills(); for(var i = 0 ; i < numOfUnfills ; i++) { var unfill = Account1.SetUnfillIndex(i); Account1.OrderCancel(unfill.orderNum); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-03-19 10:25:14

안녕하세요 예스스탁입니다. 전화로 답변드린 부분과 같이 포지션 인식 및 ckey가 0으로 초기화 되는 부분을 수정했습니다. 추가로 현재 테스트에서는 문제가 없지만 해당 스팟에서 발생한 주문에 대한 체결에서만 값이 저장되고 초기화가 되어야 하므로 현재 스팟에서 발생한 주문에 대한 체결만 인식하도록 내용을 추가했습니다. var ckey; //진입컨트롤키 var sprice; //기준가 var lfprice; //저장값 //스팟이 시작하면 function Main_OnStart() { ckey=1; lfprice = parseFloat(Main.GetUserValue("lfprice")); if (lfprice > 0) { sprice = lfprice; Main.MessageList("저장된 최종체결가를 기준가로 : ",lfprice); } else { sprice = MarketData1.GetPrevClose(1); Main.MessageList("어제의 종가를 기준가로 : ",MarketData1.GetPrevClose(1)); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//금칙어땜에 별표,실제 실행시에는 별표 지움 { if (sItemCode == MarketData1.code && lUp*dateID == 20001 && MarketData1.open > 0)//실제 실행시에는 별표 지워야 { //계좌를 체크하여 잔고를 세팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //키가 진입허용상태이고 현재가가 기준가보다 일정가격 이상 커지면 if (ckey==1 && MarketData1.current >= sprice+0.05 ) { Main.MessageList("가격상승"); //매도잔고가 있으면 2개매수 if (Account1.Balance.count >= 1 && Account1.Balance.position == 1 ) { ckey=0; ID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 2, MarketData1.current, 0); } //잔고가 없거나 매수포지션일때 1개매수 if (Account1.Balance.count == 0 || Account1.Balance.position == 2) { ckey=0; ID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } if (ckey==1 && MarketData1.current <= sprice-0.05) { Main.MessageList("가격하락") //매수잔고가 있으면 2개 매도 if (Account1.Balance.count >= 1 && Account1.Balance.position == 2 ) { ckey=0; ID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),2, MarketData1.current, 0); } //잔고가 없거나 매도포지션일때 1개매도 if (Account1.Balance.count == 0 || Account1.Balance.position == 1) { ckey=0; ID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } } } //현재 스팟에서 발생한 주문에 대해 주문응답 수신시 주문번호 저장 function Main_OnOrderResponse(OrderResponse) { if (ID == OrderResponse.orderID && OrderResponse.isNormal == true) { Main.MessageList("주문응답"); Number = OrderResponse.orderNum; } } //체결통보를 받으면 기준가에 체결가를 저장하고 컨트롤키를 진입가능케하면서 계좌를 새롭게 갱신 function Main_OnNotifyFill(NotifyFill) { Main.MessageList("체결"); if (NotifyFill.code == MarketData1.code && Number == NotifyFill.orderNum) { sprice = NotifyFill.fillPrice; ckey=1; Main.MessageList("저장확인",sprice,ckey); Account1.Refresh(); } } //스팟 종료시에는 기준가를 저장값으로 저장하고 미체결주문 취소 function Main_OnClose() { Main.SetUserValue("lfprice", sprice); var numOfUnfills = Account1.GetTheNumberOfUnfills(); for(var i = 0 ; i < numOfUnfills ; i++) { var unfill = Account1.SetUnfillIndex(i); Account1.OrderCancel(unfill.orderNum); } } 즐거운 하루되세요 > 음양조파 님이 쓴 글입니다. > 제목 : 문의드립니다. > 안녕하세요? 질문답변으로 얻은 수식을 나름대로 변형해서 아래 식을 짠 후 모의투자로 돌려보았습 니다. 가격이 오르면 따라 사고 내리면 따라 파는 식입니다. 그런데, 스팟을 시작하고나서 기준가보다 크거나 작을 때 한 번은 진입을 하는데 그 후에는 가격이 오르거나 내려도 추가진입이 이루어지지 않네요. 종목객체, 계좌객체, 다 제대로 설정했는지도 확인했고 일간데이터도 사용으로 설정했는 지 확인했는데 거기에는 문제가 없었습니다. 아무래도 제가 만든 코딩 자체에 문법적 잘못이 있거나 구조적으로 무언가를 잘못한 것 아 닐까 하는 생각이 드는데, 아래 코딩이 제가 원하는 것을 구현하고자 할 때에 코딩 자체의 문제는 없는 것인지 좀 봐 주시면 감사하겠습니다. 저 혼자 추측하기에는, ckey의 사용법에 문제가 있나 하는 생각을 합니다. 가격이 변화하 는 순간 수도 없는 진입을 방지하려고, 일단 스팟 시작하면 ckey를 1로 놓았다가 가격변화 를 포착하면 일단 ckey를 0으로 놓고 매수도를 수행한 후에 체결통보를 받으면 ckey를 다 시 1로 다시 놓는 것으로 식을 짠다고 아래 식을 짰는데, 이게 뭔가 코딩 방법 상 잘못된 것은 아닌지 궁금합니다. 가르쳐 주시면 감사하겠습니다. //진입컨트롤키 var ckey; //기준가 var sprice; //저장값 var lfprice; //스팟이 시작하면 function Main_OnStart() { //컨트롤키를 진입가능하도록 ckey=1; //저장된 값이 있는지 확인하여 저장값 변수에 대입 lfprice = parseFloat(Main.GetUserValue('lfprice')); //만일 저장값 변수가 양이면 그 값을 기준가로 하고 메시지출력 if (lfprice > 0) { sprice = lfprice; Main.MessageLog("저장된 최종체결가를 기준가로 : " + lfprice); } //그렇지 않다면 어제의 종가를 기준가 변수에 대입하고 메시지출력 else { sprice = MarketData1.GetPrevClose(1); Main.MessageLog("어제의 종가를 기준가로 : " + MarketData1.GetPrevClose(1)); } } //시장정보가 갱신되고 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//금칙어땜에 별표,실제 실행시에는 별표 지움 //갱신된 시장정보가 해당종목의 시세정보이며 시가가 접수 즉 장이 시작된 경우 { if (sItemCode == MarketData1.code && lUp*dateID == 20001 && MarketData1.open > 0)//실제 실행시에는 별표 지워야 { //계좌를 체크하여 잔고를 세팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //키가 진입허용상태이고 현재가가 기준가보다 일정가격 이상 커지면 if (ckey==1 && MarketData1.current >= sprice+0.05 ) { //일단 무한진입 방지 ckey=0; //매도잔고가 있으면 2개매수 if (Account1.Balance.count >= 1 && Account1.Balance.position == 1 ) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 2, MarketData1.current, 0); } //매도잔고가 없으면 1개매수 if (Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } //진입허용 상태이고 현재가가 기준가보다 일정가격 이상 작아지면 if (ckey==1 && MarketData1.current <= sprice-0.05) { //일단 무한진입 방지 ckey=0; //매수잔고가 있으면 2개 매도 if (Account1.Balance.count >= 1 && Account1.Balance.position == 2 ) {Account1.OrderSell(Main.GetOrderCode(MarketData1.code),2, MarketData1.current, 0); } //매수잔고가 없으면 1개매도 if (Account1.Balance.count == 0) {Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0); } } } } //체결통보를 받으면 기준가에 체결가를 저장하고 컨트롤키를 진입가능케하면서 계좌를 새롭게 갱신 function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.code == MarketData1.code) { sprice = NotifyFill.fillPrice; ckey=1; Account1.Refresh(); } } //스팟 종료시에는 기준가를 저장값으로 저장하고 미체결주문 취소 function Main_OnClose() { Main.SetUserValue('lfprice', sprice); var numOfUnfills = Account1.GetTheNumberOfUnfills(); for(var i = 0 ; i < numOfUnfills ; i++) { var unfill = Account1.SetUnfillIndex(i); Account1.OrderCancel(unfill.orderNum); } }