커뮤니티

자동 매도 문의드립니다.

프로필 이미지
아미고
2026-05-07 18:50:04
50
글번호 231941
답변완료

안녕하세요.

국내 주식 주문을 예스랭귀지와 예스스팟으로 자동 매수,매도를 할려고 합니다.(IM증권)

매수용 랭귀지와 스팟은 만들었는데

자동 매도 주문 작성을 문의하고자 합니다.

예스스팟으로 자동 매수를 하고(매수용 스팟은 작성하였습니다.)


[[[손절2%, 상승 3%에 익절 50%, 나머지는  추가 상승이나 익절한 상태에서 3% 하락시 전량 매도.]]]

입니다.

국내 주식 주문용 입니다.


감사합니다.



답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-05-13 14:36:54

안녕하세요 예스스탁입니다. 아래식 참고하셔서 사용하시기 바랍니다. var SearchName = "내검색"; var 검색주기 = 6; var MKList = []; //종목검색 후 종목객체 요청할 종목의 종목코드를 리스트할 배열변수 var MK = []; //종목객체를 저장할 배열변수 var B = []; //종목별 주문 흐름 저장 변수 var HH = []; //종목별 매수이후 최고가 저장 변수 var req; //종목객체 요청 횟수를 저장할 변수 var 최대매수종목수 = 20; //매수할 최대 종목수 var 매수금 = 1000000; //종목당 매수금 var 손절 = 2;//% var 익절 = 3; //% var 일절매도비율 = 50;//% var 익절후하락율 = 3; //% //스팟 시작 function Main_OnStart() { //종목검색타이머, 1번 타이머 60초 Main.SetTimer(1, 6000); //매수종목 손익체크 타이머, 99번 타이머 1초 Main.SetTimer(1, 검색주기*1000); } //타이머 동작 function Main_OnTimer(nEventID) { //자바스크립트 날짜시간 객체에서 값을 가져와 HHMMSS형식으로 시간 계산 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); } if (nEventID == 2) { Main.KillTimer(2); //재요청 Main.ReqMarketData(MKList[req]); } if (nEventID == 99 && MK.length > 0 && HHMMSS < 152000) { for (var i = 0; i < MK.length; i++) { Account1.SetBalance(MK[i].code, 0); //각 종목 매수이수 초고가 저장 if (B[i] == 1 && MK[i].current > HH[i]) { HH[i] = MK[i].current; } if (B[i] == 1 && Account1.Balance.count > 0 ) { //현재가가 평단가대비 -손절%이상 하락하면 매도, 해당 종목 B변수는 -1 if (MK[i].current < Account1.Balance.avgUnitCost*(1-손절/100)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); B[i] = -2; } //현재가가 평단가대비 +익절%이상 상승하면 매도, 해당 종목 B변수는 -1 if (MK[i].current >= Account1.Balance.avgUnitCost*(1+익절/100)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); B[i] = -1; } } if (B[i] == -1 && Account1.Balance.count > 0 ) { //진입이후 최고가가 평단가 대비 +최소수익%이상이고 //현재가가 평단가대비 최고가 대비 -수익갑수% 이하이면 매도, 해당 종목 B변수는 -1 if (HH[i] >= Account1.Balance.avgUnitCost*(1+익절/100) && MK[i].current < HH[i]*(1-익절후하락율/100)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); B[i] = -2; } } } } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount, aValues) { Main.MessageList("검색된종목수",nCount); //검색된 종목이 한종목 이상 if (nCount >= 1) { //종목객체 요청리스트를 초기화 MKList = []; //처음 종목이 검색이 될 떄는 if (MK.length == 0) { //검색된 종목 중 잔고에 없는 종목으로 최대20개만 MKList에 저장 for (var a = 0; a < nCount; a++) { Account1.SetBalance(aItemList[a],0); if (Account1.Balance.count == 0 && MKList.length < 최대매수종목수) { MKList.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 && MKList.length < 최대매수종목수-MK.length) { MKList.push(aItemList[a]); } } } } Main.MessageList("주문할 종목수:",MKList.length); //요청할 종목이 없고 if (MKList.length == 0) { //종목객체가 최대매수종목수 미만이면 1번 타이머 재셋팅 if (MK.length < 최대매수종목수) { //1번 타이머, 60초 Main.SetTimer(1, 검색주기*1000); } else { //종목객체가 최대매수종목수와 같으면 메세지 출력하고 종료 Main.MessageList("최대종목수 도달 검색종료"); } } else //요청할 종목이 있으면 { //요청리스트의 첫종목 부터 종목객체 요청(배열이므로 종목코드가 0번방 부터 존재) req = 0; Main.MessageList(req,"종목객체요청",MKList[req]); Main.ReqMarketData(MKList[req]); } } } //요청한 종목객체가 만들어 지먼 function Main_OnRcvMarketData(MarketData) { //직전 요청한 종목이 맞는지 확인후에 if (MarketData.code == MKList[req]) { Main.MessageList(req,"종목객체생성",MarketData.code); //종목객체는 MK에 추가하고 MK.push(MarketData); B.push(1); HH.push(MarketData.current); //매수주문가격 var OP = MarketData.Ask(1); //수량 var OV = Math.floor(매수금/OP); //지정한 가격, 지정한 수량으로 매수주문 Account1.OrderBuy(MarketData.code,OV,OP,0); Main.MessageList(req,"매수주문",MarketData.code,OV,OP); //요청횟수 1증가 req = req+1; //요청횟수가 요청할 종목갯수보다 작으면 다음 종목객체 요청 if (req < MKList.length) { Main.MessageList(req,"종목객체요청",MKList[req]); var XX = Main.ReqMarketData(MKList[req]); //종목객체 생성제한 if (XX == -1) { //2번 타이머 15초 Main.SetTimer(2,15000); } } else //요청횟수가 요청할 종목갯수에 도달했으면 종목객체 생성 종료 { Main.MessageList(req,"종목객체생성끝"); //최대매수종목수에 도달하지 않았으면 종목검색을 위해 타이머 재셋팅 if (MK.length < 최대매수종목수) { Main.SetTimer(1,검색주기*1000); } else { //최대매수종목수를 채웠으면 검색 종료 Main.MessageList("최대종목수 도달 검색종료"); } } } } 즐거운 하루되세요