예스스탁
예스스탁 답변
2013-09-03 15:59:01
안녕하세요
예스스탁입니다.
이전식은 지정한 값 이하의 종목은 9999999값을 주고
전체에서 가장 작은 값을 찾았습니다.
아래 변경된 식은 지정한 값 이상의 종목은 -1값을 주고
전체에서 가장 큰값을 찾게 변경했습니다.
아래식 참고하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이하 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수
if (CC < 9999999)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
//풋매도
if (PP < 9999999)
Account1.OrderSell(PutOrderCode, 1, 0,1);
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이하 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도
if (CC > 0)
Account1.OrderSell(CallOrderCode, 1, 0,1);
//풋매수
if (PP > 0)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}
즐거운 하루되세요
> 곰탈 님이 쓴 글입니다.
> 제목 : 옵션 종목 찾기 (1 이하이면서 가장 가까운 종목)
> 안녕하세요.
아래 예제 식은 프리미엄 1 이상이면서 가장 가까운 종목을 찾는 것인데요, 약간 다르게 1 "이하"이면서 가장 가까운 종목을 찾도록 변경하고 싶습니다. 배열 순서를 바꾸면 될 것 같은데 막상 하려니 잘 안되네요. 도움 주시면 고맙겠습니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수
if (CC < 9999999)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
//풋매도
if (PP < 9999999)
Account1.OrderSell(PutOrderCode, 1, 0,1);
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도
if (CC > 0)
Account1.OrderSell(CallOrderCode, 1, 0,1);
//풋매수
if (PP > 0)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}