커뮤니티

문의 드립니다

프로필 이미지
미래테크
2026-03-22 12:29:52
540
글번호 231183
답변완료

전용 매도식을 만들어서 적용하고 싶습니다.


매수는 이평선크로스, 보조지표 등을 이용해 매수를 해놓고  매도는 전용 매도식으로 해결할 수 있으면 좋겠습니다.

예스스팟에 전용매도식을  장중에 적용해 놓으면 하는데 예스스팟 게시판을 보니 매수와 매도가 같이 되어있어

매수조건을 실행하면 리스트가 만들어지고 매도조건이 실행되면 매도되는 매수조건을 실행해야만 매도가 되는데

매도만 할 수 있는 수식 부탁합니다.


매도조건

1.

MACD(12,26,9)  macd  <  0  매도

Rsmacd (12.26.9) Dead cross  매도 (동시에 macd 값이 전봉보다 하락시)

9시반 이후 두 경우에서 하나만 발생해도 매도


2. 손절선은 매수가 대비 -4%,   15시 15분  보유종목  all 매도

3. 오전 10시 이후 보유종목들 수익  발생했다  하락으로 손실 발생된 종목 있으면  매도


* 매수와 매도가 있어야 만 매매식이 된다하면 다음 수식도 부탁합니다.

매수시간 제한은 아침 9시 40분 까지만 매수하고, 매도는 시스템 매도식이 적용될 때 까지 예를 들어 12시 까지

시간 차이를 두어 진행하고 싶은데 수식 부탁합니다

답변 2
프로필 이미지

예스스탁 예스스탁 답변

2026-03-31 16:25:54

안녕하세요 예스스탁입니다. 확인이 필요한 내용이 있습니다. 02-3453-1060 전화주시기 바랍니다. 즐거운 하루되세요
프로필 이미지

예스스탁 예스스탁 답변

2026-04-01 16:24:10

안녕하세요 예스스탁입니다. 1 아래식 참고하셔서 수정보완해 사용하시기 바랍니다. 스팟 시작시 보유 종목에 대해 종목객체와 차트를 생성한 다음에 차트봉 완성시 지표 조건 만족하면 매도하게 됩니다. 스팟에서 차트를 생성할 때 지표들을 지졍해 적용해서 생성할 수 있습니다. 차트주기는 5분봉으로 지표명은 MACD, RSMACD로 보고 작성 드립니다. 주기와 지표명이 다르시면 주석 보시고 변경하시면 됩니다. 손절 본절 당일청산은 1초단위로 체크해서 매도됩니다. 2 var X = [],List = [],MK = [], CH = [],HH = []; var req; //스팟 시작 function Main_OnStart() { Main.MessageList("Start"); //보유봉목수 확인 및 종목코드 저장 var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); if (Account1.Balance.count > 0) { List.push(Account1.Balance.code); } } } Main.MessageList("보유종목수",List.length); //보유종목이 있으면 종목객체와 차트객체 생성 시작 if (List.length > 0) { req = 0; Main.ReqMarketData(List[req]); Main.MessageList("종목객체요청:",List[req]); Main.SetTimer(99,1000); } else { Main.MessageList("보유종목 없음"); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == List[req]) { X.push(0); MK.push(MarketData); Main.MessageList("종목객체수신:",MarketData.code); //5분봉 5000봉 var ChartSet = new ReqChartItem(List[req],5,CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false); //지정한 이름의 지표들 적용해 생성 var IndSet = new Array(new IndicatorInfo("MACD"),new IndicatorInfo("RSMACD")); Main.MessageList("차트객체요청:",List[req]); Main.ReqChartEx(ChartSet, null, IndSet); } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == List[req]) { CH.push(ChartEx); Main.MessageList("차트객체수신:",ChartEx.GetCode(1)); req = req+1; if (req < List.length) { var a = Main.ReqMarketData(List[req]); Main.MessageList("종목객체요청:",List[req]); if (a == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체요청제한시간"); } } else { Main.MessageList("차트,종목객체 생성 완료"); } } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()* 10000+ d.getMinutes()*100 + d.getSeconds(); if (nEventID == 1) { Main.KillTimer(1); Main.ReqMarketData(List[req]); Main.MessageList("종목객체재요청:",List[req]); } if (nEventID == 99) { //15시15분이전 if (HHMMSS < 151500) { //보유 종목리스트에서 for (var i = 0; i < List.length; i++ ) { Account1.SetBalance(List[i],0); //-4% 손실이면 매도 if (X[i] == 0 && Account1.Balance.count > 0 && MK[i].current <= Account1.Balance.avgUnitCost*0.96) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); X[i] = 1; } //10시이후 수익이었다가 평단가 아래이면 매도 if (HHMMSS >= 100000) { if (MK[i].current > HH[i]) { HH[i] = MK[i].current; } if (X[i] == 0 && Account1.Balance.count > 0 && HH[i] > 0 && HH[i] > Account1.Balance.avgUnitCost && MK[i].current < Account1.Balance.avgUnitCost) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); X[i] = 1; } } } } else //15시 15분이 되면 { Main.KillTimer(99); //전종목 매도 for (var i = 0; i < List.length; i++ ) { X[i] = 1; Account1.SetBalance(List[i],0); if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); } } } } } //차트 봉완성 function Main_OnBarAppended(ChartEx, nData) { var d = new Date(); HHMMSS = d.getHours()* 10000+ d.getMinutes()*100 + d.getSeconds(); //9시 30분 이후 if (HHMMSS >= 93000) { for (var i = 0; i < CH.length; i++ ) { //전체 확장차트 중 현재 봉완성된 차트를 찾고 if (X[i] == 0 && CH[i].GetCode(1) == ChartEx.GetCode(1)) { //MACD값이 0보다 작으면 매도 //MACD가 하락하면서 RSMACD가 데드크로스면 매도 if (CH[i].GetIndicatorData("MACD",1,1) < 0 || (CH[i].GetIndicatorData("MACD",1,1) < CH[i].GetIndicatorData("MACD",1,2) && CH[i].GetIndicatorData("RSMACD",1,1) < CH[i].GetIndicatorData("RSMACD",2,1)&& CH[i].GetIndicatorData("RSMACD",1,2) >= CH[i].GetIndicatorData("RSMACD",2,2))) { X[i] = 1; Account1.SetBalance(ChartEx.GetCode(1), 0); if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0); } } } } } } 즐거운 하루되세요