커뮤니티

분할매도 수식 문의

프로필 이미지
리버피닉스
2025-06-10 15:43:58.0
183
글번호 226319
답변완료
안녕하세요? 현재 예스랭귀지 종목검색을 기반으로 예스스팟에서 자동매수를 하고 수동 매도를 하고 있습니다. 혹시, 매수 후 특정한 조건에서 매도를 할 수 있게 수식 부탁드립니다.(스팟에 추가) 1. 추가할 매도 조건 a. 5% 수익일때 50% 매도(1차 익절) b. 1차 매도 후 2% 도달하면 전량 매도 c. 10% 수익일때 잔량의 50% 매도(2차 익절) d. 10% 이후 고점에서 5% 하락시 2차 익절후 잔량 전부 스탑트레일링 전량 매도 e. 손절 -5% 이렇게 매도식을 추가 하고 싶습니다.(%조건은 수정가능) 매도식을 현재 있는 자동매매 스팟 제일 아래 붙여넣어야 하나요? 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-06-20 10:44:31.0

안녕하세요 예스스탁입니다. 스팟은 복사 후 붙여넣기로만 해결되지 않습니다. 매수시점에 값저장등이 발생해야 하므로 아래 수식 구조 참고하셔서 기존식을 수정해 보셔야 합니다. var 종목검색주기 = 10; var 매수금 = 10000000; var 익절1차 = 5, 익절1차수량비율 = 50; var 익절1차후하락 = 2; var 익절2차 = 10, 익절1차수량비율 = 50; var 익절2차후하락 = 5; var 손절 = -5; var MKList = [];//검색 후 종목객체 요청할 종목들의 종목코드를 담을 배열변수 var MK = []; //종목객체를 저장할 배열변수 var OrderStep = []; //각 종목별 주문흐름을 저장할 배열변수 var HH = []; //각 종목별 매수 후 최고가 저장할 배열변수 var req; function Main_OnStart() { aa = 0; Main.SetTimer(1, 종목검색주기*1000); //분할청산 체크 타이머 Main.SetTimer(2, 1000); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS > 90000 && HHMMSS < 152000) { Main.KillTimer(1); Main.ReqPowerSearch("사용자검색조건명"); } if (nEventID == 99) { Main.KillTimer(99); Main.MessageList(HHMMSS,"|종목객체 재요청",req,MKList[req]); Main.ReqMarketData(MKList[req]); } if (nEventID == 2 && MK.length > 0) { for (var i = 0; i < MK.length; i++) { Account1.SetBalance(MK[i].code,0); if (MK[i].current > HH[i]) { HH[i] = MK[i].current; Main.MessageList(HHMMSS,"|최고가갱신:",MK[i].code,HH[i]); } if (Account1.Balance.count > 0) { if (OrderStep[i] >= 1 && OrderStep[i] <= 3) { if (MK[i].current <= Account1.Balance.avgUnitCost*(1+손절/100)) { OrderStep[i] = 99; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Ask(1),0); Main.MessageList(HHMMSS,"|손절:",Account1.Balance.code); } } if (OrderStep[i] == 1 && HH[i] >= Account1.Balance.avgUnitCost*(1+익절1차/100)) { OrderStep[i] = 2; var xvol = Math.max(Math.floor(Account1.Balance.count*(익절1차수량비율/100)),1); Account1.OrderSell(Account1.Balance.code,xvol,MK[i].Ask(1),0); Main.MessageList(HHMMSS,"|익절1차:",Account1.Balance.code); } if (OrderStep[i] == 2) { if (MK[i].current <= Account1.Balance.avgUnitCost * (1+익절1차후하락/100)) { OrderStep[i] = 99; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Ask(1),0); Main.MessageList(HHMMSS,"|익절1차후하락:",Account1.Balance.code); } if (HH[i] >= Account1.Balance.avgUnitCost * (1+익절2차/100)) { OrderStep[i] = 3; var xvol = Math.max(Math.floor(Account1.Balance.count*(익절2차수량비율/100)),1); Account1.OrderSell(Account1.Balance.code,xvol,MK[i].Ask(1),0); Main.MessageList(HHMMSS,"|익절2차:",Account1.Balance.code); } } if (OrderStep[i] == 3) { if (MK[i].current <= HH[i] * (1+익절2차후하락/100)) { OrderStep[i] = 99; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Ask(1),0); Main.MessageList(HHMMSS,"|익절2차후하락:",Account1.Balance.code); } } } } } } function Main_OnRcvItemList(aItemList, nCount) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); Main.MessageList(HHMMSS,"|검색된 종목수",nCount); if (nCount >= 1) { MKList = []; //처음 종목들이 검색되었ㅎ을 때는 모든 종목이 대상 if (MK.length == 0) { MKList = aItemList; } else //첫 종목이 검색된 이후 { //이전검색된 종목은 제외 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; } } if (Add == true) { MKList.push(aItemList[a]); } } } Main.MessageList(HHMMSS,"|종목객체 요청할 종목수:",MKList.length); //요청할 종목객체가 없으면 타이머 재설정 if (MKList.length == 0) { Main.SetTimer(1, 종목검색주기*1000); } else //요청할 종목객체가 있으면 { //순차적으로 요청 req = 0; Main.ReqMarketData(MKList[req]); Main.MessageList(HHMMSS,"|종목객체요청",MKList[req]); } } else //검색된 종목이 없으면 타이머 재설정 { Main.SetTimer(1, 종목검색주기*1000); } } function Main_OnRcvMarketData(MarketData) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (MarketData.code == MKList[req]) { Main.MessageList(HHMMSS,"|종목객체생성",req,MarketData.code); //종목객체 저장 MK.push(MarketData); //해당종목 주문 단계는 1 OrderStep.push(1); //해당종목 주문 단계는 1 HH.push(MarketData.current); //매수주문 Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),MarketData.Ask(1) ,0); Main.MessageList(HHMMSS,"|매수주문",MarketData.code,MarketData.Ask(1)); req = req+1; if (req < MKList.length) { Main.MessageList(HHMMSS,"|종목객체요청",MKList[req]); var S = Main.ReqMarketData(MKList[req]); if (S == -1) { Main.MessageList(HHMMSS,"|종목객체제한 --> 15초 타이머"); Main.SetTimer(99, 15000); } } else { Main.MessageList(HHMMSS,"|종목객체생성끝"); //타이머 재설정 Main.SetTimer(1, 종목검색주기*1000); } } } 즐거운 하루되세요 > 리버피닉스 님이 쓴 글입니다. > 제목 : 분할매도 수식 문의 > 안녕하세요? 현재 예스랭귀지 종목검색을 기반으로 예스스팟에서 자동매수를 하고 수동 매도를 하고 있습니다. 혹시, 매수 후 특정한 조건에서 매도를 할 수 있게 수식 부탁드립니다.(스팟에 추가) 1. 추가할 매도 조건 a. 5% 수익일때 50% 매도(1차 익절) b. 1차 매도 후 2% 도달하면 전량 매도 c. 10% 수익일때 잔량의 50% 매도(2차 익절) d. 10% 이후 고점에서 5% 하락시 2차 익절후 잔량 전부 스탑트레일링 전량 매도 e. 손절 -5% 이렇게 매도식을 추가 하고 싶습니다.(%조건은 수정가능) 매도식을 현재 있는 자동매매 스팟 제일 아래 붙여넣어야 하나요? 감사합니다.