커뮤니티
자동 매도 문의드립니다.
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("최대종목수 도달 검색종료");
}
}
}
}
즐거운 하루되세요