답변완료
수식 문의 드립니다.
코스피200 선물가격을 참조하여 해당월물 ATM 콜,풋을 매도 후 헷지해 나가는 경우입니다.
자세한 사항은 아래 참조 부탁드립니다.
- 진입: 옵션 만기 다음날인 금요일 오전 9시 1분에 코스피200선물 가격에서 가장 가까운 ATM Call,Put X계약씩 매도
(매도 가능 계약수는 Input: Y(비율= 매도증거금/예탁금)을 설정해 예를 들어 Y=25(%)이면 예탁금의 25% 내에서
최초로 매도 가능한 ATM Call,Put 계약수 대로 매도 되도록 코딩, 매도 가능 계약수 산정은 최초 매도 진입에만 적용)
- 포지션 진입 후, 포지션 델타가 +/- 1 초과 여부 체크해 가면서,
1. 포지션 델타가 1 이상 도달 시, 도달 시점의 코스피200 선물가에 가장 가까운 ATM Put 1계약 매수, Call 1계약 매도
(델타헷징 후 당일 델타가 다시 1 이상 도달 시, 같은 방법으로 ATM Put 1계약 매수, Call 1계약 매도)
코스피200선물 시가 갭하락으로 포지션 델타가 (예를 들면) 1.5 근처에서 장시작시, ATM Put 2계약 매수, Call 1계약 매도
(같은 방식으로 포지션 델타가 2.4 가 되면 (0.5 단위 반올림하면 2.5가 되므로) ATM Put 3계약 매수, Call 2계약 매도
2. 포지션 델타가 -1 이하 도달 시, 도달 시점의 코스피200 선물가에 가장 가까운 ATM Call 1계약 매수, Put 1계약 매도
(델타헷징 후 당일 델타가 다시 -1 이하 도달 시, 같은 방법으로 ATM Call 1계약 매수, Put 1계약 매도
코스피200선물 시가 갭상승으로 포지션 델타가 (예를 들면) -1.5 근처에서 장시작시, ATM Call 2계약 매수, Put 1계약 매도
(같은 방식으로 포지션 델타가 -2.4 가 되면 (0.5 단위 반올림하면 -2.5가 되므로) ATM Call 3계약 매수, Put 2계약 매도
- 청산: 진입월물의 만기 2일 전인 화요일 오후 3시에 포지션 일괄 청산
항상 감사드립니다.
2014-01-15
1071
글번호 222780
답변완료
옵션매매 추가문의
수고하십니다.
아래 791번에 질문올렸는데요. 답변감사드리며 2가지 질문 더 드립니다.
1. 답변주신 내용에 1,2번 Timer설정시 if (BT == 1 && Replace1 == 0)이라는 조건문이
왜 들어가는지 궁금합니다. 3, 4번 Timer는 그런 조건문을 안 넣으셨는데요.
2. 아래식에서 현재는 선물청산신호시 모든 옵션도 같이 청산되도록 되어 있는데요.
선물에 손절청산신호(예를 들어 신호명이 LS_Long, LS_Short)가 나오면 옵션은 이후
Trailing Stop으로(옵션은 수익이므로) 수익청산 되도록 로직을 수정시키고 싶습니다.
만약 선물에 Trailing Stop으로 익절신호(예를 들어 신호명이 TS_Long, TS_Short)가
나오면 기존처럼 모든 옵션이 동시에 청산되어야 합니다.
간단히 말씀드리자면 선물손절시 옵션은 T/Stop으로, 선물익절이면 옵션동시청산입니다.
또한 옵션 T/Stop을 YT처럼 ATR T/Stop으로 만들수 있나요? 그게 안되면 최대수익대비하락폭
으로 수정부탁드립니다.
감사합니다.
--------------------------------------
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
var BT; var ST;
var BuySignalCode; var SellSignalCode;
var BuySignalID; var SellSignalID;
var BuySignalNum; var SellSignalNum;
var Replace1; var Replace2;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) < 3.0 )
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i));
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) < 3.0)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii));
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (Signal.signalKind == 1)
{
Start = 1;
if (CC >= PP && CC > -1 && PP > -1)
{
BT = 1;
Replace1 = 0;
BuySignalCode = CallOrderCode;
BuySignalID = Account1.OrderSell(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0);
}
else{
BT = -1;
Replace1 = 0;
BuySignalCode = PutOrderCode;
BuySignalID = Account1.OrderBuy(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0);
}
}
if (Start == 1 && Signal.signalKind == 2)
{
if (BT == 1)
{
Account1.OrderBuy(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0);
}
if (BT == -1)
{
Account1.OrderSell(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0);
}
}
if (Signal.signalKind == 3)
{
Start = 1;
if (CC >= PP && CC > -1 && PP > -1)
{
ST = 1;
Replace2 = 0;
SellSignalCode = CallOrderCode;
SellSignalID = Account1.OrderBuy(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0);
}
else{
ST = -1;
Replace2 = 0;
SellSignalCode = PutOrderCode;
SellSignalID = Account1.OrderSell(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0);
}
}
if (Start == 1 && Signal.signalKind == 4)
{
if (ST == 1)
{
Account1.OrderSell(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0);
}
if (ST == -1)
{
Account1.OrderBuy(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0);
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuySignalID)
{
BuySignalNum = OrderResponse.orderNum;
if (BT == 1 && Replace1 == 0)
{
Main.SetTimer(1, 1000);
Main.SetTimer(2, 3000);
}
}
if (OrderResponse.orderID == SellSignalID)
{
SellSignalNum = OrderResponse.orderNum;
Main.SetTimer(3, 1000);
Main.SetTimer(4, 3000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1 && Replace1 == 0)
{
Replace1 = 1;
Account1.SetUnfillOrderNumber(BuySignalNum);
if (Account1.Unfill.count > 0 && BT == 1)
{
BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,1));
}
if (Account1.Unfill.count > 0 && BT == -1)
{
BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,1));
}
}
if (nEventID == 2 && Replace1 == 1 )
{
Replace1 = 2;
Account1.SetUnfillOrderNumber(BuySignalNum);
if (Account1.Unfill.count > 0 && BT == 1)
{
BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,3));
}
if (Account1.Unfill.count > 0 && BT == -1)
{
BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,3));
}
}
if (nEventID == 3 && Replace2 == 0)
{
Replace2 = 1;
Account1.SetUnfillOrderNumber(SellSignalNum);
if (Account1.Unfill.count > 0 && ST == 1)
{
SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,1));
}
if (Account1.Unfill.count > 0 && ST == -1)
{
SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,1));
}
}
if (nEventID == 4 && Replace2 == 1 )
{
Replace2 = 2;
Account1.SetUnfillOrderNumber(BuySignalNum);
if (Account1.Unfill.count > 0 && ST == 1)
{
SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,3));
}
if (Account1.Unfill.count > 0 && ST == -1)
{
SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,3));
}
}
}
즐거운 하루되세요
> 착한이 님이 쓴 글입니다.
> 제목 : 옵션매수문의
> 수고하십니다. 아래의 내용에 맞게 YesSpot 수식 작성부탁드립니다.
또한 2번 같은 경우 본문의 라인이 길어질 수 있어 사용자함수로 만들어서
사용코자 하는데 가능할지요.
1. 예스트레이더의 선물 진입시 헷지를 위하여 옵션 매수
2. 3.0 이하의 콜옵션과 풋옵션중에 3.0 에 가장 근접하는 콜/풋 종목을 찾고
3. 선물매수신호 -> 그 종목이 콜이면 콜매도, 풋이면 풋매수, 선물매수청산신호 -> 옵션청산
4. 선물매도신호 -> 그 종목이 콜이면 콜매수, 풋이면 풋매도, 선물매도청산신호 -> 옵션청산
5. 옵션매수는 매수1호가에 지정가주문, 미체결시 1초후 매도1호가주문,
미체결시 3초후 매도3호가 주문
감사합니다.
2014-01-07
1022
글번호 222764