아래식은 하방 Put 스프레드 수식입니다
차트1에서 매도 신호가 나오면 1.00 과 가장 가까운 Put 옵션을 매수하고
동시에 바로 아래 외가격(Put종목-1)은 매도합니다.
과거 게시글의 상방 콜 스프레드 수식을 참조하여 작성하여 보았습니다.
진입은 되는데 청산이 안됩니다.
수식이 맞는지 살펴주시기 바랍니다.
************************************************************************
var S1= 0,S2 = 0,PutCode1,PutCode2;
var RemainDays,entry;
function Main_OnStart()
{
Main.MessageList("Start");
RemainDays = Option1.GetRemainDays(0,0);
entry = true;
if (RemainDays == 1)
{
Main.SetTimer(1, 1000);
}
}
function Chart1_OnRiseSignal(Signal)
{
S2 = S1;
S1 = Signal.signalKind;
if (S1 == 3 && entry == true)
{
if (S2 != 3)
{
var HNum = Option1.uppersATM;
var LNum = Option1.lowersATM;
var CP = [];
var PD1 = [];
var PD2 = [];
for (var i = -LNum; i <= HNum; i++)
{
CP[i+LNum] = Math.abs(Option1.GetCurrent(0, i)-1);
PD1[i+LNum] = Option1.GetATMPutRecent(i);
PD2[i+LNum] = Option1.GetATMPutRecent(i+1);
}
var MinV = CP[0];
PutCode1 = PD1[0];
PutCode2 = PD2[0];
for (var i = 0; i < CP.length; i++)
{
if (CP[i] < MinV)
{
MinV = CP[i];
PutCode1 = PD1[i];
PutCode2 = PD2[i];
}
}
Account1.OrderBuy(PutCode1, 1, Option1.GetAskByCode(PutCode1, 5), 0);
Account1.OrderSell(PutCode2, 1, Option1.GetBidByCode(PutCode2, 5), 0);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var d = new Date();
var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (T1 >= 150000)
{
Main.KillTimer(1);
entry = false;
Account1.SetBalance(PutCode1);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol1 = Account1.Balance.count;
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(PutCode2);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol2 = Account1.Balance.count;
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
답변 1
예스스탁
예스스탁 답변
2023-11-07 15:42:55.0
안녕하세요
예스스탁입니다.
Account1.Balance.position
계좌객체의 포지션함수는 해당 종목이 포지션이 매도이면 1, 매수이면 2를 리턴합니다.
현재 2개 종목 모두 Account1.Balance.position == 1 로 되어 있습니다.
차트에서 신호가 발생하면 PutCode1은 매수, PutCode2는 매도를 하므로
타이머 이벤트에서 15시가 되면 PutCode1에 대한 포지션은 2로 확인을 하셔야 합니다.
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var d = new Date();
var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (T1 >= 150000)
{
Main.KillTimer(1);
entry = false;
Account1.SetBalance(PutCode1);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
var vol1 = Account1.Balance.count;
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(PutCode2);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol2 = Account1.Balance.count;
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 문의
> 아래식은 하방 Put 스프레드 수식입니다
차트1에서 매도 신호가 나오면 1.00 과 가장 가까운 Put 옵션을 매수하고
동시에 바로 아래 외가격(Put종목-1)은 매도합니다.
과거 게시글의 상방 콜 스프레드 수식을 참조하여 작성하여 보았습니다.
진입은 되는데 청산이 안됩니다.
수식이 맞는지 살펴주시기 바랍니다.
************************************************************************
var S1= 0,S2 = 0,PutCode1,PutCode2;
var RemainDays,entry;
function Main_OnStart()
{
Main.MessageList("Start");
RemainDays = Option1.GetRemainDays(0,0);
entry = true;
if (RemainDays == 1)
{
Main.SetTimer(1, 1000);
}
}
function Chart1_OnRiseSignal(Signal)
{
S2 = S1;
S1 = Signal.signalKind;
if (S1 == 3 && entry == true)
{
if (S2 != 3)
{
var HNum = Option1.uppersATM;
var LNum = Option1.lowersATM;
var CP = [];
var PD1 = [];
var PD2 = [];
for (var i = -LNum; i <= HNum; i++)
{
CP[i+LNum] = Math.abs(Option1.GetCurrent(0, i)-1);
PD1[i+LNum] = Option1.GetATMPutRecent(i);
PD2[i+LNum] = Option1.GetATMPutRecent(i+1);
}
var MinV = CP[0];
PutCode1 = PD1[0];
PutCode2 = PD2[0];
for (var i = 0; i < CP.length; i++)
{
if (CP[i] < MinV)
{
MinV = CP[i];
PutCode1 = PD1[i];
PutCode2 = PD2[i];
}
}
Account1.OrderBuy(PutCode1, 1, Option1.GetAskByCode(PutCode1, 5), 0);
Account1.OrderSell(PutCode2, 1, Option1.GetBidByCode(PutCode2, 5), 0);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var d = new Date();
var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (T1 >= 150000)
{
Main.KillTimer(1);
entry = false;
Account1.SetBalance(PutCode1);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol1 = Account1.Balance.count;
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(PutCode2);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol2 = Account1.Balance.count;
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}