예스스탁
예스스탁 답변
2014-07-07 18:14:43
안녕하세요
예스스탁입니다.
예스스팟의 답변은 가이드라인일 뿐입니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
var FSxID, FBxID;
var FSxNum, FBxNum;
var OptCode,OptID,OptNum;
function Main_OnStart()
{
Main.SetTimer(1, 5000);//5초 타이머
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//선물 잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Main.MessageList("선물매도손익",(Account1.Balance.avgUnitCost - Account1.Balance.current)*500000);
if ((Account1.Balance.avgUnitCost - Account1.Balance.current)*500000 >= 1000000)
{
//시장가청산
FSxID = Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
Main.KillTimer(1);//타이머종료
}
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Main.MessageList("선물매수손익",(Account1.Balance.current-Account1.Balance.avgUnitCost)*500000);
if ((Account1.Balance.current-Account1.Balance.avgUnitCost)*500000 >= 1000000)
{
//시장가청산
FBxID = Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
Main.KillTimer(1);//타이머종료
}
}
}
if (nEventID == 2)
{
Account1.SetUnfillOrderNumber(OptNum);
if (Account1.Unfill.count > 0)
{
OptID = Account1.OrderReplacePrice(OptNum, Option.GetCurrent(OptCode)+0.05);
}
}
if (nEventID == 3)
{
Account1.SetBalanceItem(OptCode,0)
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Main.MessageList("옵션매수손익",(Account1.Balance.current-Account1.Balance.avgUnitCost)*500000);
if ((Account1.Balance.current-Account1.Balance.avgUnitCost)*500000 <= -1000000)
{
//시장가청산
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
}
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
//선물매도청산주문 주문번호 저장
if (OrderResponse.orderID == FSxID)
{
FSxNum = OrderResponse.orderNum;
}
//선물매수청산주문 주문번호 저장
if (OrderResponse.orderID == FBxID)
{
FBxNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == OptID)
{
OptIDNum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
//선물매도청산이 체결되면
if (NotifyFill.orderNum == FSxNum)
{
//2.0에 가장가까운 풋 종목계산
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var i = -LNum; i <= UNum; i++)
{
if (PutPrice[i+LNum] < PP)
{
PP = PutPrice[i+LNum];
PutOrderCode = PutCode[i+LNum]
}
}
if (PP < 9999999)
{
//주문가능현금에서 가능한 최대수량
OptCode = PutOrderCode;
var Vol = Math.floor(Account1.GetBalanceETCinfo(30)/(Option.GetCurrent(OptCode)*500000));
OptID = Account1.OrderBuy(OptCode, Vol, Option.GetCurrent(OptCode)+0.05, 0);
Main.SetTimer(2, 10000);//10초 타이머 셋팅
}
}
//선물매수청산이 체결되면
if (NotifyFill.orderNum == FBxNum)
{
//2.0에 가장가까운 콜 종목계산
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+UNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+UNum] = Option.GetATMCallRecent(i);
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
if (CC < 9999999)
{
//주문가능현금에서 가능한 최대수량
OptCode = CallOrderCode;
var Vol = Math.floor(Account1.GetBalanceETCinfo(30)/(Option.GetCurrent(OptCode)*500000));
OptID = Account1.OrderBuy(OptCode, Vol, Option.GetCurrent(OptCode)+0.05, 0);
Main.SetTimer(2, 10000);//10초 타이머 셋팅
}
}
//옵션매수주문 체결수신되고
if (NotifyFill.orderNum == OptNum)
{
//미체결이 없으면
Account1.SetUnfillOrderNumber(NotifyFill.orderNum);
if (Account1.Unfill.count == 0)
{
Main.KillTimer(2);//2번 타이머 종료
Main.SetTimer(3);//3번 타이머 시작
}
}
}
즐거운 하루되세요
> 현빈 님이 쓴 글입니다.
> 제목 : 수식문의
> 1.계좌에 선물수익이 50만원이상이면 전량 시장가 청산
2.(선물 체결결과 확인후)
매수에서 이익이었으면 콜(가격이 2.0에가장가까운 것을 찾아서),매도에서 이익이었으면 풋을(가격이 2.0에가장가까운 것을 찾아서) 계좌잔액의 전부(또는 일부를 선택해서) 현재가+5호가로 매수 주문한다.
3.옵션매수 미체결시 다시 +5호가 주문한다.
4.옵션 손실이 100만원이상이면 시장가 청산한다.
위 내용을 하나의 수식안에 작성해주시면 감사하겠습니다.