안녕하세요
예스스탁입니다.
1주 시장가 매수는 기존에 해당 내용으로 처리되어 있습니다.
var starttime = 90000;
var endtime = 100000;
수식에 보시면 위 시간사이에만 검색돠 매수가 됩니다.
시간은 위 변수값 변경하시면 됩니다.
endtime 시간이후 모든 종목청산하는 내용만 삭제해 드립니다.
var timer5 = 2; // 2초
var 매수수량 = 1;
var 손절 = -10;
var 익절 = 20;
var starttime = 90000;
var endtime = 100000;
var OrderList = [];
var MKList = [];
var req;
var 종목제한수 = 10;
function Main_OnStart()
{
// 1번 타이머, 2초
Main.SetTimer(1, timer5 * 1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
// 손절/익절 체크를 위한 타이머 시작 (10초마다 확인)
Main.SetTimer(3, 10000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1 && HHMMSS >= starttime && HHMMSS < endtime)
{
// 종목검색 수행
Main.ReqPowerSearch("변동성 돌파전략");
}
else if (nEventID == 1 && HHMMSS >= endtime)
{
MKList = [];
Main.KillTimer(1); // 타이머 종료
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
// 손절/익절 확인 (타이머 3번으로 주기적 실행)
if (nEventID == 3)
{
if (MKList.length > 0)
{
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 >= endtime)
{
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));
quantity = 매수수량;
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
{
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 *(1+손절/100))
{
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 * (1+익절/100))
{
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;
}
즐거운 하루되세요