답변완료
미청산 부분 엑셀추출
지표로 진입과 청산 수식을 짜서 적용하고 있습니다.
차트에서 진입과 청산이 이루어지면 엑셀로 데이터가 추출되는데
차트상 진입은 있고 청산이 이루어지지 않는 부분은 아예 그어떤것도 데이터가 추출되지 않아서요.
청산되지 않은 진입에 관하여 진입시기와 기준가 정도만 기록하여 "미청산"이라는 표기로 엑셀로 데이터 추출을 하고 싶은데 혹시 안되는 이유가 무엇인지 알 수 있을까요?
아래 수식 올려드립니다.
var Log = new Logger(true);
var gData = [];
var gName;
function Main_OnStart()
{
Log.log("===================== Main_OnStart =====================");
var i;
try {
for(i = 0 ; i < 10000000 ; i++) {
var date = Chart1.GetSDate(1, i);
var time = Chart1.GetSTime(1, i);
var barDateTime = makeDateTimeStr(date, time, true);
// Log.log('일시 : ', dateTime, ', ', i, '봉전 종가 = ', Chart1.GetClose(1, i));
if(Chart1.GetIndicatorData(지표명, 1, i) < 0) continue;
var data = new Data();
data.read(i, barDateTime);
gData.push(data);
}
}
catch(e) {
Log.log('stopped, i = ', i, ', e => ', e);
}
var code = Main.GetOrderCode(Chart1.GetCode(1));
Main.ReqMarketData(code, 0, 0);
Log.log('Main_OnStart, code = ', code);
}
function Main_OnRcvMarketData(MarketData)
{
Log.log('Main_OnRcvMarketData, code = ', MarketData.code, ', name = ', MarketData.name);
Excel1.Clear(1, 'A1', 'Z5000');
Excel1.SetArrayToRow(1, 'A1', ['기록봉', '종목', '분봉', '일시', '방향', '기준가', '고가/저가', '되돌림%', '벌어진값', '봉갯수', '청산가']);
var name = MarketData.name;
gName = name;
var j = 2;
for(i = gData.length - 1; i >= 0 ; i--) {
var d = gData[i];
var isUpS = d.isUp ? '상승' : '하락';
// if(d.isEnter) Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, '진입', '', '', '', '']);
// else Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, d.barCnt, d.exit]);
if(d.isEnter) continue;
Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, d.barCnt, d.exit]);
j++;
}
writeUnexitedEnters(j);
}
function Data() {
this.isEnter = false;
this.date;
this.time;
this.isUp = true;
this.standard;
this.base;
this.retrace;
this.tick;
this.barCnt;
this.exit;
this.dateTime;
this.barDateTime;
this.barInterval;
Data.prototype.read = function(i, barDateTime) {
this.isEnter = Chart1.GetIndicatorData(지표명, 1, i) == 1;
this.date = Chart1.GetIndicatorData(지표명, 2, i);
this.time = Chart1.GetIndicatorData(지표명, 3, i);
this.isUp = Chart1.GetIndicatorData(지표명, 4, i) == 1;
this.standard = Chart1.GetIndicatorData(지표명, 5, i).toFixed(소수자릿수);
this.base = Chart1.GetIndicatorData(지표명, 6, i).toFixed(소수자릿수);
this.retrace = Chart1.GetIndicatorData(지표명, 7, i).toFixed(0);
this.tick = Chart1.GetIndicatorData(지표명, 8, i).toFixed(소수자릿수);
this.barCnt = Chart1.GetIndicatorData(지표명, 9, i);
this.exit = Chart1.GetIndicatorData(지표명, 10, i).toFixed(소수자릿수);
this.barInterval = Chart1.GetIndicatorData(지표명, 11, i);
this.dateTime = makeDateTimeStr(this.date, this.time, false);
this.barDateTime = barDateTime;
this.barCnt = this.barCnt == -2 ? '미청산' : this.barCnt;
Log.log(i, ', ', this.isEnter, ', ', this.dateTime, ', ', this.isUp, ', ', this.standard, ', ', this.base, ', ', this.retrace, ', ', this.tick, ', ', this.barCnt, ', ', this.exit);
}
}
function makeDateTimeStr(date, time, isChartDate) {
var year = Math.floor(date / 10000);
var date1 = date - year * 10000;
var month = Math.floor(date1 / 100);
var day1 = date1 - month * 100;
var time = isChartDate ? Math.floor(time / 1000000) : time;
var hour = Math.floor(time / 100);
var minute = time - hour * 100;
var dateTime = year + "-" + month + "-" + day1 + " " + hour + ":" + minute;
return dateTime;
}
function writeUnexitedEnters(row)
{
Log.log('writeUnexitedEnters, 미청산 추가');
var enters = [];
for(var i in gData) {
var d = gData[i];
if(d.isEnter) {
var isExited = false;
for(var j in gData) {
var t = gData[j];
if(i == j) continue;
if(d.dateTime == t.dateTime) isExited = true;
}
if(!isExited) enters.push(d);
}
}
for(var i in enters) {
var d = enters[i];
var isUpS = d.isUp ? '상승' : '하락';
var rowN = Number(row) + Number(i);
var rowS = 'A' + rowN;
Log.log('row = ', row, ', i = ', i, ', rowN = ', rowN, ', rowS = ', rowS);
Excel1.SetArrayToRow(1, rowS, ['', gName, d.barInterval + '분', d.dateTime, isUpS, '미청산', '', '', '', '']);
// Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, gName, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, '미청산', d.exit]);
}
}
//------------------------------------ Util --------------------------------------------------
function DateUtil() {
this.startTime = 900;
this.endTime = 1521;
this.searchEndTime = 1515;
this.now = new Date();
DateUtil.prototype.format = function(value) {
return ('00' + value).slice(-2);
}
DateUtil.prototype.getTimeString = function() {
return this.format(this.now.getHours()) + ':' + this.format(this.now.getMinutes()) + ':' + this.format(this.now.getSeconds());
}
DateUtil.prototype.isAfter = function(time) {
var HHMM = this.now.getHours() * 100 + this.now.getMinutes();
return HHMM >= time;
}
DateUtil.prototype.isBefore = function(time) {
var HHMM = this.now.getHours() * 100 + this.now.getMinutes();
return HHMM <= time;
}
DateUtil.prototype.isAfterSearchTime = function() {
return this.isAfter(this.searchEndTime);
}
DateUtil.prototype.isInSearchTime = function() {
return this.isAfter(this.startTime) && !this.isAfterSearchTime() && this.isBefore(this.endTime);
}
DateUtil.prototype.isAfterEndTime = function() {
return this.isAfter(this.endTime);
}
DateUtil.prototype.isMarketStarted = function() {
return this.isAfter(900);
}
DateUtil.prototype.getDate = function() {
return '' + (this.now.getYear() + 1900) + this.format(this.now.getMonth() + 1) + this.format(this.now.getDate());
}
}
function Logger(isOn) {
this.DEBUG = isOn;
this.log = function() {
if(this.DEBUG) Main.MessageLog(this.makeString(arguments));
}
this.msg = function() {
Main.MessageLog(this.makeString(arguments));
}
this.makeString = function(args) {
var str = new DateUtil().getTimeString() + ', ';
for(var i = 0; i < args.length; i++) {
var arg = args[i];
if( isFinite(arg) ) {
arg = ('' + arg).replace(/₩B(?=(₩d{3})+(?!₩d))/g, ",");
}
str += arg;
}
return str;
}
}