커뮤니티

문의 드립니다.

프로필 이미지
싱구
2026-03-24 21:38:01
340
글번호 231238
답변완료

파워검색식에서 검색된 종목들중에서

피보나치 되돌림 수치에 의해서 매수를 수행할려고 하는데요.

조건은 다음과 같습니다.


1. 검색된 종목의 당일 저가와 고가를 기준으로 고가대비 0.38에서 1차 매수 0.5에서 2차 매수를 한뒤 반등하여

3% 이익이 발생하면 이익 실현하고 싶습니다.

2. 1차 0.38에서 매수후 2차 0.5까지 안내려오고 반등하여 3% 수익이 나면 그때도 이익 실현하구요.

3. 1차 2차 까지 매수가 된 후에 0.62 지점까지 하락하면 손절주문 시키구요.

4. 1차든 2차까지든 이익 실현 or 손절한 종목은 당일 재주문은 안합니다.


예스스팟 코딩 도움 부탁드립니다.

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-04-09 17:01:55

안녕하세요 예스스탁입니다. 아래 식 내용 참고하시기 바랍니다. 기본 흐름은 아래와 같습니다. 10초 간격으로 종목을 검색하고 검색된 종목들의 종목객체를 생성해서 1초간격으로 감시하면서 38%매수, 50%매수, 익절등을 감시해서 주문을 집행합니다. 스크립트 객체화면 설정 계좌객체 추가 --> 속성에서 객체명 Account1, 주문낼 계좌번호 지정 var SearchName = "사용자검색조건명"; //종목검색 후 매수종목을 저장할 배열변수 var BuyList = []; //종목별 종목객체 저장할 배열변수 var MK = []; //종목별 매수진행상활 저장할 배열변수 var B = []; var req; var 최대매수종목수 = 20; var 매수금 = 1000000; //스팟 시작 function Main_OnStart() { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //종목검색을 실행할 타이머, 아이디는 1번, 간격 10초 Main.SetTimer(1, 10000); //검색된 종목 시세체크를 실행할 타이머, 아이디는 99번, 간격 1초 Main.SetTimer(1, 1000); Main.MessageList(HHMMSS,"|Start"); } //타이머 동작 function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번 타이머 동작하고 9시~15시 사이이면 if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS <= 150000) { //타이머 종료 Main.KillTimer(1); //지정한 이름의 사용자조건검색을 실행 Main.ReqPowerSearch(SearchName); Main.MessageList(HHMMSS,"|종목검색 실행"); } if (nEventID == 2) { Main.KillTimer(2); //재요청 Main.ReqMarketData(BuyList[req]); } //1초 간격으로 피보나치 도달 체크 if (nEventID == 99 && MK.length > 0) { for (var i = 0; i < MK.length; i++) { //검색 후 고가-당일폭38% 위에 시세가 형성되면 해당종목 B변수는 1로 변경 if (B[i] == 0 && MK[i].current > MK[i].high - (MK[i].high - MK[i].low)*0.38) { B[i] = 1; } //38% 위에 있다가 하락해서 38% 이하인 현재가 발생하면 1차매수하고 해당종목 B변수는 2로 변경 if (B[i] == 1 && MK[i].current <= MK[i].high - (MK[i].high - MK[i].low)*0.38) { B[i] = 2; var OP = MK[i].Ask(3); var VV = Math.floor(매수금/OP); Account1.OrderBuy(MK[i].code,VV, OP,0); Main.MessageList(HHMMSS,"|1차매수",MK[i].code,VV, OP); } //1차 매수 후 50% 이하인 현재가 발생하면 2차매수하고 해당종목 B변수는 3으로 변경 if (B[i] == 2 && MK[i].current <= MK[i].high - (MK[i].high - MK[i].low)*0.50) { B[i] = 3; var OP = MK[i].Ask(3); var VV = Math.floor(매수금/OP); Account1.OrderBuy(MK[i].code,VV, OP,0); Main.MessageList(HHMMSS,"|2차매수",MK[i].code,VV, OP); } //B값이 2이상(1차 매수이상 진행)일때 if (B[i] >= 2) { Account1.SetBalance(MK[i].code, 0); //3% 수익발생하면 매도하고 해당종목 B변수는 -1로 변경 if (Account1.Balance.count > 0 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.03) { B[i] = -1; var OP = MK[i].Bid(3); Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,OP,0); Main.MessageList(HHMMSS,"|익절매도",Account1.Balance.code,Account1.Balance.count,OP); } } } } } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount, aValues) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); Main.MessageList("검색된종목수",nCount); //검색된 종목이 한종목 이상 if (nCount >= 1) { //종목객체 요청리스트를 초기화 BuyList = []; //처음 종목이 검색이 될 떄는 if (MK.length == 0) { //검색된 종목 중 잔고에 없는 종목으로 최대20개만 BuyList에 저장 for (var a = 0; a < nCount; a++) { Account1.SetBalance(aItemList[a],0); if (Account1.Balance.count == 0 && BuyList.length < 최대매수종목수) { BuyList.push(aItemList[a]); } } } else { //1종목이상 검색이 된 이후에는 if (MK.length < 최대매수종목수) { for (var a = 0; a < nCount; a++) { //종목객체가 만들어진 종목은 제외 var Add = true; for (var b = 0; b < MK.length; b++) { if (aItemList[a] == MK[b].code) { Add = false; } } //계좌 잔고에 보유중인 종목 제외 Account1.SetBalance(aItemList[a],0); if (Account1.Balance.count > 0) Add = false; //종목객체로 만들어 지지 않았고 잔고에 없는 종목으로 선정하여 //요청리스트에 저장 if (Add == true) { BuyList.push(aItemList[a]); } } } } Main.MessageList(HHMMSS,"|주문할 종목수:",BuyList.length); //요청할 종목이 없고 if (BuyList.length == 0) { //종목객체가 최대매수종목수 미만이면 1번 타이머 재셋팅 if (MK.length < 최대매수종목수) { //1번 타이머, 60초 Main.SetTimer(1, 6000); } else { //종목객체가 최대매수종목수와 같으면 메세지 출력하고 종료 Main.MessageList(HHMMSS,"|최대종목수 도달 검색종료"); } } else //요청할 종목이 있으면 { //요청리스트의 첫종목 부터 종목객체 요청(배열이므로 종목코드가 0번방 부터 존재) req = 0; Main.MessageList(HHMMSS,req,"종목객체요청",BuyList[req]); Main.ReqMarketData(BuyList[req]); } } } //요청한 종목객체가 만들어 지면 function Main_OnRcvMarketData(MarketData) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //직전 요청한 종목이 맞는지 확인후에 if (MarketData.code == BuyList[req]) { Main.MessageList(HHMMSS,req,"종목객체생성",MarketData.code); //종목객체는 MK에 추가하고 MK.push(MarketData); B.push(0); //요청횟수 1증가 req = req+1; //요청횟수가 요청할 종목갯수보다 작으면 다음 종목객체 요청 if (req < BuyList.length) { Main.MessageList(HHMMSS,req,"종목객체요청",BuyList[req]); var XX = Main.ReqMarketData(BuyList[req]); //종목객체 생성제한 if (XX == -1) { //2번 타이머 15초 Main.SetTimer(2,15000); } } else //요청횟수가 요청할 종목갯수에 도달했으면 종목객체 생성 종료 { Main.MessageList(HHMMSS,req,"종목객체생성끝"); //최대매수종목수에 도달하지 않았으면 종목검색을 위해 타이머 재셋팅 if (MK.length < 최대매수종목수) { Main.SetTimer(1,6000); } else { //최대매수종목수를 채웠으면 검색 종료 Main.MessageList(HHMMSS,"|최대종목수 도달 검색종료"); } } } } 즐거운 하루되세요