답변완료
MarketData.Ask(1),0); 에서 0의 의미가 궁금합니다.
::::0의 의미::::
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),MarketData.Ask(1),0);
위 코드에서 마지막 0은 잘못된 것인가요?
1:신규주문
2:청산주문
3:정정주문
4:취소주문
으로 알고 있습니다.
아니면 예스스팟 고유의 다는 의미인가요?
2025-09-25
203
글번호 226406
답변완료
항상 감사드립니다. 또 예스스팟 스크립트 질문입니다.
안녕하세요. 항상 감사드립니다.
현재 쓰고 있는 스크립트에는 예스스팟 시작시의 평가금액대비 +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; // 계좌에 같은 종목이 없으면 폴스 반환
}
2025-09-22
246
글번호 226401
답변완료
예스스팟으로 종목을 매수하고 있습미다
종목매수를 자동으로 하고나서 파워종목에서 만든 다른 조건검색식으로 오늘 매수한 종목을 매도 하고 싶습미다
예스스팟 자동매수 수식은 다음과 같습미다..
var timer2 = 2; // 2초
var 매수금 = 17000000;
var 손절 = 0.80;
var 익절 = 1.20;
var OrderList = [];
var MKList = [];
var req;
var 종목수 = 1, BuyCount;
function Main_OnStart()
{
//1번 타이머, 1초
Main.SetTimer(1, timer2*1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
//스팟 시작시 잔고평가금액
V1 = Account1.GetBalanceETCinfo(100);
BuyCount = 0;
}
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 >= 090005 && HHMMSS < 140010 && BuyCount < 종목수)
{
//종목검색 수행
Main.ReqPowerSearch("테스트")
}
if (nEventID == 1)
{
//계좌보유종수
var num = Account1.GetTheNumberOfBalances();
//9시~11시 15분 사이
if (HHMMSS >= 090006 && HHMMSS < 151900)
{
//보유종목이 1개 이상
if (num >= 1)
{
//계좌평가금액이 스팟시작시 평가금액대비 3% 이상이면 전종목 전량매도
if (Account1.GetBalanceETCinfo(100) >= V1*1.20)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 5% 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
else //아니면 개별종목 3%익절, -5%손절 체크
{
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 -5% 손실이면 시장가 매도
if (Account1.Balance.count > 0 &&
(Account1.Balance.current >= Account1.Balance.avgUnitCost*익절 ||
Account1.Balance.current <= Account1.Balance.avgUnitCost*손절))
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
}
//오후10시 00분이후이면 모든 종목 전량 수익에 상관없이 매도
if (HHMMSS >= 152900)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 -5% 손실이면 시장가 매도
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;
}
}
if (Add == true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]);
}
}
}
}
if (OrderList.length == 0)
{
Main.SetTimer(1, timer2*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData);
// 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code))
{
if (BuyCount < 종목수)
{
// 계좌에 없는 경우에만 매수
//Account1.OrderBuy(MarketData.code,1,0,1); 밑에 한번에 17000000 시장가에 매수
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1);
//Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(4)),MarketData.Ask(1),0);
//지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다.
Main.MessageList(MarketData.code + " 주식을 매수합니다.");
BuyCount = BuyCount+1;
}
}
else
{
Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
req = req+1;
if (req < OrderList.length && BuyCount < 종목수)
{
var aa = Main.ReqMarketData(OrderList[req]);
if (aa == -1)
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer2*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; // 계좌에 같은 종목이 있으면 true 반환
}
}
return false; // 계좌에 같은 종목이 없으면 false 반환
}
오늘 매수한 종목을 파워종목 조건검색식 만족할때
시장가로 매도할수 있게
예스스팟 자바 부탁드림미다.
2025-09-27
288
글번호 226399
답변완료
예스스팟 초보자의 수정요청
아래 수식을
- 매수금 10만원 매수---> 종가 천원이상 5만원 이하종목에 한해서
1주만 시장가로 매수로 변경
- 손절은 매수가의 -10%로 변경
- 익절은 매수가의 20%로 변경
- 09시~10시까지만 작동(매수,손절,익절)
- 10시기준 자동매도(손절/익절)되지 않은 종목은 보유(수동매도 가능 ?)
- 예스스팟에 잔존종목(익절/손절이나 수동매도 후 남은 종목수)은 10개까지로 제한하여
부족한 종목 수만큼만 매수.
등의 조건들, 기타 합리적인 사항으로 추가할만한 것이 있다면 그를 반영한 수식으로
수정 부탁드립니다.
==========================================================================
var timer5 = 2; // 2초
var 매수금 = 100000;
var 손절 = 0.9;
var 익절 = 1.2;
var OrderList = [];
var MKList = [];
var req;
var 종목제한수 = 10;
function Main_OnStart()
{
// 1번 타이머, 2초
Main.SetTimer(1, timer5 * 1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1 && HHMMSS >= 090000 && HHMMSS < 100000)
{
// 종목검색 수행
Main.ReqPowerSearch("변동성 돌파전략");
}
else if (nEventID == 1 && HHMMSS >= 100000)
{
// 10:00 이후 모든 보유 종목 매도
for (var i = 0; i < MKList.length; i++)
{
Account1.OrderSell(MKList[i].code, MKList[i].quantity, 0, 1);
Main.MessageList(MKList[i].code + " 시간 종료로 매도");
}
MKList = [];
Main.KillTimer(1); // 타이머 종료
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
// 손절/익절 확인 (타이머 3번으로 주기적 실행)
if (nEventID == 3)
{
CheckStopLossTakeProfit();
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1)
{
if (MKList.length == 0)
{
OrderList = aItemList.slice(0, Math.min(nCount, 종목제한수));
}
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;
}
}
if (Add && !IsStockInAccount(aItemList[a]) && OrderList.length < 종목제한수 - MKList.length)
{
OrderList.push(aItemList[a]);
}
}
}
Main.MessageList("OrderList: " + JSON.stringify(OrderList));
if (OrderList.length == 0)
{
Main.SetTimer(1, timer5 * 1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
}
function Main_OnRcvMarketData(MarketData)
{
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (MarketData.code == OrderList[req])
{
if (HHMMSS >= 100000)
{
Main.MessageList("매수 시간(09:00~10:00) 종료로 매수 중지");
Main.SetTimer(1, timer5 * 1000);
return;
}
if (MKList.length >= 종목제한수)
{
Main.MessageList("종목 제한 수 초과로 매수 중지");
Main.SetTimer(1, timer5 * 1000);
return;
}
if (!IsStockInAccount(MarketData.code))
{
var quantity = Math.floor(매수금 / MarketData.Ask(1));
if (quantity > 0)
{
// 계좌에 없는 경우에만 매수
Account1.OrderBuy(MarketData.code, quantity, 0, 1);
//Account1.OrderBuy(MarketData.code, 1, 0, 1); // 고정 1주 매수
//Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Ask(1)), MarketData.Ask(1), 0); // 지정가 매수
// 지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다.
MKList.push({
code: MarketData.code,
buyPrice: MarketData.Ask(1),
quantity: quantity
});
Main.MessageList(MarketData.code + " 주식을 " + quantity + "주 매수, 매수가: " + MarketData.Ask(1));
}
else
{
Main.MessageList(MarketData.code + " 매수 수량 0, 매수 실패");
}
}
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
{
// 손절/익절 체크를 위한 타이머 시작 (10초마다 확인)
Main.SetTimer(3, 10000);
Main.SetTimer(1, timer5 * 1000);
}
}
}
function CheckStopLossTakeProfit()
{
for (var i = 0; i < MKList.length; i++)
{
var stock = MKList[i];
var marketData = Main.GetMarketData(stock.code);
if (!marketData) continue;
var currentPrice = marketData.currentPrice;
if (currentPrice <= stock.buyPrice * 손절)
{
Account1.OrderSell(stock.code, stock.quantity, 0, 1);
Main.MessageList(stock.code + " 손절(-5%)로 " + stock.quantity + "주 매도, 현재가: " + currentPrice);
MKList.splice(i, 1);
i--;
}
else if (currentPrice >= stock.buyPrice * 익절)
{
Account1.OrderSell(stock.code, stock.quantity, 0, 1);
Main.MessageList(stock.code + " 익절(+5%)로 " + stock.quantity + "주 매도, 현재가: " + currentPrice);
MKList.splice(i, 1);
i--;
}
}
}
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;
}
2025-09-21
258
글번호 226398