커뮤니티
시초가기준 등가옵션에 대하여
2016-12-08 12:51:01
184
글번호 104779
안녕하세요..
연결선물 기준으로 시초가 생성시 등가옵션을 구하고 그 차트를 생성할수있도록 종목선택-->
참조목록에 표시하게 할수는 없을까요?..지금은 전일종가 기준으로 atm이 설정되어 있는듯 해서요..
원하는 종목은 시초가기준 콜풋atm..그리고 콜풋atm-1 , 콜풋atm+1 입니다..
꾸준히 검색해보니 예스스팟Q&A에 아래와 같은 식이 있더군요..혹시나 방법이 있을까 해서요..
부탁드립니다...
---------------------------------------------------------------
> 파문일기 님이 쓴 글입니다.
> 제목 : 시초가기준 등가옵션에서
> 안녕하세요
1. 연결선물 기준으로 시초가 생성시 등가옵션을 구하고,
양옵션의 위아래 행사가 2개씩 포함 콜 5개 풋 5개의 옵션으로 확장챠트를 만듭니다.
2-11번까지의 옵션참조데이타는 일봉을 포함한 종목생성을 한후에
2. 양옵션의 행사가 중심으로 최근 5일전까지의 전일 고가저가를 비교한후,
콜일봉고가와 풋일봉고가가 0.2 이내에 근접한경우 이의 수치를 구하고
일봉저가의 경우도 마찬가지로 수치를 구하고 싶습니다.
-->
3. 가장 최근의 것부터 순서대로 수치를 구하고 싶습니다.
----------------------------------------
1. 시초가기준 등가옵션을 위아래 하나씩 확장챠트로 구성, 6개의 참조데이타
2. 최근 6일까지의 전일고가저가 기준으로 양옵션을 비교 --- 요 단계가 맞는지, 않맞는지..
3. 서로 근접한 수치를 최근것부터 구함.
var Start;
var CallATM; var PutATM;
var Nth = 1;
var CallObject; var PutObject;
var OrderCode;
var MarketData1;
var CallHigh = new Array(300);
var CallLow = new Array(300);
var PutHigh = new Array(300);
var PutLow = new Array(300);
var HHPrice = new Array(100);
var LLPrice = new Array(100);
var ItemObject = new Array(100);//갯수
var CallItem = new Array(100);//갯수
var PutItem = new Array(100);//갯수
var CoPutItem = new Array(100);//갯수
//function Main_OnStart()
{
Start = 0;
Nth = 1;
//날자 및 시계계산
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//코스피200선물에 가장 가까운 콜/풋 종목 선정
var var1 = MarketData1.open;//current;//expectedPrice
var var2 = parseInt(var1/10)*10;
var var3 = var1%10;
var ATM = -1;
if (var3 >= 8.75)
ATM = var2+10;
else if (var3 < 8.75 && var3 >= 6.25)
ATM = var2+7.5;
else if (var3 < 6.25 && var3 >= 3.75)
ATM = var2+5.0;
else if (var3 < 3.75 && var3 >= 1.25)
ATM = var2+2.5;
else
ATM = var2+0.0;
if (Start == 0 && HHMMSS >= 090000 )
{
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//CallATM = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetExercisePrice(0, i) == ATM)
{
//CallATM = Option.GetATMCallRecent(i+2,0);
CallATM1 = Option.GetATMCallRecent(i+1,0);
CallATM2 = Option.GetATMCallRecent(i,0);
CallATM3 = Option.GetATMCallRecent(i-1,0);
//CallATM4 = Option.GetATMCallRecent(i-2,0);
}
}
//PutATM = -1;
for (var i = -UNum; i <= LNum; i++)
{
if (Option.GetExercisePrice(1, i) == ATM)
{
//PutATM = Option.GetATMPutRecent(i-2,0);
PutATM1 = Option.GetATMPutRecent(i-1,0);
PutATM2 = Option.GetATMPutRecent(i,0);
PutATM3 = Option.GetATMPutRecent(i+1,0);
//PutATM4 = Option.GetATMPutRecent(i+2,0);
}
}
Main.MessageList("콜ATM :",CallATM2 ,"풋ATM :",PutATM2);
//확장 차트객체 요청
var ChartSet3 = new ReqChartItem("00000000",1, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//시스템 설정
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,1, 10000000,1, // 자산
0.003, 0.003,CALCMETHOD_PERCENT, // 진입/청산 수수료
0.05, 0.05,CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
1000, //1000, // 최대진입수량
10); // 최대진입횟수
var SystemSet3 = new SystemInfo("OpFuture",YL_TYPE_NORMAL,null,TradeSet,null);
//참조데이터 추가
//var R31 = new ReqChartItem(CallATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R31 = new ReqChartItem(CallATM1, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R32 = new ReqChartItem(CallATM2, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R33 = new ReqChartItem(CallATM3, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R35 = new ReqChartItem(CallATM4, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R36 = new ReqChartItem(PutATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R34 = new ReqChartItem(PutATM1, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R35 = new ReqChartItem(PutATM2, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R36 = new ReqChartItem(PutATM3, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R40 = new ReqChartItem(PutATM4, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet3 = new Array(R31,R32,R33,R34,R35,R36);
//지정한 설정으로 챠트 생성을 요청
Main.ReqChartEx(ChartSet3,SystemSet3,null,ReferDataSet3);
}
}
//요청한 차트객체 생성이 완료되면
function Main_OnRcvChartEx(ChartEx)
{
if ( ChartEx.GetCode(1) == MarketData1.code)
{
ChartEx3 = ChartEx;
Start = 1;
OrderCode = Main.GetOrderCode(MarketData1.code);
if (ChartEx3.GetCode(3) == CallATM2 && ChartEx3.GetCode(6) == PutATM2)
{
for (var i = 2; i < 8; i++)
{
Main.ReqMarketData(ChartEx3.GetCode(i),7,0);//CallItem =
}
}
}
}
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목수신",MarketData.code);
Nth = Nth +1;
if (MarketData.code == ChartEx3.GetCode(Nth))
{
Main.MessageList(Nth,"번째","생성완료 : ",ChartEx3.GetCode(Nth));
ItemObject[Nth] = MarketData;
}
{
if (ItemObject[Nth] == MarketData && Nth < 5)
{
CallItem[Nth] = ItemObject[Nth];
}
if (ItemObject[Nth] == MarketData && Nth >= 5)
{
PutItem[Nth-3] = ItemObject[Nth];
}
}
for (var j = 1; j <= 6; j++)
{
if (CallItem == MarketData && PutItem == MarketData)
{
for (var i = 2; i <= 4; i++)
{
CallHigh[i,j] = CallItem[i].GetPrevHigh(j);
CallLow[i,j] = CallItem[i].GetPrevLow(j);
PutHigh[i,j] = PutItem[i].GetPrevHigh(j);
PutLow[i,j] = PutItem[i].GetPrevLow(j);
}
}
{
Main.MessageList("종완료 : ",CallHigh[i,j],CallLow[i,j],PutHigh[i,j],PutLow[i,j]);
if (Math.abs(CallHigh[i,j]-PutHigh[i,j]) <= 0.2 && CallHigh[i,j] >= PutHigh[i,j])
{
HHPrice[i,j] = CallHigh[i,j];
}
else if (Math.abs(CallHigh[i,j]-PutHigh[i,j]) <= 0.2 && CallHigh[i,j] < PutHigh[i,j])
{
HHPrice[i,j] = PutHigh[i,j];
}
if (Math.abs(CallLow[i,j]-PutLow[i,j]) <= 0.2 && CallLow[i,j] >= PutLow[i,j])
{
LLPrice[i,j] = CallLow[i,j];
}
else if (Math.abs(CallLow[i,j]-PutLow[i,j]) <= 0.2 && CallLow[i,j] < PutLow[i,j])
{
LLPrice[i,j] = PutLow[i,j];
}
}
}
Main.MessageList("고저가 :",HHPrice[i,j],LLPrice[i,j]);
}
답변 1
예스스탁 예스스탁 답변
2016-12-08 15:24:04
안녕하세요
예스스탁입니다.
1
문의하신 내용은 예스랭귀지 수식으로는 가능한 부분이 아닙니다.
예스랭귀지에서는 수식안에서 차트데이터 컨트롤이 되지 않습니다.
사용자분이 생성한 차트에 데이터를 이용해 계산만 하게 됩니다.
데이터로 제공되는 연결ATM데이터는 전일종가기준으로 제공됩니다.
차트에 시가기준 연결ATM은 전략실행에서 제공되지 않는 데이터로
해당 데이터로 띄우게 할수는 없습니다.
2
예스스팟으로 전략을 구현하신다면 해당 내용 가능합니다.
예스스팟에서는 스팟 수식내에서 객체로 이용하기 위해
차트객체를 생성할수 있습니다.
다만 이 차트객체는 외부에서 이용하는 것이 아닌 스팟안에서
내부적으로 생성되어 이용할수 있는 차트객체입니다.
올려주신 스팟스식은
그날 그날 당일 시초가를 기준으로 ATM 행사가를 계산해
해당 행사가의 콜폿종목을 띄우는 수식입니다.
스팟에서 참조데이터로도 데이터 지정해 차트 구성하게도 가능합니다.
즐거운 하루되세요
> 금여록 님이 쓴 글입니다.
> 제목 : 시초가기준 등가옵션에 대하여
> 안녕하세요..
연결선물 기준으로 시초가 생성시 등가옵션을 구하고 그 차트를 생성할수있도록 종목선택-->
참조목록에 표시하게 할수는 없을까요?..지금은 전일종가 기준으로 atm이 설정되어 있는듯 해서요..
원하는 종목은 시초가기준 콜풋atm..그리고 콜풋atm-1 , 콜풋atm+1 입니다..
꾸준히 검색해보니 예스스팟Q&A에 아래와 같은 식이 있더군요..혹시나 방법이 있을까 해서요..
부탁드립니다...
---------------------------------------------------------------
> 파문일기 님이 쓴 글입니다.
> 제목 : 시초가기준 등가옵션에서
> 안녕하세요
1. 연결선물 기준으로 시초가 생성시 등가옵션을 구하고,
양옵션의 위아래 행사가 2개씩 포함 콜 5개 풋 5개의 옵션으로 확장챠트를 만듭니다.
2-11번까지의 옵션참조데이타는 일봉을 포함한 종목생성을 한후에
2. 양옵션의 행사가 중심으로 최근 5일전까지의 전일 고가저가를 비교한후,
콜일봉고가와 풋일봉고가가 0.2 이내에 근접한경우 이의 수치를 구하고
일봉저가의 경우도 마찬가지로 수치를 구하고 싶습니다.
-->
3. 가장 최근의 것부터 순서대로 수치를 구하고 싶습니다.
----------------------------------------
1. 시초가기준 등가옵션을 위아래 하나씩 확장챠트로 구성, 6개의 참조데이타
2. 최근 6일까지의 전일고가저가 기준으로 양옵션을 비교 --- 요 단계가 맞는지, 않맞는지..
3. 서로 근접한 수치를 최근것부터 구함.
var Start;
var CallATM; var PutATM;
var Nth = 1;
var CallObject; var PutObject;
var OrderCode;
var MarketData1;
var CallHigh = new Array(300);
var CallLow = new Array(300);
var PutHigh = new Array(300);
var PutLow = new Array(300);
var HHPrice = new Array(100);
var LLPrice = new Array(100);
var ItemObject = new Array(100);//갯수
var CallItem = new Array(100);//갯수
var PutItem = new Array(100);//갯수
var CoPutItem = new Array(100);//갯수
//function Main_OnStart()
{
Start = 0;
Nth = 1;
//날자 및 시계계산
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//코스피200선물에 가장 가까운 콜/풋 종목 선정
var var1 = MarketData1.open;//current;//expectedPrice
var var2 = parseInt(var1/10)*10;
var var3 = var1%10;
var ATM = -1;
if (var3 >= 8.75)
ATM = var2+10;
else if (var3 < 8.75 && var3 >= 6.25)
ATM = var2+7.5;
else if (var3 < 6.25 && var3 >= 3.75)
ATM = var2+5.0;
else if (var3 < 3.75 && var3 >= 1.25)
ATM = var2+2.5;
else
ATM = var2+0.0;
if (Start == 0 && HHMMSS >= 090000 )
{
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//CallATM = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetExercisePrice(0, i) == ATM)
{
//CallATM = Option.GetATMCallRecent(i+2,0);
CallATM1 = Option.GetATMCallRecent(i+1,0);
CallATM2 = Option.GetATMCallRecent(i,0);
CallATM3 = Option.GetATMCallRecent(i-1,0);
//CallATM4 = Option.GetATMCallRecent(i-2,0);
}
}
//PutATM = -1;
for (var i = -UNum; i <= LNum; i++)
{
if (Option.GetExercisePrice(1, i) == ATM)
{
//PutATM = Option.GetATMPutRecent(i-2,0);
PutATM1 = Option.GetATMPutRecent(i-1,0);
PutATM2 = Option.GetATMPutRecent(i,0);
PutATM3 = Option.GetATMPutRecent(i+1,0);
//PutATM4 = Option.GetATMPutRecent(i+2,0);
}
}
Main.MessageList("콜ATM :",CallATM2 ,"풋ATM :",PutATM2);
//확장 차트객체 요청
var ChartSet3 = new ReqChartItem("00000000",1, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//시스템 설정
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,1, 10000000,1, // 자산
0.003, 0.003,CALCMETHOD_PERCENT, // 진입/청산 수수료
0.05, 0.05,CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
1000, //1000, // 최대진입수량
10); // 최대진입횟수
var SystemSet3 = new SystemInfo("OpFuture",YL_TYPE_NORMAL,null,TradeSet,null);
//참조데이터 추가
//var R31 = new ReqChartItem(CallATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R31 = new ReqChartItem(CallATM1, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R32 = new ReqChartItem(CallATM2, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R33 = new ReqChartItem(CallATM3, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R35 = new ReqChartItem(CallATM4, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R36 = new ReqChartItem(PutATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R34 = new ReqChartItem(PutATM1, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R35 = new ReqChartItem(PutATM2, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R36 = new ReqChartItem(PutATM3, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
//var R40 = new ReqChartItem(PutATM4, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet3 = new Array(R31,R32,R33,R34,R35,R36);
//지정한 설정으로 챠트 생성을 요청
Main.ReqChartEx(ChartSet3,SystemSet3,null,ReferDataSet3);
}
}
//요청한 차트객체 생성이 완료되면
function Main_OnRcvChartEx(ChartEx)
{
if ( ChartEx.GetCode(1) == MarketData1.code)
{
ChartEx3 = ChartEx;
Start = 1;
OrderCode = Main.GetOrderCode(MarketData1.code);
if (ChartEx3.GetCode(3) == CallATM2 && ChartEx3.GetCode(6) == PutATM2)
{
for (var i = 2; i < 8; i++)
{
Main.ReqMarketData(ChartEx3.GetCode(i),7,0);//CallItem =
}
}
}
}
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목수신",MarketData.code);
Nth = Nth +1;
if (MarketData.code == ChartEx3.GetCode(Nth))
{
Main.MessageList(Nth,"번째","생성완료 : ",ChartEx3.GetCode(Nth));
ItemObject[Nth] = MarketData;
}
{
if (ItemObject[Nth] == MarketData && Nth < 5)
{
CallItem[Nth] = ItemObject[Nth];
}
if (ItemObject[Nth] == MarketData && Nth >= 5)
{
PutItem[Nth-3] = ItemObject[Nth];
}
}
for (var j = 1; j <= 6; j++)
{
if (CallItem == MarketData && PutItem == MarketData)
{
for (var i = 2; i <= 4; i++)
{
CallHigh[i,j] = CallItem[i].GetPrevHigh(j);
CallLow[i,j] = CallItem[i].GetPrevLow(j);
PutHigh[i,j] = PutItem[i].GetPrevHigh(j);
PutLow[i,j] = PutItem[i].GetPrevLow(j);
}
}
{
Main.MessageList("종완료 : ",CallHigh[i,j],CallLow[i,j],PutHigh[i,j],PutLow[i,j]);
if (Math.abs(CallHigh[i,j]-PutHigh[i,j]) <= 0.2 && CallHigh[i,j] >= PutHigh[i,j])
{
HHPrice[i,j] = CallHigh[i,j];
}
else if (Math.abs(CallHigh[i,j]-PutHigh[i,j]) <= 0.2 && CallHigh[i,j] < PutHigh[i,j])
{
HHPrice[i,j] = PutHigh[i,j];
}
if (Math.abs(CallLow[i,j]-PutLow[i,j]) <= 0.2 && CallLow[i,j] >= PutLow[i,j])
{
LLPrice[i,j] = CallLow[i,j];
}
else if (Math.abs(CallLow[i,j]-PutLow[i,j]) <= 0.2 && CallLow[i,j] < PutLow[i,j])
{
LLPrice[i,j] = PutLow[i,j];
}
}
}
Main.MessageList("고저가 :",HHPrice[i,j],LLPrice[i,j]);
}