답변완료
해외옵션 관련 에러수정
안녕하세요.
아래의 시스템으로 선물 신호를 받아 해외 선물 옵션을 거래하려하는데, 에러가 발생합니다.
에러를 수정해주시면 감사하겠습니다.
===============================================================================
/*스크립트시작-----------------------------------------------------*/
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;
}
function Chart1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
//Buy 신호발생
if (Signal.signalKind == 1 )
{
Start = 1;
BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드
BuyP2_code = Option.GetATMPutRecent(2,0); //풋 ATM+2 종목코드
SellP1_code = Option.GetATMPutRecent(0,0); //풋 ATM 종목코드
var BuyC2_price = Option.GetCurrent(BuyC2_code);
var BuyP2_price = Option.GetCurrent(BuyP2_code);
var SellP1_price = Option.GetCurrent(SellP1_code);
var Vol = Signal.count; //신호수량
Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 1);
Account1.OrderBuy(BuyP2_code, Vol*2, BuyP2_price, 1);
Account1.OrderSell(SellP1_code, Vol, SellP1_price, 1);
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,0,1);
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
//청산
Account1.OrderSell(cc, vv,0,1);
}
}
Main.MessageLog("상방합성선물매수청산");
}
}
//Sell 신호발생
if (Signal.signalKind == 3 )
{
Start = 1;
BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드
SellC1_code = Option.GetATMCallRecent(0,0); //콜 ATM 종목코드
BuyP2_code = Option.GetATMPutRecent(2,0); //풋 ATM+2 종목코드
var BuyC2_price = Option.GetCurrent(BuyC2_code);
var SellC1_price = Option.GetCurrent(SellC1_code);
var BuyP2_price = Option.GetCurrent(BuyP2_code);
var Vol = Signal.count; //신호수량
Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 1);
Account1.OrderSell(SellC1_code, Vol, SellC1_price , 1);
Account1.OrderBuy(BuyP2_code, Vol*2, BuyP2_price, 1);
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,0,1);
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
//청산
Account1.OrderSell(cc, vv,0,1);
}
}
Main.MessageLog("하방합성선물매도청산");
}
}
}
2019-07-20
3274
글번호 224930
답변완료
해선 옵션 관련
아래 국선용 합성시스템을 해선의 옵션에도 적용하고 싶습니다.
NH선물의 YesGrobal을 사용하는데,
1. 설정에 "옵션민감도" 등의 선택란이 없어 옵션에 대한 정보를 못가져오는지 우선 GetRemainDays에 문제가 발생하고
2. GetAskByCode 등의 함수에도 문제가 발생하고 있습니다.
아래의 시스템을 해선에서도 사용할 수 있도록 수정 부탁드립니다.
======================================================================
/*스크립트시작-----------------------------------------------------*/
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(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);
//차근월물 코드 찾기
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);
}
}
}
}
}
2019-06-27
3384
글번호 224908
답변완료
수식 수정 부탁드립니다.
아래의 시스템은 진입 -> 청산 식으로 진행될때 옵션을 진입,청산는 시스템인데,
선물 신호가 진입 -> 청산과 진입 -> 리버스가 혼재되어 발생합니다.
선물 신호가 혼재되어 발생될때 함께 진입과 청산을 할 수 있는 식으로 수정 부탁드립니다.
================================================================
/*스크립트시작-----------------------------------------------------*/
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);
}
}
}
}
}
2019-06-27
3252
글번호 224907