예스스탁
예스스탁 답변
2019-07-18 14:55:22
안녕하세요
예스스탁입니다.
현재 사용하시는 수식에서 신호발생시 주문은 아래와 같습니다.
차트에서 매수신호 발생하면 콜 ATM+2종목 매수
차트에서 매수청산신호 발생하면 보유종목 중 옵션종목 모두 청산
차트에서 매도신호 발생하면 콜 ATM+2종목 매수
차트에서 매도청산신호 발생하면 보유종목 중 옵션종목 모두 청산
리버스는 청산과 반대방향 진입신호가 동시에 발생하는 내용입니다.
리버스가 발생해도 청산과 진입이 각각 발생하므로
모두 위 내용에 따라 주문을 발생합니다.
문의하신 내용으로는 어느부분을 수정해 드려야 할지 알수 없습니다.
각 신호별 주문에 대해 상세한 내용을 올려주시기 바랍니다.
즐거운 하루되세요
> 몬스터 님이 쓴 글입니다.
> 제목 : 수식 수정 부탁드립니다.
> 아래의 시스템은 진입 -> 청산 식으로 진행될때 옵션을 진입,청산는 시스템인데,
선물 신호가 진입 -> 청산과 진입 -> 리버스가 혼재되어 발생합니다.
선물 신호가 혼재되어 발생될때 함께 진입과 청산을 할 수 있는 식으로 수정 부탁드립니다.
================================================================
/*스크립트시작-----------------------------------------------------*/
var Start;
var BuyC1_code;
var BuyC2_code;
var BuyP1_code;
var BuyP2_code;
var SellC1_code;
var SellC2_code;
var SellP1_code;
var SellP2_code;
function Main_OnStart()
{
Main.MessageLog("시작");
Start = 0;
//옵션 Day청산이면 타이머셋팅 5초간격
if (Option.GetRemainDays(0,0) == 1)
{
Main.SetTimer(1, 5000);
}
}
function Chart1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
//Buy 신호발생
if (Signal.signalKind == 1 )
{
Start = 1;
BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드
var BuyC2_price = Option.GetAskByCode(BuyC2_code,2);
var Vol = Signal.count; //신호수량
Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 0);
Main.MessageLog("상방합성선물매수");
}
//매수청산신호
if (Start == 1 && Signal.signalKind == 2 )
{
//전체 종목수
var num = Account1.GetTheNumberOfBalances();
//전체 종목 중 옵션만 청산
for(var i = 0 ; i < num ; i++)
{
//잔고셋팅
Account1.SetBalance(i);
//옵션함수로 해당 종목이 옵션인지 확인
if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0)
{
//종목코드
var cc = Account1.Balance.code;
//잔고수량
var vv = Account1.Balance.count;
//매도포지션이면
if (Account1.Balance.position == 1)
{
//청산
Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0);
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
//청산
Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0);
}
}
Main.MessageLog("상방합성선물매수청산");
}
}
//Sell 신호발생
if (Signal.signalKind == 3 )
{
Start = 1;
BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드
var BuyC2_price = Option.GetAskByCode(BuyC2_code,2);
var Vol = Signal.count; //신호수량
Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 0);
Main.MessageLog("하방합성선물매도");
}
//매도청산신호
if (Start == 1 && Signal.signalKind == 4 )
{
//전체 종목수
var num = Account1.GetTheNumberOfBalances();
//전체 종목 중 옵션만 청산
for(var i = 0 ; i < num ; i++)
{
//잔고셋팅
Account1.SetBalance(i);
//옵션함수로 해당 종목이 옵션인지 확인
if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0)
{
//종목코드
var cc = Account1.Balance.code;
//잔고수량
var vv = Account1.Balance.count;
//매도포지션이면
if (Account1.Balance.position == 1)
{
//청산
Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0);
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
//청산
Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0);
}
}
Main.MessageLog("하방합성선물매도청산");
}
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//만기일 15시 이후이면
if (nEventID == 1 && HHMMSS >= 150000)
{
//타이머종료
Main.KillTimer(1);
//전체 종목수
var num = Account1.GetTheNumberOfBalances();
//전체 종목 중 옵션만 청산하고 차월물로 진입
for(var i = 0 ; i < num ; i++)
{
//잔고셋팅
Account1.SetBalance(i);
//옵션함수로 해당 종목이 옵션인지 확인
if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0)
{
//종목코드
var cc = Account1.Balance.code;
//잔고수량
var vv = Account1.Balance.count;
//매도포지션이면
if (Account1.Balance.position == 1)
{
//청산
Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0);
//차근월물 코드 찾기
var strike = Option.GetExercisePrice(cc);
//잔고종목이 콜이면
if (cc == Option.GetCodeByExercisePrice(0,strike))
var NextMonth = Option.GetCodeByExercisePrice(2, strike);
else //잔고종목이 풋이면
var NextMonth = Option.GetCodeByExercisePrice(3, strike);
//동일행사가의 차근월물 매도주문
Account1.OrderSell(NextMonth,vv,Option.GetBid(NextMonth,5),0);
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
//청산
Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0);
//차근월물 코드 찾기
var strike = Option.GetExercisePrice(cc);
//잔고종목이 콜이면
if (cc == Option.GetCodeByExercisePrice(0,strike))
var NextMonth = Option.GetCodeByExercisePrice(2, strike);
else //잔고종목이 풋이면
var NextMonth = Option.GetCodeByExercisePrice(3, strike);
//동일행사가의 차근월물 매수주문
Account1.OrderBuy(NextMonth,vv,Option.GetAsk(NextMonth,5),0);
}
}
}
}
}