예스스탁
예스스탁 답변
2015-07-16 19:30:05
안녕하세요
예스스탁입니다.
아래식 주석을 붙여드립니다.
주석 내용을 참고하셔서 수정보완해 사용하시기 바랍니다.
스팟식은 단지 식작성의 가이드라인입니다.
수식에 게시판 금칙어가 있습니다.
영문 업데이트의 중간에 Up*date와 같이 *이 있으므로
제거하고 사용하셔야 합니다.
var BuyID,BuyNum,Entry,M1,M2,FillVol;
var Vol,Xvol,EntryAct;
var EntryDate,EntryDayCnt,EntryVol,ExitVol,ExPrice,Exit;
//스팟시작시
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
EntryDate = Main.GetUserValue("진입일");
EntryDayCnt = Main.GetUserValue("경과일수");
EntryVol = Main.GetUserValue("진입수량");
ExitVol = Main.GetUserValue("청산수량");
ExPrice = Main.GetUserValue("청산가격");
//내부파일에서 지정한 이름으로 가져온 값이 모두 없으면 entry는 true가 뒤어 당일 진입가능
//값이 있으면(이전일에 진입이 되었다는 의미) 당일 진입하지 않고 청산만 수행
if (EntryDate == "" && EntryDayCnt == "" && EntryVol == "" && ExitVol =="" && ExPrice == "")
Entry = true;
else
Entry = false;
EntryAct = false;//매수진입을 시초가 수신시 한번만 동작하기 위한 변수
Exit = false;//매수진이후 다음날 부터 청산을 하루에 한번만 동작하기 위한 변수
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
if (lUp*dateID == 20001)//*제거
{
//Entry가 True이면 2개 데이터 시가 모두 수신될때 한번만 동작
if (EntryAct == false && Entry == true && MarketData1.open > 0 && MarketData1.open > 0)
{
EntryAct = true;
//기아차 잔고셋팅
Account1.SetBalanceItem(MarketData2.code,0);
//기아차에 대한 잔고가 없을 때만
//현대차는 전일고가보다 아래서 시가가 시작하고
//기아차는 전일저가보다 위에서 시가를 시작하고
//다우지누는 종가하락하면
//시장가로 1억원치 매수
if (Account1.Balance.count == 0 &&
MarketData1.open < MarketData1.GetPrevHigh(1) &&
MarketData2.open > MarketData2.GetPrevLow(1) &&
MarketData3.GetPrevClose(1) < MarketData3.GetPrevClose(2))
{
//1억
var VV = 100000000;
//1억에 대한 수량
Vol = Math.floor(VV/MarketData2.current);
//매수주문(주문후 아이디를 BuyID에 저장)
BuyID = Account1.OrderBuy(MarketData2.code,Vol,0,1)
//체결수량 합산할 변수(초기값 0)
FillVol = 0;
}
}
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
//Entry false이고 기아차 시초가 수신되고 오늘 날자가 저장된 EntryDate보다 크거 경과일수가 2일이내이면
if (Entry == false && MarketData1.open > 0 && Exit == false && YYYYMMDD > EntryDate && EntryDayCnt < 2)
{
Exit = true;
//기아차 잔고셋팅
Account1.SetBalanceItem(MarketData2.code,0);
//잔고수량이 진입수량과 같음(일부라도 청산이 되지 않고 아직 남아있을 경우)
if (Account1.Balance.count == EntryVol )
{
//절반 매도주문(체결가격+10%)
Account1.OrderSell(MarketData2.code, ExitVol, ExitPrice, 0);
//예스스팟의 변수는 휘발성입니다.
//재적용 하면 사라지므로 필요한 값이 있으면
//내부파일에 적어두어야 합니다.
Main.SetUserValue("진입일",YYYYMMDD);//오늘이므로 0으로 지정
Main.SetUserValue("경과일수",EntryDayCnt+1);//경과일수 1증가 지정
Main.SetUserValue("진입수량",Account1.Balance.count)
Main.SetUserValue("청산수량",XVol);
Main.SetUserValue("청산가격",Xprice);
}
}
//Entry false이고 기아차 시초가 수신되고 오늘 날자가 저장된 EntryDate보다 크면 경과일수가 2이고(3일째되는날)이고 14시30분 이후이면
//시장가로 전량 청산
if (Entry == false && MarketData1.open > 0 && Exit == false && YYYYMMDD > EntryDate && EntryDayCnt == 2 && MarketData2.time >= 1430000000)
{
Exit = true;
//기아차 잔고셋팅
Account1.SetBalanceItem(MarketData2.code,0);
//잔고수량이 진입수량과 같음(일부라도 청산이 되지 않고 아직 남아있을 경우)
if (Account1.Balance.count == EntryVol )
{
//절반 매도주문(체결가격+10%)
Account1.OrderSell(MarketData2.code, Account1.Balance.count, 0,1);
//내부저장 변수의 값을 모두 공란으로 만
Main.SetUserValue("진입일","");
Main.SetUserValue("경과일수","");
Main.SetUserValue("진입수량","")
Main.SetUserValue("청산수량","");
Main.SetUserValue("청산가격","");
}
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문응답 수신되면
if (BuyID == OrderResponse.orderID)
{
//주문번호 저장
BuyNum = OrderResponse.orderNum;
}
}
//체결응답
function Main_OnNotifyFill(NotifyFill)
{
//저장한 주문번호와 같은 주문번호의 체결이 들어오면
if (BuyNum == NotifyFill.orderNum)
{
//FillVol에 체결수량 누적
FillVol = FillVol+NotifyFill.count;
//진입수량 전량체결되면
if (FillVol == Vol)
{
Main.SetTimer(1, 5000);
//5초 타이머(체결후 잔고가 갱신되는 시차가 있으므로 넉넉히 5초뒤에 매도 주문하게 작성했습니다.
}
}
}
//타이머 작동
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
//기아차 잔고셋팅
Account1.SetBalanceItem(MarketData2.code,0);
//청산할 수량(잔고의 50%)
var XVol = Math.floor(Account1.Balance.count*0.5)
//주문가격계산(스팟에서는 평단가*1.10으로 하면 주문에러입니다.)
//호가까지 감안해서 호가가격에 맞는 값을 도출해 지정해야 합니다.
//평단가+10%의 가격을 1틱값으로 나누어 몇틱인지 계산해 정수값만 취하고
//해당 값에 다시 1틱값을 곱해 값 계산
var Xprice = Math.floor(Math.floor(Account1.Balance.avgUnitCost *1.10/MarketData2.GetTickSize())*MarketData2.GetTickSize(dPrice));
//절반 매도주문(체결가격+10%)
Account1.OrderSell(MarketData2.code, Xvol, Xprice, 0);
//예스스팟의 변수는 휘발성입니다.
//재적용 하면 사라지므로 필요한 값이 있으면
//내부파일에 적어두어야 합니다.
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
Main.SetUserValue("진입일",YYYYMMDD);//오늘이므로 0으로 지정
Main.SetUserValue("경과일수",0);//오늘이므로 0으로 지정
Main.SetUserValue("진입수량",Account1.Balance.count)
Main.SetUserValue("청산수량",XVol);
Main.SetUserValue("청산가격",Xprice);
}
}
즐거운 하루되세요
> 행복한가방 님이 쓴 글입니다.
> 제목 : 행복; 수식 작성 바랍니다
> 한국의 금융산업 발전을 위해 불철주야 애쓰시는 귀하의 노고를 높이 평가합니다
수식 작성 바랍니다
<< 진입조건 >>
- 주기; 틱
- data1; 기아차
- data2; 현대차
- data3; 미국 다우지수
< 매수 >
- 새벽에 마감한 미국 다우지수가 하락하고
- 현대차의 시가가 전일 고가보다 낮고
- 기아차의 시가가 전일 저가보다 높으면
- 즉시, 기아차의 시가에 1억원어치 매수 주문
< 매도 >
- 매수 체결이 되었다면
- 체결과 동시에 체결 수량의 50%를 +10%에 매도 주문을 낸 후
- 매도 체결이 되지 않으면 1일 후 다시 +10%에 매도 주문을 낸 후
- 매도 체결이 되지 않으면 2일 후 다시 +10%에 매도 주문을 낸 후
- 매도 체결이 되지 않으면 3일 후 종가에 전량 매도 주문
수고하십시요^^