예스스탁
예스스탁 답변
2016-07-13 14:57:45
안녕하세요
예스스탁입니다.
올려주신 식은 차트에서 신호가 발생하면
그때 지정한 조건의 콜/풋을 찾아 주문을 내게 됩니다.
9시 1분에는 어떤 종목에 대해 주문이 나갈지 알수가 없어
그때 양합저장활수는 없습니다.
신호가 발생하면
선택되는 종목들의 시초가를 합해서 현재가와 +인지 -인지로 판단하게 작성했습니다.
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
T = 1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
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 = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
//시초가합
var sum = Option.GetOpen(CallOrderCode)+ Option.GetOpen(PutOrderCode);
//시초가합보다 현재가합이 1%이상 크면 콜매수
if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) >= sum*1.01)
{
T = 2;
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
}
//시초가합보다 현재가합이 1%이상 작으면 풋매도
if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) <= sum*0.99)
{
T = 3;
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
}
if (T >= 1 && Signal.signalKind == 2)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitLong신호 발생");
T = 0;
if (T == 2)
{
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
}
if (T == 3)
{
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
}
}
if (T >= 0 && Signal.signalKind == 3)
{
T = -1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
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 = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
//시초가합
var sum = Option.GetOpen(CallOrderCode)+ Option.GetOpen(PutOrderCode);
//시초가합보다 현재가합이 1%이상 크면 풋매수
if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) >= sum*1.01)
{
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
T = -2;
}
//시초가합보다 현재가합이 1%이상 작으면 콜매
if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) <= sum*0.99)
{
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
T = -3;
}
}
}
if (T <= -1 && Signal.signalKind == 4)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitShort신호 발생");
T = 0;
if (T == -2)
{
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
}
if (T == -3)
{
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
}
즐거운 하루되세요
> 탄젠트80 님이 쓴 글입니다.
> 제목 : 수식 수정 문의드립니다.
> 안녕하세요 항상 답변에 감사드리고 있습니다.
아래 수식은 선물매수시 스팟에서 콜매수, 풋매도 진입하고 선물매도시 스팟에서 풋매수,콜매도 옵션을 주문하는 합성선물 수식입니다.
이 합성선물 수식을 수정하여 아래와 같은 수식으로 변경하고자 합니다.
주내용은 선물신호발생하여 옵션주문시 당초 양합보다 (+)시에는(양매수장) 옵션매수를 하고 양합 (-)시에는(양매도) 옵션매도 판단하여 주문하는 수식입니다.
ㅁ선물신호 발생 --->(양합이 1% 이상일때) 콜매수 또는 풋매수
ㅁ선물신호 발생 --->(양합이 1% 미만일때) 콜매도 또는 풋매도
최종 합성선물수식은 아니고 방향성 수식이며 선물에서 신호발생시 스팟에서
양합에 따라 매수, 매도를 결정하여 한 종목만 네이키드 진입함
당일 9시1분 등가의 콜과 풋의 종목을 기억하고 콜값, 풋값과 그 양합을 구함
(당일 시초가 등가는 장이 시작되야 알기에 1분으로 함)
선물매수신호가 나오면 9시1분 기억한 종목의 양합을 체크하여 양합이 9시1분보다 1% 이상에 있을때는 콜매수하고 1%보다 낮을때는 풋매도 진입
선물매도신호가 나오면 9시 1분에 기억한 종목의 양합을 체크하여 현재의 양합이 9시1분보다 1% 이상에 있을때는 풋매수, 그렇지 않을때는 콜매도 진입
미리 답변에 감사드립니다. 주신답변 실전에 잘 응용해서 써먹고 있습니다.
아래는 합성선물 수식입니다.
================================================================================
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
T = 1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
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 = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
if (T == 1 && Signal.signalKind == 2)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitLong신호 발생");
T = 0;
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
}
if (T >= 0 && Signal.signalKind == 3)
{
T = -1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
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 = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
}
}
if (T == -1 && Signal.signalKind == 4)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitShort신호 발생");
T = 0;
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
==================================================================================