답변완료
문의 드립니다.
매번 도움을 받고 스팟을 잘 사용하고 있습니다. 감사합니다.
지금 사용하고 있는 수식은 아래와 같습니다. 몇 가지 수정을 좀 했으면 하는데 가능한지요.
(수정하고 싶은 내용은)
선물 진입 신호시 옵션 매도로 진입을 하려고 하는데 증거금이 부족할 때 입니다.
(방법1)
옵션 매도 대신 매수로 진입하는 방법
(방법2)
진입되어 있는 옵션 매도 포지션에서 외가 매수를 해서 증거금을 확보후 옵션 매도로 진입하는 방법입니다.
예) 진입되어 있는 포지션 - 풋 270 매도 1계약
진입하려고 하는 포지션 풋 267 매도 1계약 (하지만 증거금 부족)
증거금 확보를 위해 외가 풋 245 매수 진입 (0.04 ~ 0.07 정도의 외가)
증거금이 학보된 후 풋 267 매도 진입
위와 같이 수식 좀 부탁드립니다.
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++)
{
//값이 1.0 이하이면
if (Option.GetCurrent(0, i) <= Price)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else //값이 1.0 보다 크면
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
//풋종목 찾기
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= Price )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else //값이 1.0 보다 크면
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -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];
}
}
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 (CC > -1)
Account1.OrderBuy(CallOrderCode, CBqt, Option.GetAskByCode(CallOrderCode, 5),0);
//풋매도
if (PP > -1)
Account1.OrderSell(PutOrderCode, PSqt, Option.GetBidByCode(PutOrderCode, 5),0);
}
if (Signal.signalKind == 2 && Start == 1)
{
Account1.SetBalanceItem(CallOrderCode, 0);
if(Account1.Balance.count >0 && Account1.Balance.position==2)
Account1.OrderSell(CallOrderCode, Math.min(Account1.Balance.count, CBqt), Option.GetBidByCode(CallOrderCode, 5), 0);
// Account1.OrderSell(CallOrderCode, CBqt, Option.GetBidByCode(CallOrderCode, 5), 0);
Account1.SetBalanceItem(PutOrderCode, 0);
if(Account1.Balance.count >0 && Account1.Balance.position==1)
Account1.OrderBuy(PutOrderCode, Math.min(Account1.Balance.count, PSqt), Option.GetAskByCode(PutOrderCode, 5), 0);
// Account1.OrderBuy(PutOrderCode, PSqt, Option.GetAskByCode(PutOrderCode, 5), 0);
}
//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) <= Price)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else//값이 1.0보다 크면
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
//풋종목 찾기
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= Price )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else// 값이 1.0보다 크면
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -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]
}
}
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 (CC > -1)
Account1.OrderSell(CallOrderCode, CSqt, Option.GetBidByCode(CallOrderCode, 5),0);
//풋매수
if (PP > -1)
Account1.OrderBuy(PutOrderCode, PBqt, Option.GetAskByCode(PutOrderCode, 5),0);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.SetBalanceItem(CallOrderCode, 0);
if(Account1.Balance.count >0 && Account1.Balance.position==1)
Account1.OrderBuy(CallOrderCode, Math.min(Account1.Balance.count, CSqt), Option.GetAskByCode(CallOrderCode, 5), 0);
// Account1.OrderBuy(CallOrderCode, CSqt, Option.GetAskByCode(CallOrderCode, 5), 0);
Account1.SetBalanceItem(PutOrderCode, 0);
if(Account1.Balance.count >0 && Account1.Balance.position==2)
Account1.OrderSell(PutOrderCode, Math.min(Account1.Balance.count, PBqt), Option.GetBidByCode(PutOrderCode, 5), 0);
// Account1.OrderSell(PutOrderCode, PBqt, Option.GetBidByCode(PutOrderCode, 5), 0);
}
}
2013-10-23
1150
글번호 222661