답변완료
주식 당일 종가 가져오는법
3시 30분이후인 주식장종료 이후 시점에 당일 종가를 가져오는 법이 없을까요?
이때 가져온 주식종가로, 3시 30분이후 3시45분까지 15분사이에 주식선물을 사는 프로그램을 최종적으로는 짜고싶은데요.
GetprevClose의 경우 1~100일 사이값만 가져올수 있고,
prevClose의 경우 3시 30분이후에 주식의 prevClose값을 불러와도,당일 종가가 아닌 하루전 종가값이 들어오네요.
주식 일봉차트를 넣고 완성시점값을 가져오면 구현은 가능하겠지만, 너무 지저분하고, 예스스팟을 쓰는만큼 왠만하면 차트는 안쓰고 싶습니다.
방법이 있을까요?
2017-08-22
2546
글번호 224206
답변완료
수식좀 봐주세요
리버스 전략에 적용하는 스팟식입니다
1. 매수, 매도 신호발생시 기존 미체결 주문을 취소하고, 신규 신호를 1초단위로 계속 신호가로 1계약씩 주문 발생
2. 동시호가 잔고 청산
힘들게 만들었는데 계속 오류가 나네요. 수정좀 부탁드립니다.
var Tcnt1,Tcnt2,BP,SP;
function Main_OnStart()
{
//99번 타이머,10초 간격
Main.SetTimer(99,10000);
}
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
// 미체결 주문취소
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList("미체결 주문 취소");
BP = Signal.price;
//매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt1 = 0;
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
// 미체결 주문취소
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList("미체결 주문 취소");
SP = Signal.price;
//매도주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//2번 타이머 1초 셋팅
Main.SetTimer(2, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt2 = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt1 = Tcnt1+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, BP,0);
// 매도신호가 뜨면 1초단위 매수 주문 발생 취소
if (Signal.signalKind == 3)
{
Main.KillTimer(1);
}
}
//2번타이머
if (nEventID == 2)
{
//카운트가 1씩 증가
Tcnt2 = Tcnt2+1;
//타이머 동작시마다 주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, SP,0);
// 매수신호가 뜨면 1초단위 매도 주문 발생 취소
if (Signal.signalKind == 1)
{
Main.KillTimer(2);
}
}
}
// 동시호가 청산
function Main_OnStart()
{
Main.MessageLog("시작")
Main.SetTimer(3, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 3 && HHMMDD >= 153600)
{
Main.KillTimer(3);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
2017-07-28
2755
글번호 224200
답변완료
(글수정) 스팟 오류인것 같습니다.
글 수정합니다.
다른 질문을 올립니다.
스팟 오류를 발견한것 같습니다.
제가 Win7과 WinXP에서 매매를 하고 잇는데요.
같은 스팟 수식과 변수 설정으로 해놧는데 Win7에서는 오류없이 돌아가는데 WinXP는 오류가 납니다.
수식은 선물신호를 받아서 옵션 매수를 하는 수식입니다.
아래와 같습니다.
=======================================================================
//계좌객체 추가 : Account1
//챠트객체 추가 : Chart1 //예트챠트명과 일치
//옵션데이타 추가 : Option
//입력변수 추가 : Near //숫자형, 진입하고자 하는 가까운 옵션값
//입력변수 추가 : Vol // 진입수량
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
var BC, BP;
function Main_OnStart()
{
T = 0;
Main.MessageList("옵션매수 전용시작");
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
T = 1;
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-Near);
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]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
BC = CallOrderCode;
Account1.OrderBuy(BC, Vol, Option.GetAskByCode(BC, 5), 0);
}
}
if (T == 1 && Signal.signalKind == 2)
{
T = 0;
Account1.OrderSell(BC, Vol, Option.GetBidByCode(BC, 5), 0);
Main.MessageList("ExitLong신호 발생");
}
if (Signal.signalKind == 3)
{
T = -1;
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-Near);
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 (PP < 99999999)
{
BP = PutOrderCode;
Account1.OrderBuy(BP, Vol, Option.GetAskByCode(BP, 5), 0);
}
}
if (T == -1 && Signal.signalKind == 4)
{
T = 0;
Account1.OrderSell(BP, Vol, Option.GetBidByCode(BP, 5), 0);
Main.MessageList("ExitShort신호 발생");
}
}
//동시호가 청산
function Main_OnStart()
{
Main.MessageLog("시작")
Main.SetTimer(3, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 3 && HHMMDD >= 153600)
{
Main.KillTimer(3);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
===============================================================
모든 설정(차트객체, 계좌객체, 옵션객체, Near변수, Vol변수)을 양쪽 컴퓨터에 다 똑같이 했는데요 Win7에서는 정상 작동하고 WinXP에서는 Range Error: Invalid array length 에러가 납니다.
제가 XP 노트북에 자동주문을 틀어놓고 하는데요. 다른분들은 계속 수식이 정상작동 한다는데 저만 오류가 나서 Win7에 세팅을 하고 보니까 에러가 나지 않는 것입니다.
스팟 프로그램상의 오류가 아닌가 합니다. XP에서도 오류 안나게 할 수 있는 방법은 없나요? 이 컴퓨터에 여러가지 메크로 세팅등등을 해놔서 다른 컴퓨터에 또 세팅하는게 여간 힘든데....
2017-07-12
2768
글번호 224192