예스스탁
예스스탁 답변
2014-06-17 10:36:11
안녕하세요
예스스탁입니다.
1.
포지션에 대한 청산 주문을 내실때
잔고의 포지션과 동일한 종목의 미체결 내역이 없는지 확인 후 주문하게
코딩하시면 됩니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
매수포지션에 대한 청산조건이 2개라고 가정하고
특정이벤트에서 청산조건이 만족하면 포지션의 잔고가 있는지 확인 하고
잔고가 있으면 해당 종목에 대한 발생시킬주문(매수포지션청산이므로 매도주문)과
같은 주문이 있는지 확인 후 없으면 주문을 내게 됩니다.
function 이벤트
{
if (매수청산조건1)
{
//해당종목에 대해 잔고셋팅
Account1.SetBalanceItem(매수종목코드,0);
//잔고의 수량이 1개 이상이면
if (Account1.Balance.count >= 1)
{
//전체 미체결 주문 중에 동일종목에 대한 매도주문이 있는지 확인
var num = Account1.GetTheNumberOfUnfills()
var unfillcnt = 0;
for(var i = 0; i <= num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count >= 1 && Account1.Unfill.orderKind == 1)
{
unfillcnt = unfillcnt+1;
}
}
//없으면 매도주문 실행
if (unfillcnt == 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
if (매수청산조건2)
{
//해당종목에 대해 잔고셋팅
Account1.SetBalanceItem(매수종목코드,0);
//잔고의 수량이 1개 이상이면
if (Account1.Balance.count >= 1)
{
//전체 미체결 주문 중에 동일종목에 대한 매도주문이 있는지 확인
var num = Account1.GetTheNumberOfUnfills()
var unfillcnt = 0;
for(var i = 0; i <= num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count >= 1 && Account1.Unfill.orderKind == 1)
{
unfillcnt = unfillcnt+1;
}
}
//없으면 매도주문 실행
if (unfillcnt == 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
2.
스팟은 발생되는 신호가 당일 처음발생한 신호인지를 알수가 없습니다.
아래 내용은 단순 스팟 적용 후에
진입신호발생을 카운트 해서 +-1%이상 갭이 발생상황이면
두번째 부터 신호가 발생하게 작성했습니다.
function Main_OnStart()
{
SignalCount = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
SignalCount = SignalCount+1;
if ((MarketData1.open >= MarketData1.prevClose*1.01 || MarketData1.open <= MarketData1.prevClose*0.99) && SignalCount >= 2)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
if (MarketData1.open < MarketData1.prevClose*1.01 && MarketData1.open >= MarketData1.prevClose*0.99)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 2)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 3)
{
SignalCount = SignalCount+1;
if ((MarketData1.open >= MarketData1.prevClose*1.01 || MarketData1.open <= MarketData1.prevClose*0.99) && SignalCount >= 2)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
if (MarketData1.open < MarketData1.prevClose*1.01 && MarketData1.open >= MarketData1.prevClose*0.99)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
}
해당 내용 제어하는 가장 좋은 방법은
예스랭귀지로 작성한 시스템식에서
당일 첫신호에 대해 갭발생시와 아닐때 이름을 다르게 지정하고
예스스팟에서는 그 이름을 이용해 주무을 제어하게 해야 합니다.
시스템을 늦게 걸어 이미 첫신호가 발생된 상황이나
인터넷단절 등 기타이유로 재접속 하실때도 대비하실 수 있습니다.
위 내용이 아니면 위 식은 단순 스팟 적용후에 첫신호일때 주문을 생략하게 됩니다.
예스랭귀지에서 첫진입신호에 대한 갭여부에 따른 이름은 아래와 같이 처리하시면 됩니다.
var : cnt(0),count(0);
count = 0;
for cnt = 0 to 20{
if sdate == EntryDate(cnt) Then
count = count+1;
}
if count == 0 Then{
if 매수조건 Then
if abs(DayClose(1)-DayOpen) < 1 Then
buy("B");
Else
buy("GapB");
}
if 매도조건 Then{
if abs(DayClose(1)-DayOpen) < 1 Then
sell("S");
Else
sell("GapS");
}
}
if count >= 1 Then{
if 매수조건 Then
buy("Buy");
if 매도조건 Then
sell("Sell");
}
위와 같이 시스템을 수정하셨다면 아래 스팟식 사용하시면 됩니다.
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 && Signal.name != "GapB")
{
Main.MessageList(Signal.name);
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 2)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 3 && Signal.name != "GapS")
{
Main.MessageList(Signal.name);
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
if (Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0, 1);
}
}
즐거운 하루되세요
> 지나리 님이 쓴 글입니다.
> 제목 : 질문드립니다.
> 예스스팟으로 옵션매수거래를 하고 있는데 두 가지 질문사항이 있습니다.
1. 만약 청산조건이 두 가지가 있는데... 이게 두가지가 동시에 충족되는 경우..
계좌에 보유하고 있는 옵션을 청산하고 매도포지션까지 들어가게 되는 상황이 발생하는 거 같은데
ordersell명령을 할 때 신규매도는 금지하게 할수 있는 방법이 있을까요?(즉 매수한 옵션을 청산만 하고 신규매도는 못하도록)
2. "전일 종가 대비 당일 시가가 1%이상 갭상승 또는 갭하락하는 경우 해당 챠트의 첫번째 신호는 무시한다"
를 수식으로 전환가능할까요?
감사합니다.