커뮤니티
문의 드립니다
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);
}
}
}
}
}
}
즐거운 하루되세요