예스스탁
예스스탁 답변
2020-09-17 17:17:31
안녕하세요
예스스탁입니다.
1
스팟은 저희가 가이드 정도만 작성해 드립니다.
아래식 참고하셔서 수정보완해 사용하시기 바랍니다.
2
모든 주문은 15시에 처리가 되게 작성되었고
주문되면 30일 뒤에 리벨런싱됩니다.
계좌에는 주문날짜가 없습니다.
Main.SetUserValue, Main.GetUserValue를 이용해
별도로 내부파일에 적어서 이용하게 작성되었습니다.
4
스크립트 객체설정
계좌객체 추가 --> 속성에서 객체명은 Account1, 주문낼 계좌번호지정
종목객체 추가 --> 속성에서 객체명은 MarketData1, A종목으로 지정
종목객체 추가 --> 속성에서 객체명은 MarketData2, B종목으로 지정
var step,TA,M1,M2,V1,V2,D1,D2;
var SID1,SID2;
var SNUM1,SNUM2;
//스팟 첫 실행시
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var JD = dateToJulianNumber(d);
var lastJD = Main.GetUserValue("LastJD");
Main.MessageList(YYYYMMDD," : Spot Start :",JD,lastJD);
if (lastJD == "" || JD >= lastJD+30)
{
Main.MessageList("거래일");
Main.SetTimer(1, 5000);
step = 0;
}
else
{
step = 99;
Main.MessageList("거래일 아님");
}
}
function Main_OnTimer(nEventID)
{
if (step == 0 && nEventID == 1)
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var JD = dateToJulianNumber(d);
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(YYYYMMDD,HHMMSS);
if (HHMMSS >= 150000) //15시가 되면
{
step = 1;
Main.KillTimer(1);
//계좌순자산액
TA = Account1.GetBalanceETCinfo(100);
//계좌순자산의 70%
M1 = TA*0.7;
//계좌순자산의 30%
M2 = TA*0.3;
//MarketData1의 수량*현재가 저장(보유수량이 없으면 0)
Account1.SetBalance(MarketData1.code, 0);
V1 = Account1.Balance.count*MarketData1.current;
//MarketData2의 수량*현재가 저장(보유수량이 없으면 0)
Account1.SetBalance(MarketData2.code, 0);
V2 = Account1.Balance.count*MarketData1.current;
//70%금액과 MarketData1종목 평가금액과의 차
D1 = M1-V1;
//30%금액과 MarketData2종목 평가금액과의 차
D2 = M2-V2;
S1 = false;
if (D1 < 0)
{
var vol1 = Math.floor(Math.abs(D1)/MarketData1.current);
if (vol1 > 0)
{
SID1 = Account1.OrderSell(MarketData1.code,vol1,MarketData1.Bid(5), 0);
}
else
{
S1 = true;
}
}
else
{
S1 = true;
}
S2 = false;
if (D2 < 0)
{
var vol2 = Math.floor(Math.abs(D2)/MarketData2.current);
if (vol2 > 0)
{
SID2 = Account2.OrderSell(MarketData2.code,vol2,MarketData2.Bid(5), 0);
}
else
{
S2 = true;
}
}
else
{
S2 = true;
}
Main.SetTimer(2,1000);
}
}
if (step == 1 && nEventID == 2)
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var JD = dateToJulianNumber(d);
if (S1 == true && S2 == true)
{
step = 2;
Main.KillTimer(2);
if (D1 > 0)
{
var vol1 = Math.floor(Math.abs(D1)/MarketData1.current);
if (vol1 > 0)
{
Account1.OrderBuy(MarketData1.code,vol1,MarketData1.Ask(5), 0);
}
}
if (D2 > 0)
{
var vol2 = Math.floor(Math.abs(D2)/MarketData2.current);
if (vol2 > 0)
{
Account1.OrderBuy(MarketData2.code,vol2,MarketData2.Ask(5), 0);
}
}
Main.SetUserValue("LastJD",JD);
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == SID1)
{
SNUM1 = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SID2)
{
SNUM2 = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == SNUM1)
{
Account1.SetUnfill(SNUM1);
if (Account1.Unfill.count == 0)
{
S1 = true;
}
}
if (NotifyFill.orderNum == SNUM2)
{
Account1.SetUnfill(SNUM2);
if (Account1.Unfill.count == 0)
{
S2 = true;
}
}
}
//날짜를 줄리안데이트로 변경
function dateToJulianNumber(d)
{
var year = d.getFullYear();
var month = d.getMonth()+1;
var day = d.getDate();
var a = Math.floor((14-month)/12);
var y = Math.floor(year+4800-a);
var m = month+12*a-3;
var JDN = day + Math.floor((153*m+2)/5)+(365*y)+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400)-32045;
return JDN;
}
즐거운 하루되세요
> 몬스터 님이 쓴 글입니다.
> 제목 : 포트폴리오 매매
> 안녕하세요.
아래의 포트폴리오 매매 전략이 예스랭귀지나 예스스팟으로 구현 가능한지 검토바랍니다.
제 생각에는 예스랭귀지로는 불가능하고 스팟으로만 가능할 것 같은데요...
1. 계좌 총 평가자산 조회
2. 두종목(A종목과 B종목) 70% : 30% 비율로 매수
3. 특정기간(예: 한달)이후 계좌 총 평가자산 조회 : (A종목x수량)+(B종목x수량)+현금
4. 계좌 총 평가자산을 기초로 다시 두종목에 대한 70% : 30% 비율계산
5. 비율 초가분은 매도 청산하고 비율 부족분은 매수 : 리밸런싱
예를들어,
100을 투자자산으로 A종목 70 / B종목 30 매수 진입이후
한달뒤에 총 평가자산이 110으로 A종목 74 / B종목 36 이 되었을때
B종목 3을 매도 청산하고 A종목 3을 매수하여 A종목 77 / B종목 33 으로 매달 리밸런싱하는 전략입니다.