답변완료
종목 선정 문의
안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다.
아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다.
여기에 다음과 같은 조건을 추가하고 싶습니다
ㅇ 현재 : 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);
}
}
2017-06-15
2316
글번호 224181
답변완료
함수 작성 방법 검토 부탁드립니다.
아래 예와 같이 전역변수 C2_f_rsi1, C2_f_rsi2, C2_f_rsi4에 차트에 적용된 indicator 값을 받아오는 코딩을 하려고 하는데요... case3는 잘동작하는데, 사용자정의 모듈 함수로 처리하고자 할 때 case1, case2 어떤 방식이 맞는 건가여?
var C2_f_rsi1, C2_f_rsi2, C2_f_rsi4;
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
// case1
CollectIndicators_Test1();
Main.MessageList("test1", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
// case2
CollectIndicators_Test2(C2_f_rsi1, C2_f_rsi2, C2_f_rsi4);
Main.MessageList("test2", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
// case3
C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
Main.MessageList("test3", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
}
CollectIndicators_Test1()
{
C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
}
CollectIndicators_Test2(_C2_f_rsi1, _C2_f_rsi2, _C2_f_rsi4)
{
_C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
_C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
_C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
}
2017-05-31
2221
글번호 224178
확장차트 생성 후 엑셀 작성 문의합니다.
안녕하세요. 예스스팟으로 매매에 도움을 얻고자 하는 1인입니다.
최근 여러 종목에서 필요한 값을 엑셀에 정리할 때 예스스팟을 활용할려고 합니다.
그래서 구상한 형태는 다음과 같은데요.
1 엑셀에 종목코드, 코스닥/코스피 표시 해두기
2 엑셀에 종목코드 읽어들여서 확장차트 생성하기
3 확장차트에서 최근 260일 종가 읽어들여서 수식 값 계산하기
4 수식 결과값 엑셀에 출력
그런데 현재 2번 확장차트 생성하기까지는 실행이 되는데,
이후 확장차트가 생성이 되어도 function Main_OnRcvChartEx(ChartEx) 로 진행이 되질 않습니다.
무엇이 잘못되었는지 참 고민하다가 여기에 글을 올립니다.
조언 부탁드립니다.
------------
엑셀 파일
A B C D
1 종목코드 종목명 K (수식결과값입력란:빈칸)
2 종목코드 종목명 Q (수식결과값입력란:빈칸)
(K면 코스피, Q면 코스닥)
--------------
코드
var ExcelCode = [], InMarket = [], Code = [];
var KPprofit = [], KQprofit = [], Profit = [], Covar = [], Beta = [];
var rcv, rcv1, ExcelRow, C1, ChartEx1, Period;
var Avgpf, AvgKPpf, AvgKQpf, VarKP, VarKQ, AvgCovItem;
function Main_OnStart() //특정이벤트에서
{
Main.MessageLog("시작")
ExcelRow = Excel1.GetRowCount(1);
//엑셀에서 종목코드를 가져와 ExcelCode에 저장
for (var i = 2; i <= ExcelRow; i++)
{
ExcelCode[i-2] = Excel1.GetData(1, "A"+i);
InMarket[i-2] = Excel1.GetData(1, "C"+i);
}
//객체수신 횟수를 카운트할 변수
rcv = 0;
//객체수신하면 저장할 배열변수
Code = [];
//자료수집 기간 설정
Period = 260;
//코스피, 코스닥 지수 수익률 분산 계산
for (var j = 0 ; j < Period ; j++)
{
KPprofit[j] = ( ChartExKP.GetClose(1,j) / ChartExKP.GetClose(1,j+1) ) - 1;
AvgKPpf = AvgKPpf + KPprofit[j] / Period;
KQprofit[j] = ( ChartExKQ.GetClose(1,j) / ChartExKQ.GetClose(1,j+1) ) - 1;
AvgKQpf = AvgKQpf + KQprofit[j] / Period;
}
for (var k = 0 ; k < Period ; k++)
{
VarKP = VarKP + Math.pow( AvgKPpf - KPprofit[k], 2);
VarKQ = VarKQ + Math.pow( AvgKQpf - KQprofit[k], 2);
}
Main.MessageLog("KP, KQ 분산 측정, 타이머 시작");
Main.SetTimer(1,1000)
}
function Main_OnTimer(nEventID) //특정이벤트에서
{
//ExcelCode에 저장된 값이 1개이상이면
if (nEventID == 1 && ExcelCode.length >= 1 && ExcelCode.length <= ExcelRow + 1 )
{
//ExcelCode[rcv]방의 종목요청
Main.ReqMarketData(ExcelCode[rcv]);
Main.MessageList("종목 <",ExcelCode[rcv],"> 생성 요청");
}
Main.KillTimer(1);
}
function Main_OnRcvMarketData(MarketData)
{
//확장차트 객체 초기화
// var ChartEx1 = null;
//직전 요청산 종목이 수신되면
if (MarketData.code == ExcelCode[rcv])
{
//Object의 rcv방에 해당종목객체 저장
Code[rcv] = MarketData;
var C1 = new ReqChartItem(MarketData.code, 1, CHART_PERIOD_DAILY, 261, CHART_REQCOUNT_BAR,false, false);
Main.ReqChartEx(C1, null, null, null);
Main.MessageList("종목 <",ExcelCode[rcv],">의 확장차트 생성");
}
function Main_OnRcvChartEx(ChartEx)
{
ChartExA = ChartEx;
for (var l = 0 ; l < Period; l++)
{
Profit[l] = ( ChartExA.GetClose(1,l) / ChartExA.GetClose(1,l+1) ) - 1;
Avgpf = Avgpf + Profit[l] / Period;
Main.MessageLog("Avgpf 측정");
}
//코스피, 코스닥 종목 구분
if ( InMarket[rcv] == "K" )
{
for (var m = 0 ; m < Period ; m++)
{
Covar[m] = ( Profit[m] - AvgKPpf )*( KPprofit[m] - Avgpf );
AvgCovItem = AvgCovItem + Covar[m] / Period;
}
Beta[rcv] = AvgCovItem / VarKP;
Main.MessageLog("Beta 측정");
}
if ( InMarket[rcv] == "Q" )
{
for (var n = 0 ; n < Period ; n++)
{
Covar[n] = ( Profit[n] - AvgKQpf )*( KQprofit[n] - Avgpf );
AvgCovItem = AvgCovItem + Covar[n] / Period;
}
Beta[rcv] = AvgCovItem / VarKQ;
Main.MessageLog("Beta 측정");
}
if ( InMarket[rcv] == "" )
{
Beta[rcv] = 0;
Main.MessageLog("Beta 측정");
}
rcv1 = rcv + 2;
//엑셀에 베타(1년) 입력
Excel1.SetColData(1, "D"+rcv1, Beta[rcv]);
Main.MessageList("종목 <",ExcelCode[rcv],">의 Beta 출력");
//필요한 변수 초기화
Avgpf = 0;
AvgCovItem = 0;
//rcv는 1증가
rcv = rcv+1;
//타이머 재설정
Main.SetTimer(1,5000);
//배열변수가 0부터 존재하므로
//rcv가 종목코드갯수 이하일때만 요청
if (rcv < ExcelCode.length)
{
Main.ReqMarketData(ExcelCode[rcv]);
}
if ( rcv >= ExcelRow - 1 ) { Excel1.Save() };
}
}
2017-05-25
2524
글번호 224172