예스스탁
예스스탁 답변
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%
이렇게 매도식을 추가 하고 싶습니다.(%조건은 수정가능)
매도식을 현재 있는 자동매매 스팟 제일 아래 붙여넣어야 하나요?
감사합니다.