커뮤니티

수식 부탁드립니다.

프로필 이미지
치치야
2026-01-15 22:26:30
91
글번호 229848
답변완료

당신의 노고에 항상 고맙고 감사합니다.

글번호-229512 수식어

당일에는 분할 매수가 되는데

다음날에도 계속 분할매수후

익절 수식어 부탁 드립니다.

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-01-29 15:22:37

안녕하세요 예스스탁입니다. 1 스팟은 실행 중심이고 변수에 값저장이 휘발성입니다. 실행중인 수식을 적용해제하거나 프로그램을 재접속하면 이전 동작시 변수에 저장된 값들은 모두 사라지게 됩니다. 그러므로 내용상 다음 실행시 필요한 값들이 있다면 특정파일에 기록해서 이후에 가져다 사용하게 수식을 작성하셔야 합니다. SetUserValue, GetUserValue 위 함수들은 내부파일에 값을 쓰고 가져오는 함수이고 값을 받아 저장하는 파일은 프로그램 설치경로의 spot폴더에 UserValue.yuv파일입니다. UserValue.yuv 파일이 삭제되거나 하면 전략을 이어갈 수 없으므로 사용에 주의하셔야 하고 하나의 파일에 지정한 이름으로 값이 저장되므로 다른 스팟수식에서 같은 이름으로 값을 중복 저장되게 하시면 됩니다. 아래수식에서는 XB,XP,XS라는 이름으로 값을 저장합니다. 2 스팟 수식답변은 식작성의 가이드입니다. 저희가 완전 검증해서 답변드리지 않으므로 아래식 참고하셔서 테스트등 수정보완해서 사용하시기 바랍니다. 3 var timer5 = 2; // 2초 var 매수금 = 500000; var OrderList = []; var MKList = []; var B = [], P = [], S = []; var SC,req; //스팟 시작 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; } if (OrderList.length == 0) { Main.SetTimer(1, timer5*1000); Main.SetTimer(3, 1000); MKList =[]; SC = 1; } else { SC = 0; req = 0; Main.ReqMarketData(OrderList[req]); } } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS > 090300 && HHMMSS < 151500) { Main.ReqPowerSearch("test"); } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } if (nEventID == 3 && MKList.length > 0) { for (var i = 0; i < MKList.length; i++) { //Main.MessageList(MKList[i].code,B[i],MKList[i].current,P[i]); if (B[i] == 1 && MKList[i].current <= P[i]*0.97 || B[i] == 2 && MKList[i].current <= P[i]*0.95 || B[i] == 3 && MKList[i].current <= P[i]*0.92) { Account1.OrderBuy(MKList[i].code,Math.floor(매수금/MKList[i].Ask(5)),MKList[i].Ask(5),0); B[i] = B[i]+1; Main.MessageList(MKList[i].code,"추가매수:",B[i],"차"); } if (B[i] >= 1) { Account1.SetBalance(MKList[i].code, 0); if (Account1.Balance.count > 0 && MKList[i].current >= Account1.Balance.avgUnitCost*1.03) { B[i] == -1; Account1.OrderSell(MKList[i].code,Account1.Balance.count,MKList[i].Bid(5),0); Main.MessageList(MKList[i].code,"익절:"); } } } } } function Main_OnRcvItemList(altemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = altemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (altemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(altemList[a])) { OrderList.push(altemList[a]); } } } } Main.MessageList("종목객체요청할종목수수:",OrderList.length); if (OrderList.length == 0) { Main.SetTimer(1, timer5*1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvMarketData(MarketData) { if (SC == 0) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); Main.MessageList("SC",MarketData.code); req = req+1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 15000); } } else { SC = 1; Main.SetTimer(1, timer5*1000); } } } else { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); if (!IsStockInAccount(MarketData.code)) { //Account1.OrderBuy(MarketData.code,1,0,2); // Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(5)),MarketData.Ask(5),0); Main.MessageList(MarketData.code," 주식을 매수합니다.",MarketData.current); B.push(1); S.push(MarketData.code); P.push(MarketData.current); } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); B.push(0); P.push(0); } req = req+1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 15000); } } else { Main.SetTimer(1, timer5*1000); } } } } function IsStockInAccount(stockCode) { var numberOfBalances = Account1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { Account1.SetBalance(i); if (stockCode == Account1.Balance.code) { return true; } } return false; } //스팟 종료시 function Main_OnClose() { //익절된 종목은 제외하고 종목코드,가격,분할주문 횟수를 내부파일에 저장 if (B.length > 0) { 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)); } 즐거운 하루되세요