예스스탁
예스스탁 답변
2025-05-29 16:02:37.0
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var List = ["005930","000660"]; //주문 낼 종목코드
var ndate = [20250527,20250529,20250528]; //주문일
var ntime = [145100,145200,154400]; //주문시간
var 주문금액 = 1000000; //1회 매수시 주문금액
var D,Bcode,Scode,HHMMSS,HHMMSS1;
var Svol, Bvol,Order;
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//스팟 시작시 오늘이 주문일인지 체크
if (ndate.length > 0)
{
D = -1;
for (var i = 0; i < ndate.length; i++)
{
//오늘날짜와 ndate배열을 비교해 같은 날이면
if (YYYYMMDD == ndate[i])
{
//날짜가 홀수 배열방인지 짝수 배열방인지 구분
D = i%2;
//짝수(0,2,4,...)이면 매수종목은 List[0],매도종목은 List[1]
//홀수(1,3,5,...)이면 매수종목은 List[1],매수종목은 List[1]
if (D == 0)
{
Bcode = List[0];
Scode = List[1];
}
else
{
Bcode = List[1];
Scode = List[0];
}
}
}
//D가 0이상이면(오늘이 주문일 맞음)
if (D >= 0)
{
Main.MessageList("매수종목객체요청:",Main.GetOrderCode(Bcode));
Main.ReqMarketData(Main.GetOrderCode(Bcode));
}
else
{
Main.MessageList(YYYYMMDD,"주문일 아님");
}
}
else
{
Main.MessageList("지정된 주문일이 없음:",ndate.length);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (Main.GetOrderCode(Bcode) == MarketData.code)
{
B = MarketData;
Main.MessageList("매수종목객체생성완료:",B.name);
Main.MessageList("매도종목객체요청:",Main.GetOrderCode(Scode));
Main.ReqMarketData(Main.GetOrderCode(Scode));
}
if (Main.GetOrderCode(Scode) == MarketData.code)
{
S = MarketData;
Main.MessageList("매도종목객체생성완료:",S.name);
Svol = 0;
//매도종목 보유수량이 있으면
Account1.SetBalance(S.code,0);
if (Account1.Balance.count > 0)
{
//1회 매수수량 계산
Svol = Math.ceil(Account1.Balance.count/ntime.length);
Main.MessageList("매도종목 보유:",Svol);
}
Main.SetTimer(1, 2000)
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS1 = HHMMSS;
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//매수시간 체크
for (i = 0; i < ntime.length; i++)
{
if (HHMMSS >= ntime[i] && HHMMSS1 < ntime[i])
{
Order = 0;
if (Svol > 0)
{
Account1.SetBalance(S.code,0);
if (Account1.Balance.count > 0)
{
Svol = Math.min(Svol,Account1.Balance.count);
}
Order = -1;
}
else
Order = 1;
Main.MessageList("주문시간:",Order);
}
//매도종목 보유수량이 있으면 매도주문을 먼저 실행하고 이후 전량 체결시 매수주
if (Order == -1)
{
//매수1호가잔량 > 매도주문수량X2
if (S.BidAmount(1) >= Svol*2)
{
SID = Account1.OrderSell(S.code,Svol,0,1);
Order = 0;
}
}
//매도종목 보유수량이 없으면 매수주문 바로 실행
if (Order == 1)
{
var Bvol = Math.floor(주문금액/B.Ask(1));
//매도1호가잔량 > 매수주문수량X2
if (B.AskAmount(1) >= Bvol*2)
{
Account1.OrderBuy(B.code,Bvol,0,1);
Order = 0;
}
}
}
}
//주문응답 수신
function Main_OnOrderResponse(OrderResponse)
{
//매도주문 주문응답 수신되면 주문번호 저장
if (OrderResponse.orderID == SID)
{
SNUM = OrderResponse.orderNum;
}
}
//체결응답 수신
function Main_OnNotifyFill(NotifyFill)
{
//매도주문에 대한 체결응답이 들어오면
if (NotifyFill.orderNum == SNUM)
{
//헤당 주문번호 미체결 셋팅하고
Account1.SetUnfill(SNUM);
//미체결이 없으면(전량체결))
if (Account1.Unfill.count == 0)
{
var Bvol = Math.floor(주문금액/B.Ask(1));
//매도1호가잔량 > 매수주문수량X2
if (B.AskAmount(1) >= Bvol*2)
{
Account1.OrderBuy(B.code,Bvol,0,1);
}
}
}
}
즐거운 하루되세요
> 착한이 님이 쓴 글입니다.
> 제목 : 수식 문의 드립니다.
> 안녕하세요. 수고 많으십니다.
특정날짜에 진입해서 다른 특정날짜에 청산하는 단순전략을 사용하고 있습니다.
그런데 일봉차트에서는 시가(장시작직후)에만 진입하도록 되어 있어서
큰 슬리피지가 발생하는등 불편한 점이 많습니다.
장시작직후 및 1시간후 2시간 후 등으로 분할 매수매도 할 수 있도록 스팟수식 부탁드립니다.
(일봉 차트 없이 예스스팟으로만 구성되도록)
특별한 전략은 없고, 날짜만 맞으면 매수매도하는 전략입니다.
예를 들어, 특정 날짜에 A주식을 매도하고 동시에 B주식을 매수하는 전략에서
1. 첫번째 특정날짜 도달시 A 매수(ex. 총예수금의 20%)
2. 두번째 특정날짜 도달시 A 매도하고 동시에 B 매수(예수금 때문에 반드시 매도 먼저 해야 함)
3. 세번째 특정날짜 도달시 B 매도하고 동시에 A 매수 => 특정날짜 도달시마다 반복
4. 특정 시간에 분할 매수매도(EX. 오전 09:00, 10:00, 11:00)기능
(장시작시간이 변경되는 경우가 있으므로 장시작직후, 장시작후 한시간뒤, 두시간뒤로)
5. 매수매도하는 두 종목 모두 1호가잔량이 주문수량보다 2배 이상 많은 경우에만 주문(시장가)
(Ex. 매도1호가잔량 > 매수주문수량X2 and 매수1호가잔량 > 매도주문수량X2)
6. 매도주문이 미체결이면 매수주문을 취소하고 있다가 매도체결과 동시에 매수주문 발생
감사합니다.