예스스탁
예스스탁 답변
2025-10-01 10:51:23
안녕하세요
예스스탁입니다.
//보유종목의 평가금액합과 투자원금합을 계산
평가금액합 = 0;
투자원금합 = 0;
for (var i=0; i<num; i++)
{
Account1.SetBalance(i);
if(Account1.Balance.count > 0)
{
//보유종목의 수량*현재가의 합
평가금액합 = 평가금액합 + (Account1.Balance.count*Account1.Balance.current);
//보유종목의 수량*평단가의 합
투자원금합 = 투자원금합 + (Account1.Balance.count*Account1.Balance.avgUnitCost);
}
}
기존 정산가 기준 비교해서 전체 매도하는 부분만
먼저 전체잔고 루프해서 현재가와 평단가 기준으로 합산값을 만들고 비교하게 하시면 됩니다.
아래 내용 참고하시기 바랍니다.
var timer5 = 3; // 3초
var 매수금 =100000 ;
var 익절 = 1.09;
var OrderList = [];
var MKList = [];
var SellList = [];
var req;
function Main_OnStart()
{
Main.SetTimer(1, timer5*1000); // 1번 타이머 , 3초
MKList = []; //오늘 매수한 종목관리 배열 초기화
V1 =Account1.GetBalanceETCinfo(100); // 시작시 잔고 평가 금액
}
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear()* 10000 + (d.getMonth() +1)*100 + d.getDate();
HHMMSS = d.getHours()* 10000+ d.getMinutes()*100 + d.getSeconds();
if (nEventID==1 && HHMMSS>090000 && HHMMSS<153000 )
{
Main.ReqPowerSearch("필필필") // 종목검색수행
}
if (nEventID==1)
{
var num = Account1.GetTheNumberOfBalances(); // 계좌보유종수
// 9시 ~ 15시 30분 사이
if (nEventID==1 && HHMMSS>090000 && HHMMSS<153000 )
{
// 보유종목이 1개 이상
if(num >= 1)
{
//보유종목의 평가금액합과 투자원금합을 계산
평가금액합 = 0;
투자원금합 = 0;
for (var i=0; i<num; i++)
{
Account1.SetBalance(i);
if(Account1.Balance.count > 0)
{
//보유종목의 수량*현재가의 합
평가금액합 = 평가금액합 + (Account1.Balance.count*Account1.Balance.current);
//보유종목의 수량*평단가의 합
투자원금합 = 투자원금합 + (Account1.Balance.count*Account1.Balance.avgUnitCost);
}
}
//평가금액합이 투자원급합 대비 4% 이상
if(평가금액합 >= 투자원금합*1.04)
{
// 1번 타이머 종료
Main.KillTimer(1);
//보유 종목 전량 매도
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);
}
}
}
else
{
for (var i=0; i<num; i++)
{
Account1.SetBalance(i);
if(Account1.Balance.current >= Account1.Balance.avgUnitCost*익절)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
//익절매도 종목들의 종목코드 저장
SellList.push(Account1.Balance.code);
}
}
}
}
}
/** if (HHMMSS >= 151500)
{
Main.KillTimer(1);
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);
}
}
} */
}
if(nEventID ==2)
{
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >=1 )
{
if(MKList.length == 0)
{
OrderList = aItemList
}
else
{
for(var a =0; a<nCount; a++)
{
var Add = true;
for (var b=0; b<MKList.length; b++)
{
if(aItemList[a]==MKList[b].code)
{
Add = false;
}
}
//매도종목인지 확인
for (var b=0; b<SellList.length; b++)
{
if(aItemList[a]==SellList[b])
{
Add = false;
}
}
if(Add==true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]);
}
}
}
}
if(OrderList.length==0)
{
Main.SetTimer(1, timer5*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if( MarketData.code == OrderList[req])
{
MKList.push(MarketData);
//계좌에 같은 종목 있는지 확인하고 없는 경우만 매수
if(!IsStockInAccount(MarketData.code))
{
// Account1.OrderBuy(MarketData.code,1,0,1); // 시장가 한주를 주문한다.
// 지정가로 주문하고자 할때는 아래로 변경
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1);
//Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),MarketData.Ask(1),0);
Main.MessageList(MarketData.code + "주식을 매수합니다");
}
else
{
Main.MessageList(MarketData.code + "주식을 매수 안 합니다");
}
req = req+1;
if(req<OrderList.length)
{
var aa = Main.ReqMarketData(OrderList[req]);
if( aa = -1 )
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer5*1000);
}
}
}
//계좌에 같은 종목이 있는지 확인
function IsStockInAccount(stockCode){
var numberOfBalances = Account1.GetTheNumberOfBalances();
for (var i = 0; i <numberOfBalances; i++){
Account1.SetBalance(i);
if(stockCode == Account1.Balance.code){return true;} // 계좌에 같은 종목이 있으면 트루 반환
}
return false; // 계좌에 같은 종목이 없으면 폴스 반환
}
즐거운 명절 되시기 바랍니다.
> 대봉코 님이 쓴 글입니다.
> 제목 : 항상 감사드립니다. 또 예스스팟 스크립트 질문입니다.
> 안녕하세요. 항상 감사드립니다.
현재 쓰고 있는 스크립트에는 예스스팟 시작시의 평가금액대비 +4%가 되면 모든 종목들이 자동매도 되도록 설정이 되어 있습니다.
이 부분을 예스스팟 시작시의 평가금액대비 +4%가 아닌, 현재 계좌에 보유중인 모든 종목들의 손익의 총합의 평가금액이 투자원금대비 +4%가 되면 전부 자동매도 되도록 스크립트 설정이 가능할까요?
(손실이 난 종목들을 바로 그날 정리하지 않고 가져가면서 기간이 얼마가 걸리든 상관없이 다른 종목에서 난 이익으로 전체 투자 원금의 +4%를 목표로 하는 전략입니다.)
다음은 현재쓰고 있는 스크립트 입니다.
var timer5 = 3; // 3초
var 매수금 =100000 ;
var 익절 = 1.09;
var OrderList = [];
var MKList = [];
var SellList = [];
var req;
function Main_OnStart()
{
Main.SetTimer(1, timer5*1000); // 1번 타이머 , 3초
MKList = []; //오늘 매수한 종목관리 배열 초기화
V1 =Account1.GetBalanceETCinfo(100); // 시작시 잔고 평가 금액
}
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear()* 10000 + (d.getMonth() +1)*100 + d.getDate();
HHMMSS = d.getHours()* 10000+ d.getMinutes()*100 + d.getSeconds();
if (nEventID==1 && HHMMSS>090000 && HHMMSS<153000 )
{
Main.ReqPowerSearch("필필필") // 종목검색수행
}
if (nEventID==1)
{
var num = Account1.GetTheNumberOfBalances(); // 계좌보유종수
if (nEventID==1 && HHMMSS>090000 && HHMMSS<153000 )
{ // 9시 ~ 15시 30분 사이
if(num >= 1)
{ // 보유종목이 1개 이상
if(Account1.GetBalanceETCinfo(100) >=V1*1.04)
{ //계좌평가금액이 스팟시작시 평가금액대비
Main.KillTimer(1); // 1번 타이머 종료
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);
}
}
}
else
{
for (var i=0; i<num; i++)
{
Account1.SetBalance(i);
if(Account1.Balance.current >= Account1.Balance.avgUnitCost*익절)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
//익절매도 종목들의 종목코드 저장
SellList.push(Account1.Balance.code);
}
}
}
}
}
/** if (HHMMSS >= 151500)
{
Main.KillTimer(1);
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);
}
}
} */
}
if(nEventID ==2)
{
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >=1 )
{
if(MKList.length == 0)
{
OrderList = aItemList
}
else
{
for(var a =0; a<nCount; a++)
{
var Add = true;
for (var b=0; b<MKList.length; b++)
{
if(aItemList[a]==MKList[b].code)
{
Add = false;
}
}
//매도종목인지 확인
for (var b=0; b<SellList.length; b++)
{
if(aItemList[a]==SellList[b])
{
Add = false;
}
}
if(Add==true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]);
}
}
}
}
if(OrderList.length==0)
{
Main.SetTimer(1, timer5*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if( MarketData.code == OrderList[req])
{
MKList.push(MarketData);
//계좌에 같은 종목 있는지 확인하고 없는 경우만 매수
if(!IsStockInAccount(MarketData.code))
{
// Account1.OrderBuy(MarketData.code,1,0,1); // 시장가 한주를 주문한다.
// 지정가로 주문하고자 할때는 아래로 변경
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1);
//Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),MarketData.Ask(1),0);
Main.MessageList(MarketData.code + "주식을 매수합니다");
}
else
{
Main.MessageList(MarketData.code + "주식을 매수 안 합니다");
}
req = req+1;
if(req<OrderList.length)
{
var aa = Main.ReqMarketData(OrderList[req]);
if( aa = -1 )
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer5*1000);
}
}
}
//계좌에 같은 종목이 있는지 확인
function IsStockInAccount(stockCode){
var numberOfBalances = Account1.GetTheNumberOfBalances();
for (var i = 0; i <numberOfBalances; i++){
Account1.SetBalance(i);
if(stockCode == Account1.Balance.code){return true;} // 계좌에 같은 종목이 있으면 트루 반환
}
return false; // 계좌에 같은 종목이 없으면 폴스 반환
}