답변완료
보유종목을 확장차트생성해서 매도
안녕하세요
아래식으로 보유종목을 확장차트생성해서 매도 테스트 중인데요
전략생성기에서 BII 지표를 이용한 전략생성을 할 수가 없는 것 같아요
그래서 게시판에 RSI 순위와 관련해서 신호가 나오면 순위에 의해 매수하는 수식이 있는데
아래수식에 매도신호가 나와도 BII상승시에는 매도가 안되게 수식을 첨가해 주시면 감사하겠습니다. (Bii하락시에는 신호에 의해 매도)
매도시에는 매도된 종목만 확장차트가 삭제되는 수식도
추가해 주시면 감사하겠습니다.
추가로 전략생성기에 BII 폼도 만들어 지기를 기대합니다.
감사합니다.
var ItemList;
var Count;
var ReqCount;
function Main_OnStart()
{
Main.MessageLog("스팟시작");
//보유 종목수(보유종목지정 필요)
Count = Account1.GetTheNumberOfBalances();
Main.MessageList("보유 종목수 : ", Count);
ItemList = [];
//보유 종목코드를 ItemList로 옮김
for(var i = 0 ; i < Count ; i++)
{
//보유종목 코드 필요
Account1.SetBalance(i)
ItemList.push(Account1.Balance.code);
}
Main.SetTimer(1, 10000);
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, null, null);
Main.MessageList(ReqCount,"확장차트생성_",ItemList[ReqCount]);
Main.ReqChartEx(ChartSet,SystemSet);
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),1,0,1);
//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);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Main.MessageLog("매도주문");
}
}
}
답변완료
확장차트생성해서 신호에 의해 매수 매도
안녕하십니까?
아래 수식으로 테스트중인 데요
종목객체 생성제한으로 더이상 검색이 안되어 차트도 만들어 지지 않습니다.
초보라서 많이 어렵습니다.
수식을 첨가해 주시면 고맙겠습니다.
var 검색주기 = 30;//30초 1분
var ItemList = [],CT = [],MK = [];
var HHMMSS,req;
function Main_OnStart()
{
CTcnt = 0;//지역변수 선언 차트객체 생성 숫자를 표시
Main.MessageLog("시작");
Main.SetTimer(1, 10000);//타이머를 실행 ===> 5000을 입력하면 5초마다 이벤트가 발생
}
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();
//9시 이후에 1분간격으로 종목검색 확장차트가가 20개 이하일때 반복적으로 검색
if (nEventID == 1 && HHMMSS >= 090010 && CT.length < 20)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("검색");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount);
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (CT.length == 0)
{
ItemList = aItemList;
}
else //두번? 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < CT.length; x++ )
{
if (aItemList[i] == CT[x].GetCode(1))
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
Main.MessageList("종목검색 완료 ItemList : ",ItemList.length);
//집계된 종목이 1개 이상이면 순차적으로 차트객체 요청
//종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청
if (ItemList.length > 0 && CT.length < 20)
{
req = 0;
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정
1, // 거래수량
100000, // 고정자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_NONE, // 피라미딩 설정여부
100, // 최대진입수량
3); // 최대진입횟수
var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT),
//new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(20, CALCMETHOD_PERCENT),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT),
new StopEndOfDay(151500));
//차트설정 :종목, 주기3분 분봉, 조회건수 1500
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
if (CT.length < 20)
{
Main.SetTimer(1, 검색주기*1000);//30초
}
}
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ItemList[req] == ChartEx.GetCode(1))
{
CT[CTcnt] = ChartEx;
Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1));
Main.ReqMarketData(ItemList[req]);
Main.MessageList(CTcnt,"종목객체요청 : ",ItemList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (ItemList[req] == MarketData.code)
{
Main.MessageList(CTcnt,"종목객체생성 : ",MarketData.code);
MK[CTcnt] = MarketData;
CTcnt = CTcnt +1;
req = req + 1;
if (req < ItemList.length && CT.length < 20)
{
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정
1, // 거래수량
100000, // 고정자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_NONE, // 피라미딩 설정여부
100, // 최대진입수량
3); // 최대진입횟수
var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT),
//new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(20, CALCMETHOD_PERCENT),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
Main.MessageList("Search1 차트객체요청종료");
//만들어진 차트가 10개 이하이면
if (CT.length < 20)
{
Main.SetTimer(1, 검색주기*1000);//30초
}
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
//Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1);
// Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1);
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가
}
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);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
//Account1.OrderSell(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1);
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Main.MessageLog("매도주문");
}
}
}