예스스탁
예스스탁 답변
2014-10-16 18:58:03
안녕하세요
예스스탁입니다.
답변이 늦어 죄송합니다.
식의 주요 흐름은 아래와 같습니다.
스팟이 시작하면
지정된 계좌에서 보유중인 잔고들 확인해서 잔고가 있으면
해당 잔고에 대핸 종목객체를 모두 생성합니다.
종목객체가 모두 생성이 되고
각 종목에 대한 시가가 수신되고 시세 업데이트가 발생하면
해당 종목의 평단가와 시가의 차이값을 구하고 지정한 값(PP)으로
차이값이 몇배인지 계산하고 한배씩 가까워 질때마다 일정수량씩 청산합니다.
모두 청산되면 해당 종목객체는 삭제를 해서 더이상 해당 종목으로
계산을 하지 않게 합니다.
스크립트 객체에는 계좌객체와 외부변수 한개만 설정하시면 됩니다.
계좌객체 - 객체명 Accoun1
외부변수 - 외부변수명 PP, 초기값 0.1, 데이터형 숫자입니다.
예스스팟에 대한 수식답변은 가이드 정도입니다.
수식 작성의 흐름의 이해하시는 용도로 사용하시기 바랍니다.
아래 수식 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
var Start;
var Bnum;
var Tcnt;
var Rcv;
var AvgPrice = [];
var Bcount = [];
var Code = [];
var MKD = [];
var NN = [];
var Pst = [];
function Main_OnStart()
{
Bnum = Account1.GetTheNumberOfBalances();
Main.MessageList(Bnum);
if (Bnum >= 1)
{
Account1.SetBalanceIndex(0);
Main.ReqMarketData(Account1.Balance.code,0,0);
Main.SetTimer(1, 1000);
Tcnt = 0;
Code[Tcnt] = Account1.Balance.code;
AvgPrice[Tcnt] = Account1.Balance.avgUnitCost;
Bcount[Tcnt] = Account1.Balance.count;
NN[Tcnt] = 0;
Pst[Tcnt] = Account1.Balance.position;
Main.MessageList(Tcnt,Code[Tcnt],AvgPrice[Tcnt],Bcount[Tcnt],NN[Tcnt]);
}
Rcv = 0;
}
function Main_OnTimer(nEventID)
{
Tcnt = Tcnt+1;
if (Tcnt == Bnum)
{
Main.KillTimer(1);
}
if (Tcnt < Bnum)
{
Account1.SetBalanceIndex(Tcnt);
Main.ReqMarketData(Account1.Balance.code,0,0);
Code[Tcnt] = Account1.Balance.code;
AvgPrice[Tcnt] = Account1.Balance.avgUnitCost;
Bcount[Tcnt] = Account1.Balance.count;
NN[Tcnt] = 1;
Main.MessageList(Tcnt,Code[Tcnt],AvgPrice[Tcnt],Bcount[Tcnt],NN[Tcnt]);
}
}
function Main_OnRcvMarketData(MarketData)
{
MKD[Rcv] = MarketData;
Rcv = Rcv+1;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) /*제거
{
//보유종목수가 1개 이상이고 시세업데이트가 발생하면
if (lUp*dateID == 20001 && Rcv == Bnum && Bnum >= 1) /*제거
{
//배열변수에 값이 입력한 수 만큼만 루프
for(var i = 0; i < Code.length; i++)
{
//현재업데이트된 종목을 찾고 해당 종목의 시가가 수신됬고 시가가 평단가보다 크면
if (sItemCode == Code[i] && MKD[i].open > 0 && MKD[i].open > AvgPrice[i])
{
//시초가와 평단가차이를 PP로 나눠 PP단위의 구간수 계산
var aa = Math.ceil(Math.abs(MKD[i].open - AvgPrice[i])/PP);
//구간이 1이상이고 시가대비 현재가가 한구간씩 근접할때만다
if (aa >= 1 && MKD[i].current <= MKD[i].open-PP*NN[i])
{
NN[i] = NN[i]+1;
//매도포지션이면 청산(매수주문)
if (Pcnt[i] == 1)
Account1.OrderBuy(Code[i],Math.floor(Bcount[i]/aa) ,MKD[i].Ask(1),1);
//매수포지션이면 청산(매도주문)
if (Pcnt[i] == 2)
Account1.OrderSell(Code[i],Math.floor(Bcount[i]/aa),MKD[i].Bid(1),1);
}
}
if (sItemCode == Code[i] && MKD[i].open > 0 && MKD[i].open < AvgPrice[i])
{
//시초가와 평단가차이를 PP로 나눠 PP단위의 구간수 계산
var aa = Math.ceil(Math.abs(MKD[i].open - AvgPrice[i])/PP);
//구간이 1이상이고 시가대비 현재가가 한구간씩 근접할때만다
if (aa >= 1 && MKD[i].current >= MKD[i].open+PP*NN[i])
{
NN[i] = NN[i]+1;
//매도포지션이면 청산(매수주문)
if (Pcnt[i] == 1)
Account1.OrderBuy(Code[i],Math.floor(Bcount[i]/aa) ,MKD[i].Ask(1),1);
//매수포지션이면 청산(매도주문)
if (Pcnt[i] == 2)
Account1.OrderSell(Code[i],Math.floor(Bcount[i]/aa),MKD[i].Bid(1),1);
}
}
}
}
}
//계좌에서 특정종목이 모두 청산되면 해당 종목객체 삭제
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //* 제거
{
if (Account1.number == sAccntNum && Rcv == Bnum && Bnum >= 1 && lUp*dateID == 30003)//*제거
{
for(var i = 0; i < Code.length; i++)
{
if (sItemCode == Code[i])
{
Main.RemoveMarketData(MKD[i]);
}
}
}
}
즐거운 하루되세요
> 음양조파 님이 쓴 글입니다.
> 제목 : 시스템식 부탁드립니다.
> 안녕하세요?
예스스팟으로 시스템식 좀 부탁드립니다.
아침에 장이 시작하면 원장에서 잔고를 확인하여
잔고가 있다면 그 계약수와 시가에서 잔고 평균가와의 가격차를 구한 다음
시가에서 평균가와 일정가격(사용시 입력하는 변수)씩 가까워질 때마다
평균가에 이르면 전체 계약 잔고가 청산되도록
동일한 수량씩 청산
잔고가 매도든 매수든 모두 적용할 수 있도록 하고 싶습니다.