예스스탁
예스스탁 답변
2018-12-24 17:05:07
안녕하세요
예스스탁입니다.
예스스팟에서 Main.ReqPowerSearch는
예스랭귀지로 작성한 수식명을 직접 지정하는 것이 아닙니다.
"파일을 열 수 없습니다."
위 메세지는 사용자조건검색명으로 저장된 이름이 없을때 발생합니다.
예스트레이더의 [3202] 파워종목검색화면이나
NH트레이더의 [5202] 종목검색화면에서
사용자검색조건으로 저장한 검색명을 지정해 검색을 수행합니다.
즐거운 하루되세요
> 절제9단 님이 쓴 글입니다.
> 제목 : 질문드립니다.
> 아래와 같은 yeslanguage 전략을 이용하는 걸 테스트 중인데요.
예스 검색식에서 만들어서 파워검색식이나 종목검색식에서는 결과가 잘 나옵니다.
그런데 스팟의 아래식에 test 종목(만든것) 이름을 넣어서 해보니,
"파일을 열 수 없습니다."
라는 에러가 뜨면서 안됩니다.
해결방법을 알려주시면 감사하겠습니다.
아래 업데이트는 *처리 하였습니다.
var cond,rcvChart,rcvMK, RcvChartEnd = false;
var item,itemcnt;
//아래 배열변수를 사용하는 이유는 동일종목의 정보는 배열변수의 동일방번호에 저장하기 위함입니다.
var CT = [];//차트객체 저장할 배열변수
var MK = [];//종목객체 저장할 배열변수
var IS = [];//미완성 신호횟수 저장할 배열변수
var VV = [];//주문수량 저장할 변수
var C1 = [];//첫 매수가격을 저장할 변수
var CC = [];//다음 하락시 가격을 저장할 변수
//스팟 시작시 종목검색 요청
function Main_OnStart()
{
Main.ReqPowerSearch("test");//사용자검색조건명 지정
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
rcvChart = 0;
}
//종목검색 완료(aItemList : 종목리스트), (nCount : 종목수)
function Main_OnRcvItemList(aItemList, nCount)
{
item = aItemList;
itemcnt = nCount;
RcvChart = 0;
RcvChartEnd = false;
//확장 챠트요청(최대 100개까지만 가능)
// 확장챠트의 생성과 적용될 시스템의 세부 설정
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
1000, // 최대진입수량
20); // 최대진입횟수
//종목검색된 종목의 차트와 종목객체 요청
for (var i = 0; i < Math.min(itemcnt,100); i++)
{
//생성할 차트 셋팅
var C1 = new ReqChartItem(item[i], 1, CHART_PERIOD_DAILY, 499,CHART_REQCOUNT_BAR,false, false);
//차트에 적용할 시스템명 및 설정
var S1 = new SystemInfo("DMI스팟",YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(C1,S1);
Main.ReqMarketData(item[i]);
}
}
//차트객체 수신받으면
//해당 종목의 종목검색순번과 같은 번호의 배열방에 차트객체저장
function Main_OnRcvChartEx(ChartEx)
{
for (var i = 0; i < Math.min(itemcnt,100); i++)
{
if (ChartEx.code == item[i])
{
CT[i] = ChartEx;
}
}
}
//차트객체 수신받으면
//해당 종목의 종목검색순번과 같은 번호의 배열방에 종목객체저장
function Main_OnRcvMarketData(MarketData)
{
for (var i = 0; i < Math.min(itemcnt,100); i++)
{
if (MarketData.code == item[i])
{
MK[i] = MarketData;
}
}
}
//각 차트의 새로운 봉이 생성
function Main_OnBarAppended(ChartEx, nData)
{
//차트와 종목객체 전체가 수신이 완료된 상태이고
if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) )
{
//새로운봉이 생성된 종목과 CT배열의 종목과 비교해
//같은 종목을 찾으면 미완성신호를 카운트 하는 배열변수의 동일방번호를 0으로 초기화
for (i = 0; i < Math.min(itemcnt,100); i++)
{
if (ChartEx.code == CT[i].code)
{
IS[i] = 0;
}
}
}
}
//확장챠트에서 발생한 신호에 의해 주문을 넣는 단계
function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal)
{
//차트와 종목객체 전체가 수신이 완료된 상태이고
if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) )
{
//잔고세팅
A1.SetBalance(IncompleteSignal.code, nPosition);
//buy신호 발생
if (IncompleteSignal.signalKind == 1)
{
//해당 종목의 방번호를 찾아서
for (i = 0; i < Math.min(itemcnt,100); i++)
{
if (ChartEx.code == CT[i].code && ChartEx.code == MK[i].code)
{
//카운트 1증가
IS[i] = IS[i]+1;
//현재 미완성신호 발생하고 해당종목의 잔고가 0이고 첫번째 매수미완성신호이면 매수
if (A1.Balance.count == 0 && IS[i] == 1)
{
// 매수주문
A1.OrderBuy(IncompleteSignal.code, IncompleteSignal.count , MK[i].Ask(3), 0);
//수량과 가격 저장
C1[i] = IncompleteSignal.price ;//최초매수가
CC[i] = 0.1;//하락시 가격 계산할 변수
VV[i] = (IncompleteSignal.price * IncompleteSignal.count)*0.1;//최초매수금의 10%
}
}
}
}
//잔고에 수량이 있고 청산신호 발생하면 청산
if (A1.Balance.count > 0 && IncompleteSignal.signalKind == 2)
{
// 매도주문
A1.OrderSell(IncompleteSignal.code, A1.Balance.count, MK[i].Bid(3), 0);
}
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//체결데이터 수신 업데이트
if (lUp*dateID == 20001)
{
//루프를 돌아 생성된 종목중 어떤 종목인지 파악
for (i = 0; i < Math.min(itemcnt,100); i++)
{
//어떤 배열방의 종목인지 찾았으면
if (sItemCode == MK[i])
{
//해당 종목 잔고셋팅
A1.SetBalance(MK[i].code, 0);
//잔고 수량이 있을때만
if (A1.Balance.count > 0)
{
//최초 매수가격의 2% 이상 상승하면 전량청산
if (MK[i].current >= C1[i]*1.02)
{
A1.OrderSell(MK[i].code,A1.Balance.count, MK[i].Bid(3), 0);
}
//하락시 매수할 가격이하이면 추가매수
if (MK[i].current <= Ci[i]*(1-CC[i]))
{
A1.OrderBuy(MK[i].code,Math.floor(VV[i]/MK[i].Ask(3)),MK[i].Ask(3), 0);
CC[i] = CC[i]+0.1;//0.1을 추가해줌
}
}
}
}
}
}