답변완료
옵션미체결 주문의 가격정정 방법
아래 게시글에 적어 놓았던 내용인데,, 좀 자세히 적어 놓아야 하겟네요..위 내용은 예를들어 호가창에 수동으로 진입시 아무 위치(0.76)에나 마우스로 매수진입을 하면, 내가 진입기준에 맞춰 정해진 위치로 자동 이동하는 로직을 만들려고 하고 있습니다. 캡쳐 사진에서 보듯이 1번 : 수식에 의해 정해진 기준값을 잡은 위치는 0.87 가격(ex. 5이평선, 20이평선, 볼밴하단, 시가, 저가, 피봇,..등등등)입니다. (지금 현제가는 0.87보다 위쪽에 형성되어 있읍니다), 그리고 아무 위치(현재는 0.76)에나 마우스로 1 계약 매수 진입을 하면, 내가 기준에 맟춰 매수 진입 위치로 정해준 지정가 0.87로 자동 이동하게 만드는게 목적임. 마우스로 호가주문창의 0.76에 1계약 매수를 하면, 예스스팟의 2번 에서 보듯이 주문번호 #1823이 뜨고 0.76 가격의 위치를 잡았다고 표시가 됨. 이제 이 0.76의 가격이 0.87 자리로 이동을 해야 하는데, 여러가지 방법을 사용해 보았읍니다. 현제 캡쳐 사진에서 보는1. [취소 -> 재주문]의 로직은 MyOrderID = Account1.OrderReplacePrice(MyOrderNum, usePrice); 를 사용한 결과이고.. ==> 테스트 결과 위치를 잡고 ,어느 자리로 이동시켜야 한다는 것 까지는 잡아내는데, 가격의 위치 이동은 시키지 못함. 2.가격 위치 정정은 MyOrderID = Account1.OrderReplace(MyOrderNum, usePrice,qty); ==> 이 명령어로 사용해 보았는데,, 역시 주문번호 생성되고, 현제 위치도 잡아내고, 이동시킬 가격대도 잡았는데,, 실제로 이동은 되지 않았음. (그림1참조)3. ordercancel 도 실제로 일어나지 않고 있음. ** 에러메세지.사유코드는 모두 0 으로 반환됨.(그림2 참조)
답변완료
다시 한번 검토해 주시면 감사하겠습니다.
항상 노고에 머리숙여 감사드립니다.1.글번호 229848수식어 사용해 보니 다음날 분할매수가 되지 않터라구요그래서 챗-지피티을 이용해서 작성해 보았습니다.이게 맞는지 점검해 주시면 감사하겠습니다.위 조건이 힘드시면 2번 해당하는 수식어 부탁 드립니다.2.당일 분할매수 조건 말고, 보유종목들중에 마이너스 조건에 맞게 다음날 부터 분할매수 할수 있게끔 부탁드립니다.var timer5 = 2; var 매수금 = 500000; var OrderList = [];var MKList = [];var B = [], P = [], S = []; var SC = 1, req = 0;function Main_OnStart(){// 이전 상태 복원if (Main.GetUserValue("XB") != ""){B = JSON.parse(Main.GetUserValue("XB"));P = JSON.parse(Main.GetUserValue("XP"));S = JSON.parse(Main.GetUserValue("XS"));}OrderList = [];if (S.length > 0){OrderList = S;SC = 0;req = 0;Main.ReqMarketData(OrderList[req]);}else{SC = 1;Main.SetTimer(1, timer5 * 1000);Main.SetTimer(3, 1000);}}function Main_OnTimer(nEventID){var d = new Date();var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();if (nEventID == 1 && HHMMSS > 090300 && HHMMSS < 151500){Main.ReqPowerSearch("test");}if (nEventID == 3 && MKList.length > 0){for (var i = 0; i < MKList.length; i++){Account1.SetBalance(MKList[i].code, 0);if (Account1.Balance.count <= 0) continue;var avg = Account1.Balance.avgUnitCost;var cur = MKList[i].current;if ((B[i] == 1 && cur <= avg * 0.97) ||(B[i] == 2 && cur <= avg * 0.95) ||(B[i] == 3 && cur <= avg * 0.92)){Account1.OrderBuy(MKList[i].code,Math.floor(매수금 / MKList[i].Ask(5)),MKList[i].Ask(5),0);B[i]++;Main.MessageList(MKList[i].code, "분할매수", B[i] - 1, "차");continue;}if (B[i] >= 4 && cur <= avg * 0.85){B[i] = -1;Account1.OrderSell(MKList[i].code,Account1.Balance.count,MKList[i].Bid(5),0);Main.MessageList(MKList[i].code, "분할완료 후 손절 -15%");continue;}if (cur >= avg * 1.11){B[i] = -1;Account1.OrderSell(MKList[i].code,Account1.Balance.count,MKList[i].Bid(5),0);Main.MessageList(MKList[i].code, "익절");continue;}}}}function Main_OnRcvItemList(altemList, nCount){Main.KillTimer(1);OrderList = [];for (var i = 0; i < nCount; i++){if (!IsStockInAccount(altemList[i]) && S.indexOf(altemList[i]) == -1){OrderList.push(altemList[i]);}}if (OrderList.length > 0){req = 0;Main.ReqMarketData(OrderList[req]);}else{Main.SetTimer(1, timer5 * 1000);}}/* ======================= MarketData 수신======================= */function Main_OnRcvMarketData(MarketData){for (var i = 0; i < MKList.length; i++){if (MKList[i].code == MarketData.code){MKList[i] = MarketData;return;}}MKList.push(MarketData);if (!IsStockInAccount(MarketData.code)){Account1.OrderBuy(MarketData.code,Math.floor(매수금 / MarketData.Ask(5)),MarketData.Ask(5),0);B.push(1);P.push(MarketData.current);S.push(MarketData.code);Main.MessageList(MarketData.code, "신규매수");}}function IsStockInAccount(stockCode){var cnt = Account1.GetTheNumberOfBalances();for (var i = 0; i < cnt; i++){Account1.SetBalance(i);if (Account1.Balance.code == stockCode)return true;}return false;}/* ======================= 스팟 종료======================= */function Main_OnClose(){for (var i = B.length - 1; i >= 0; i--){if (B[i] == -1){B.splice(i, 1);P.splice(i, 1);S.splice(i, 1);}}Main.SetUserValue("XB", JSON.stringify(B));Main.SetUserValue("XP", JSON.stringify(P));Main.SetUserValue("XS", JSON.stringify(S));}