예스스탁
예스스탁 답변
2023-01-06 11:22:44.0
안녕하세요
예스스탁입니다.
예스스팟은 식작성의 흐름정도만 알려드리는 가이드 정도만 작성해 드립니다.
완성식이 아니므로 아래 내용 참고하셔서 완성해 사용하시기 바랍니다.
스팟에서 종목검색은 종목검색화면에서 사용자검색조건으로 저장한 이름을 이용해 검색을 수행합니다.
검색하고자 하는 내용을 사용자검색조건으로 저장한 후 수식내 Main.ReqPowerSearch함수에
이름을 지정해 주시면 됩니다.
var 최대종목수 = 30,M1;
var ItemList = [];
var MKcnt,MK = [],OD = [],VV = [];
//스팟시작
function Main_OnStart()
{
//종목검색 타이머
Main.SetTimer(1,300000)//300초, 1000이 1초
//잔고체크 타이머
Main.SetTimer(2,3000)//3초, 1000이 1초
//종목당 매수금
M1 = Math.floor(Account1.GetBalanceETCinfo(0)/최대종목수);//하이기준 예수금
//주문종목갯수
MKcnt = 0;
}
//타이머동작
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번타이머 동작
if (nEventID == 1 && HHMMSS >= 90000)
{
//종목검색
Main.ReqPowerSearch("내검색1") ;//사용자검색조건명 지정
}
//2번타이머 동작
if (nEventID == 2 && MK.length > 0)
{
//보유종목수
var num = Account1.GetTheNumberOfBalances();
if (num > 0 && HHMMSS < 151500)
{
for (var i = 0; i < num; i++ )
{
Account1.SetBalance(i);
if (Account1.Balance.count > 0)
{
for (var x = 0; x < num; x++ )
{
if (MK[x].code == Account1.Balance.code && Order[x] >= 1)
{
//손절
if (MK[a].current <= Account1.Balance.avgUnitCost*0.95)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
Order[a] = 0;
}
else
{
//1차 익절
if (Order[x] == 1)
{
if (MK[x].current >= Account1.Balance.avgUnitCost*1.05)
{
Account1.OrderSell(Account1.Balance.code, Math.floor(VV[x]*0.4),0,1);
Order[x] = 2;
}
} //2차 익절
else if (Order[x] == 2)
{
if (MK[x].current >= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code, Math.floor(VV[x]*0.4),0,1);
Order[x] = 3;
}
}
//3차 익절
else if (Order[x] == 3)
{
if (MK[x].current >= Account1.Balance.avgUnitCost*1.15)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
Order[x] = 0;
}
}
}
}
}
}
}
}
if (num > 0 && HHMMSS >= 151500)
{
Main.KillTimer(1);
Main.KillTimer(2);
for (var i = 0; i < num; i++ )
{
Account1.SetBalance(i);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
Main.MessageList("종목검색 완료 nCount : ",nCount);
//보유종목수
var num = Account1.GetTheNumberOfBalances();
//검색된 종목이 1개이상
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (MK.length == 0)
{
for (var i = 0; i < Math.min(최대종목수-num,nCount); i++ )
{
ItemList.push(aItemList[i]);
}
}
else
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < MK.length; x++ )
{
if (aItemList[i] == MK[x].code)
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
if (ItemList.length == 최대종목수-num)
{
break;
Main.MessageList("break");
}
}
}
}
if (ItemList.length > 0)
{
req = 0;
Main.ReqMarketData(ItemList[req]);
}
}
else //검색된 종목이 없으면
{
//종목검색 타이머 재실행
Main.SetTimer(1,300000)//300초, 1000이 1초
}
}
function Main_OnRcvMarketData(MarketData)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (MarketData.code == ItemList[req])
{
//종목객체 저장
MK[MKcnt] = MarketData;
//종목객체와 동일배열에 1 저장
OD[MKcnt] = 1;
VV[MKcnt] = Math.floor(M1/MarketData.Ask(1));
MKcnt = MKcnt+1;
//시장가로 매수주문
Account1.OrderBuy(MarketData.code,Math.floor(M1/MarketData.Ask(1)),0,1);
req = req+1;
if (req < ItemList.length)
{
//다음종목객체 요청
Main.ReqMarketData(ItemList[req]);
}
else
{
Main.MessageList("종목객체 요청 종료");
if (HHMMSS < 151500)
{
//종목검색 타이머 재실행
Main.SetTimer(1,300000)//300초, 1000이 1초
}
}
}
}
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 예트레이더 (NH 트레이더) 종목검색후 예스스팟 주문
> YesLanguage편집기로 검색식은 이미 만들었구요.
YesLanguage편집기로 종목검색 리스트를 만들고
검색된 리스트 종목을 실시간으로 스팟으로 보내고
예스스팟을 이용해서 매수 종목수는 최대 일 때 30개까지 n개 종목까지만
임의로 정합니다.
임의로 정하기 어려우면 종목의 현재가가 작은 순서로 30개 이하로 순서를
정합니다.
1종목 투입금액 = 예수금/30
으로 잔고가 없는 종목들을 동일항 금액으로 시장가 매수합니다.
각종목마다 매수후에 5% 이익이 생기면 처음 총매수 잔고의 40%를 청산하고
처음 매수가보다 다시 10% 이익이 나면 다시 40% 청산합니다.
그후 15% 이익이 나면 나머지 전부 잔량을 청산합니다.
종가 무렵 3시 15분에 종목마다 잔고 수량이 있으면 전량 청산합니다.
손절 :
종목마다 매수후 5% 손실이 나면 전량 손절합니다,
5분마다 위의 과정을 반복하며
매수가 되고 잔고가 전부 청산된 좀옥은 리스트에서 제거하며
이전 종목 리스트와 겹치는 종목들은 제외하고
새로운 종목들만 집계하며 매수 종목 수가 30개 이하이면
새로운 종목을 현재가가 작은 순서로 이전 매수한 종목과 합하여
총 30개 이하가 되도록 위와 같이 매매하게 하고 싶습니다.
부탁드립니다.