예스스탁
예스스탁 답변
2018-12-26 17:46:30
안녕하세요
예스스탁입니다.
1
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.current),0,1);
차트객체에는 current가 제공되지 않으므로 ChartEx.current 를 ChartEx.GetClose(1,0) 으로 변경해 주시면 됩니다.
2
아래 내용 참고하시기 바랍니다.
3분(180초) 간격으로 검색하게 수정했습니다.
기존에 이미 차트를 생성한 종목은 별도로 리스트(reqItemList)를 관리해서
다음 검색후 요청때에는 중복되지 않은 종목만 요청하게 수정했습니다.
var reqItemList = []; //검색되서 차트요청한 종목에 대해 종목코드를 저장할 배열변수
var ItemList = []; //검색된 종목 중 reqItemList에 없는 종목에 대해 종목코드를 저장한 배열변수장
var Count; //요청할 종목갯수
var ReqCount; //종목검색 후 차트객체 요청한 종목갯수
function Main_OnStart()
{
Main.MessageList("스팟시작");
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색완료 : 검색된 종목수 : ",nCount);
//ItemList 변수 초기화
ItemList = [];
//검색종목수가 1개 이상일떄만 수행
if (nCount > 0)
{
//reqItemList에 저장된 종목코드가 한개도 없을때
if (reqItemList.length == 0)
{
//ItemList 배열변수에 aItemList를 차례대로 모두 옮김
Count = 0;
for (var i = 0; i < nCount; i++)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
else//reqItemList에 저장된 종목코드가 한개이상일때
{
//검색된 종목 중 reqItemList에 없는 종목만 ItemList에 담음
Count = 0;
for (var i = 0; i < nCount; i++)
{
var add = true;
for (var z = 0; z < reqItemList.length; z++)
{
if (aItemList[i] == reqItemList[z])
{
add = false;
Main.MessageList("이미 차트생성된 종목 : ",aItemList[i]);
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
}
//생성할 종목수가 1개 이상일떄
if (Count > 0)
{
Main.MessageList("차트객체 생성시작 : 생성할 종목수 : ",Count,ItemList);
Main.SetTimer(1, 1000);
ReqCount = 0;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 2)
{
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(
new StopLoss(5, CALCMETHOD_PERCENT, 0),
new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0),
new StopProfitTarget(10, CALCMETHOD_PERCENT, 0),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(230000));
var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
//생성요청한 종목에 대해 reqItemList에 종목코드 추가
reqItemList.push(ItemList[ReqCount]);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageList("차트객체 생성완료 : 생성된 종목수 : ",ReqCount);
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
}
//잔고수량만큼만 매도
}
즐거운 하루되세요
> stockric 님이 쓴 글입니다.
> 제목 : 질문드립니다.
> var ItemList;
var Count;
var ReqCount;
function Main_OnStart()
{
Main.MessageLog("스팟시작");
Main.MessageLog("종목검색시작");
Main.ReqPowerSearch("급등주검색");
}
function Main_OnRcvItemList(aItemList, nCount)
{
ItemList = aItemList;
Count = nCount;
Main.SetTimer(1, 1000);
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(new StopLoss(5, CALCMETHOD_PERCENT, 0),
new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0),
new StopProfitTarget(10, CALCMETHOD_PERCENT, 0),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(230000));
var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageLog("종목검색완료");
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.current),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고수량만큼만 매도
1. 위와같이 구성할 경우 종목검색도 끝마치고, 확장차트까지 불러와줍니다.
근데 그 이후 수량을 선택하지 않았다며 주문이 나가질 않네요. 저는 수량보다 주문금액으로 처리하고싶습니다만... 어디가 문제인지요?
2. 위 수식에 종목검색을 3분주기로 계속 하며 검색을 할 수 있는 로직이 추가되었으면 좋겠습니다.