예스스탁
예스스탁 답변
2024-03-18 16:37:44.0
안녕하세요
예스스탁입니다.
1
문의하신 내용은 확장차트에 적용하는 전략식을
전략생성기가 아닌 예스랭귀지 시스템식으로 작성해서 적용하셔야 합니다.
스팟수식으로는 지표계산이 가능하지 않아 BII상승시 매도제외를 구현할 수 없습니다.
아래는 청산신호시에 차트객체 삭제를 추가한 식입니다.
2
var ItemList = [],CT = [];
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.MessageList("종목수:",ItemList.length);
if (ItemList.length > 0)
{
ReqCount = 0;
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);
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == ItemList[ReqCount])
{
//차트객체 CT 배열변수에 추가
CT.push(ChartEx);
ReqCount = ReqCount+1;
if (ReqCount < ItemList.length)
{
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);
}
else
{
Main.MessageList(ReqCount,"확장차트생성종료:",CT.length);
}
}
}
//신호발생
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("매도주문");
}
//전체 확장차트를 호출해서
for (var i = 0; i < CT.length; i++)
{
//신호발생한 차트의 종목코드와 확장차트를 저장한 객체 중 같은 종목코드를 찾아서
if (ChartEx.GetCode(1) == CT.GetCode(1))
{
//확창차트 객체 삭제
Main.RemoveObject(CT[i])
CT.splice(i,1)
}
}
}
}
즐거운 하루되세요
> 하늘구름 님이 쓴 글입니다.
> 제목 : 보유종목을 확장차트생성해서 매도
> 안녕하세요
아래식으로 보유종목을 확장차트생성해서 매도 테스트 중인데요
전략생성기에서 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("매도주문");
}
}
}
예스스탁
예스스탁 답변
2024-04-26 13:38:11.0
안녕하세요
예스스탁입니다.
CT객체에 방번호 지정이 빠져있었습니다.
아래식 실행해 보시고 다시 문제가 발생하면 02-3453-1060으로 전화주시기 바랍니다.
var ItemList = [],CT = [];
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.MessageList("종목수:",ItemList.length);
if (ItemList.length > 0)
{
ReqCount = 0;
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);
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == ItemList[ReqCount])
{
//차트객체 CT 배열변수에 추가
CT.push(ChartEx);
ReqCount = ReqCount+1;
if (ReqCount < ItemList.length)
{
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);
}
else
{
Main.MessageList(ReqCount,"확장차트생성종료:",CT.length);
}
}
}
//신호발생
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("매도주문");
}
//전체 확장차트를 호출해서
for (var i = 0; i < CT.length; i++)
{
//신호발생한 차트의 종목코드와 확장차트를 저장한 객체 중 같은 종목코드를 찾아서
if (ChartEx.GetCode(1) == CT[i].GetCode(1))
{
//확창차트 객체 삭제
Main.RemoveObject(CT[i])
CT.splice(i,1)
}
}
}
}
즐거운 하루되세요
> 하늘구름 님이 쓴 글입니다.
> 제목 : Re : Re : 잘 안돼요. 다시 한번 부탁드려요.
> 안녕하세요.
추가해 주신 수식 감사합니다.
그런데 첨부한 파일처럼 에러가 나서 매도된 종목의 확장차트가 삭제가 안돼내요.
다시 한번 검토 수정 부탁드립니다.