답변완료
금액 기준 수량
외부입력변수 EntryVol에 기입한 금액에 따른 주식 수량(Vol)을 매수하는 식을 작성하였는데, 수량을 입력시키라는 에러 메시지와 함께 매수 주문이 안나가네요.
아래의 스팟 검토 부탁드립니다.
var BL = [],req;
var CT = [],MK = [];
function Main_OnStart()
{
//처음 시작시 step은 0
step = 0;
//시작시점의 보유종목수
var num = Account1.GetTheNumberOfBalances();
//보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장
if (num > 0)
{
BL = [];
for(var i = 0 ; i < num ; i++)
{
Account1.SetBalance(i);
BL.push(Account1.Balance.code);
}
Main.MessageList("BL : ",BL);
if (BL.length >= 1)
{
req = 0;
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10); // 최대진입횟수
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
Main.MessageList("차트객체요청 :",BL[req]);
}
}
else //보유종목이 없으면 바로 1분 타이머 시작
{
Main.MessageList("보유종목없음");
Main.SetTimer(1, 10000);//1번 타이머, 60초
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == BL[req])
{
Main.MessageList("차트객체생성 :",ChartEx.GetCode(1));
CT.push(ChartEx);
Main.ReqMarketData(BL[req]);
Main.MessageList("종목객체요청 :",BL[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == BL[req])
{
Main.MessageList("종목객체생성 :",MarketData.code);
MK.push(MarketData);
req = req+1;
if (req < BL.length)
{
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10);
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
Main.MessageList("차트객체요청 :",BL[req]);
}
else
{
Main.SetTimer(1, 10000);//1번 타이머, 60초
Main.MessageList("보유종목차트생성완료",CT.length,MK.length);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
Main.ReqPowerSearch("PSearch");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목이 없으면
if (nCount == 0)
{
//타이머 다시 셋팅
Main.SetTimer(1, 100000);//1번 타이머, 60초
}
//검색된 종목이 있으면
if (nCount >= 1)
{
//검색된 종목과 기존 만든 차트들의 종목코드를 비교해
//차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가
BL = [];
for(var i = 0 ; i < aItemList.length ; i++)
{
var add = true;
for(var z = 0 ; z < CT.length ; z++)
{
if (aItemList[i] == CT[z].GetCode(1))
{
add = false;
break;
}
}
if (add == true)
{
BL.push(aItemList[i]);
}
}
Main.MessageList("BL : ",BL);
//차트 생성해야할 종목이 있으면 차트요청
if (BL.length >= 1)
{
req = 0;
//차트 요청
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10);
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
}
else //없으면 타이머 다시 셋팅
{
Main.SetTimer(1, 100000);//1번 타이머, 60초
}
}
}
//생성된 차트들에서 신호가 발생하면
function Main_OnRiseSignal(ChartEx, Signal)
{
//매수신호 발생
if (Signal.signalKind == 1)
{
//EntryVol 금액 시장가 매수
var Vol = Math.floor(EntryVol/Signal.price);
Account1.OrderBuy(Signal.code, Vol,Signal.price,1);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅
Account1.SetBalance(Signal.code,0);
//보유수량이 있으면
if (Account1.Balance.count > 0)
{
//전량 시장가 매도
Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1);
}
}
}
2021-04-06
3030
글번호 225460
답변완료
미청산 부분 엑셀추출
지표로 진입과 청산 수식을 짜서 적용하고 있습니다.
차트에서 진입과 청산이 이루어지면 엑셀로 데이터가 추출되는데
차트상 진입은 있고 청산이 이루어지지 않는 부분은 아예 그어떤것도 데이터가 추출되지 않아서요.
청산되지 않은 진입에 관하여 진입시기와 기준가 정도만 기록하여 "미청산"이라는 표기로 엑셀로 데이터 추출을 하고 싶은데 혹시 안되는 이유가 무엇인지 알 수 있을까요?
아래 수식 올려드립니다.
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;
}
}
2021-03-17
2748
글번호 225452