안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다.
아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다.
여기에 다음과 같은 조건을 추가하고 싶습니다
ㅇ 현재 : 9시 35초에 설정된 2.7에 가까운 콜풋 종목 선정
ㅇ 추가내용 : 9시 35초에 2.7에 가까은 콜풋, 2.1에 가까운 콜풋 종목을 각각 선정하여
2.7에 가까운 콜풋종목의 절대값의 차이가 0.8 이상이면
2.1에 가까운 콜풋종목으로 최종 거래종목을 선정
현재의 수식은 아래와 같습니다.
==========================================================================
var Start = 0;
var BC; var BP; var SC; var SP;
var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0;
var CPLsum = 0; var PLsum = 0; var CLsum = 0;
var EntryPercent = 0;
var Entry1; var Entry2; var InHMS;
var SCP1; var SCP2; var SCP3; var SCP4;
var SPP1; var SPP2; var SPP3; var SPP4;
var CPLsumin = 0;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작");
Entry1 = false;
Entry2 = false;
//타이머 셋팅(1번,5초)
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작
if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션중 2.7에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋종목 찾기
//풋옵션중 2.7에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Start = 1;
SC = CallOrderCode;
SP = PutOrderCode;
CEntryPrice = Option.GetCurrentByCode(SC);
PEntryPrice = Option.GetCurrentByCode(SP);
CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100;
Entry1 = true;
Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice);
//청산신호발생했으므로 타이머 종료
Main.KillTimer(1);
//타이머 셋팅(2번,5초)
Main.SetTimer(2, 5000);
}
}
답변 1
예스스탁
예스스탁 답변
2017-06-22 15:20:39
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
var Start = 0;
var BC; var BP; var SC; var SP;
var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0;
var CPLsum = 0; var PLsum = 0; var CLsum = 0;
var EntryPercent = 0;
var Entry1; var Entry2; var InHMS;
var SCP1; var SCP2; var SCP3; var SCP4;
var SPP1; var SPP2; var SPP3; var SPP4;
var CPLsumin = 0;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작");
Entry1 = false;
Entry2 = false;
//타이머 셋팅(1번,5초)
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false)
{
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
var CallPrice1 = new Array(UNum+LNum+1);
var CallPrice2 = new Array(UNum+LNum+1);
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
var PutPrice1 = new Array(UNum+LNum+1);
var PutPrice2 = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i); //콜별 현재가
CallPrice1[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7); //콜별 2.7과 차이
CallPrice2[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.1); //콜별 2.1과 차이
CallCode[i+LNum] = Option.GetATMCallRecent(i); //종목코드
}
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Option.GetCurrent(1, i); //풋별 현재가
PutPrice1[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7); //풋별 2.7과의 차이
PutPrice2[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.1); //풋별 2.1과의 차이
PutCode[i+UNum] = Option.GetATMPutRecent(i); //종목코드
}
//2.7과 차이가 가장 작은 콜 종목 찾음
var CC1 = 99999999;
var CCPrice1 = 0;
var CallOrderCode1 = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice1[i+LNum] < CC1)
{
CC1 = CallPrice1[i+LNum];
CCPrice1 = CallPrice[i+LNum];
CallOrderCode1 = CallCode[i+LNum]
}
}
//2.7과 차이가 가장 작은 풋 종목 찾음
var PP1 = 99999999;
var PPPrice1 = 0;
var PutOrderCode1 = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice1[i+UNum] < PP1)
{
PP1 = PutPrice1[i+UNum];
PPPrice1 = PutPrice[i+UNum];
PutOrderCode1 = PutCode[i+UNum];
}
}
//콜풋 모두 찾았으면
if (CC1 < 99999999 && PP1 < 99999999)
{
//우선 2.7에 가까운 종목을 SC와 SP로 저장
SC = CallOrderCode1;
SP = PutOrderCode1;
//콜풋 차이가 0.8이상이면 2.1에 가장 가까운 종목을 찾아 SC와 SP를 변경
if (Math.abs(CCPrice1-PPPrice1) >= 0.8 )
{
var CC2 = 99999999;
var CCPrice2 = 0;
var CallOrderCode2 = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice2[i+LNum] < CC2)
{
CC2 = CallPrice2[i+LNum];
CCPrice2 = CallPrice[i+LNum];
CallOrderCode2 = CallCode[i+LNum]
}
}
var PP2 = 99999999;
var PPPrice2 = 0;
var PutOrderCode2 = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice2[i+UNum] < PP2)
{
PP2 = PutPrice2[i+UNum];
PPPrice2 = PutPrice[i+UNum];
PutOrderCode2 = PutCode[i+UNum];
}
}
if (CC2 < 99999999 && PP2 < 99999999)
{
SC = CallOrderCode2;
SP = PutOrderCode2;
}
}
Start = 1;
CEntryPrice = Option.GetCurrentByCode(SC);
PEntryPrice = Option.GetCurrentByCode(SP);
CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100;
Entry1 = true;
Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice);
//청산신호발생했으므로 타이머 종료
Main.KillTimer(1);
//타이머 셋팅(2번,5초)
Main.SetTimer(2, 5000);
}
}
}
즐거운 하루되세요
> 탄젠트80 님이 쓴 글입니다.
> 제목 : 종목 선정 문의
> 안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다.
아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다.
여기에 다음과 같은 조건을 추가하고 싶습니다
ㅇ 현재 : 9시 35초에 설정된 2.7에 가까운 콜풋 종목 선정
ㅇ 추가내용 : 9시 35초에 2.7에 가까은 콜풋, 2.1에 가까운 콜풋 종목을 각각 선정하여
2.7에 가까운 콜풋종목의 절대값의 차이가 0.8 이상이면
2.1에 가까운 콜풋종목으로 최종 거래종목을 선정
현재의 수식은 아래와 같습니다.
==========================================================================
var Start = 0;
var BC; var BP; var SC; var SP;
var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0;
var CPLsum = 0; var PLsum = 0; var CLsum = 0;
var EntryPercent = 0;
var Entry1; var Entry2; var InHMS;
var SCP1; var SCP2; var SCP3; var SCP4;
var SPP1; var SPP2; var SPP3; var SPP4;
var CPLsumin = 0;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작");
Entry1 = false;
Entry2 = false;
//타이머 셋팅(1번,5초)
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작
if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션중 2.7에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋종목 찾기
//풋옵션중 2.7에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Start = 1;
SC = CallOrderCode;
SP = PutOrderCode;
CEntryPrice = Option.GetCurrentByCode(SC);
PEntryPrice = Option.GetCurrentByCode(SP);
CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100;
Entry1 = true;
Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice);
//청산신호발생했으므로 타이머 종료
Main.KillTimer(1);
//타이머 셋팅(2번,5초)
Main.SetTimer(2, 5000);
}
}