답변완료
3:40-4:00 시간외종가 주문
Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Close), MarketData.Close, 12);
이렇게 자동주문 예스스팟 나갔는데 "주문단가 잘못입력" 오류안내 메시지인데 뭐가 잘못되었는지 검토 및 수정 부탁드립니다..
추가 참조:
Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Close), 0, 12);으로 바꾸니 수량 문제 오류 안내되었고
Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Close), 0, 18);으로 바꾸니 udefined 오류 안내되었습니다.
답변완료
매수 주문 30초 이후 미체결 주문 취소 관련 문의
안녕하세요
다름 아니라 제가 아래 매수식으로 해서 사용하고 있고 일반적인 매수 주문에는 2호가 아래 주문으로 큰 무리 없이 진행이 되고 있습니다.
다만, 제가 2호가 아래 주문을 하다보니 체결이 안되고 위로 강하게 올라가는 종목이 있는데 그런 종목이 나중에 급락 시 매수되지 않도록 30초 뒤에 매수 주문 넣은 걸 취소하는 기능을 넣고 싶습니다.
수고 많으시겠지만 수식 한번 부탁드려도 될까요?
제가 혼자 timer 30초로 Account.SetUnfill 로 미체결 종목을 확인해서 OrderCancel 를 하는 것으로 생각되어서(맞을까요?)
이리저리 수식을 좀 수정하고 테스트를 해봤는데 도저히 제대로 작동을 안하네요 ㅠㅠㅠ
아마 삽입된 해당 명령어들의 위치 이상하고 허접해서 그런거 아닌가 싶은데..
혼자 계속 작업을 하다가 도저히 안되어서 문의를 드리게 되었습니다.
수고 많으시겠지만 여유 되실 때 한번 검토를 부탁 드립니다.
미리 감사드립니다.
var timer5 = 5;
var 매수금 = 100000;
var OrderList = [];
var MKList = [];
var req;
var 종목제한수 = 20;
function Main_OnStart()
{
Main.SetTimer(1, timer5 * 1000); // 1번 타이머, 1초
MKList = []; // 오늘 매수한 종목 관리 배열 초기화
}
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1 && HHMMSS > 090100 && HHMMSS < 143000)
//14:30까지로 변경
{
Main.ReqPowerSearch("매수조건");
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1)
{
if (MKList.length == 0)
{
OrderList = aItemList.slice(0, 종목제한수); // 한정된 수만 가져오기
}
else
{
for (var a = 0; a < nCount; a++)
{
var Add = true;
for (var b = 0; b < MKList.length; b++)
{
if (aItemList[a] == MKList[b].code)
{
Add = false;
}
}
if (Add == true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]); // 제한 수를 넘는 경우 break
if (OrderList.length >= 종목제한수)
{
break;
}
}
}
}
if (OrderList.length == 0)
{
Main.SetTimer(1, timer5 * 1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
else // 추가(검색된 종목이 없으면 검색 타이머 재설정)
{
Main.SetTimer(1, timer5 * 1000);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code))
{ // 계좌에 없는 경우에만 매수
Account1.OrderBuy(MarketData.code, 1, MarketData.current - MarketData.GetTickSize()*2, 0);
Main.MessageList(MarketData.code + " 주식을 매수합니다.");
}
else
{
Main.MessageList(MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
req = req + 1;
if (req < OrderList.length)
{
var aa = Main.ReqMarketData(OrderList[req]);
if (aa == -1)
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer5 * 1000);
}
}
}
function IsStockInAccount(stockCode)
{
// 계좌에 해당 종목이 있는지 확인하는 함수
var numberOfBalances = Account1.GetTheNumberOfBalances();
for (var i = 0; i < numberOfBalances; i++)
{
Account1.SetBalance(i);
if (stockCode == Account1.Balance.code)
{
return true; // 계좌에 같은 종목이 있으면 true 반환
}
}
return false; // 계좌에 같은 종목이 없으면 false 반환
}