커뮤니티

예스스팟 Q&A

답변완료

시스템식 부탁드립니다.

항상 도움 주셔서 감사합니다. 아래 시스템식에서 하루 손실제한을 100 POINT로 제한하는 시스템식 부탁드립다. #=============================================== Inputs : SL(51); Inputs : TS(10),TP(50); Inputs : T1(100),T2(15); Inputs : shortPeriod(5), longPeriod(20), SPeriod(9); Var : MACDV(0), MACDsig(0) ; ### 해외선물 새벽시간 당일청산 ### if sDate != sDate[1] Then SetStopEndofday(060000); if Bdate != Bdate[1] Then SetStopEndofday(0); ### 일매매손익에 따른 손절 ### ##### 변수셋팅 ##### MACDV = MACD(shortPeriod, longPeriod); MACDsig = ema(MACDV,SPeriod); #-------------------------------------------------------------------------------------- ##### 매매로직 ##### #-------------------------------------------------------------------------------------- if sTime >= 140000 and sTime <=2400000 or stime >= 000000 and sTime <= 070000 Then { #-------------------------------------------------------------------------------------- #---------------------- # Long Entry 매수 #---------------------- If marketposition <= 0 and macdv > macdsig and macdv > 0 Then Begin Buy("B1",OnClose,DEf,amt); End; # Long Exit 익절 및 본청 if MarketPosition == 1 Then { if MaxEntries == 1 and C > dayopen() Then { ExitLong("BP1",AtLimit,AvgEntryPrice+T1); } if MaxEntries == 2 and C > dayopen() Then ExitLong("BP2",AtLimit,AvgEntryPrice+T2); if MaxEntries == 3 and C > dayopen() Then ExitLong("BP3",AtLimit,AvgEntryPrice+T2); if MaxEntries == 3 and C > dayopen() Then ExitLong("BL",AtStop,AvgEntryPrice-T2*6); if MaxEntries == 1 and C > dayopen() Then Buy("B2",AtLimit,LatestEntryPrice(0)-T2,1); if MaxEntries == 2 and C > dayopen() Then Buy("B3",AtLimit,LatestEntryPrice(0)-T2,1); } #---------------------- # Short Entry 매도 #---------------------- If marketposition >= 0 and macdv < macdsig and macdv < 0 Then Begin Sell("S1",OnClose,DEf,amt); End; # Short Exit 익절 및 본청 if MarketPosition == -1 Then { if MaxEntries == 1 and C < dayopen() Then { ExitShort("SP1",AtLimit,AvgEntryPrice-T1); } if MaxEntries == 2 and C < dayopen() Then ExitShort("SP2",AtLimit,AvgEntryPrice-T2); if MaxEntries == 3 and C < dayopen() Then ExitShort("SP3",AtLimit,AvgEntryPrice-T2); if MaxEntries == 3 and C < dayopen() Then ExitShort("SL",AtStop,AvgEntryPrice+T2*6); if MaxEntries == 1 and C < dayopen() Then Sell("S2",AtLimit,LatestEntryPrice(0)+T2,1); if MaxEntries == 2 and C < dayopen() Then Sell("S3",AtLimit,LatestEntryPrice(0)+T2,1); } #-------------------------------------------------------------------------------------- } //매매시간 종료 #-------------------------------------------------------------------------------------- ##### 포지션 익절, 손절 ##### #-------------------------------------------------------------------------------------- ##### 스탑로스 ##### SetStopLoss(SL,PointStop); SetStopTrailing(TS,TP,PointStop); 감사합니다.
프로필 이미지
양치기
2023-02-07
1376
글번호 225770

몸통공격 님에 의해서 삭제되었습니다.

프로필 이미지
몸통공격
2023-02-07
3
글번호 225769
답변완료

질문드립니다

현재 예스트레이더로 미국주식옵션 차트를 볼 수 있는 증권사가 어디어디있는지 알고 싶습니다. 전에 한국투자증권은 됐었던걸로 기억합니다. 혹시 더 있나요?
프로필 이미지
견유학자
2023-01-31
1310
글번호 225768

윤석한 님에 의해서 삭제되었습니다.

프로필 이미지
윤석한
2023-01-26
14
글번호 225767
답변완료

문의드립니다.

한국투자 증권에서 나스닥, 항생위주로 거래합니다. 해당 종목에서 수동으로 진입한 후 평가손익이 100만원(달러기준 1000) 이상일 경우 손익 /손절 하거나 평균체결가 대비 40틱 이상일 경우 손익 / 손절하는 수식 부탁드립니다.
프로필 이미지
정거장
2023-01-26
1287
글번호 225766

기사단장 님에 의해서 삭제되었습니다.

프로필 이미지
기사단장
2023-02-01
33
글번호 225765
답변완료

예스스팟 오류메세지 관련 문의

담당자님 안녕하세요. 항상 많은 도움 주셔서 감사드리며 덕분에 많은 발전을 이루고 있습니다. 기존에 올려주신 예스스팟 식을 참고하여 종목검색 후 차트 생성하여 시그널에 따다 매매를 일으키는 식을 작성하였습니다. 테스트를 위해 시험으로 가동하였는데, 첨부 스크린샷과 같이 '*계좌와 종목 불일치' 라는 오류메세지와 함께 매매가 거절당하였는데요 혹시 원인이 무엇인지 알 수 있을까요? 참고로 가려둔 계좌는 모두 동일한 계좌번호 입니다. 계좌 객체도 생성하였으며, 동일한 계좌번호와 연동시켜두었습니다. 참고차 작성한 수식도 공유드리오니 확인해주시면 감사하겠습니다. ------------------------------------------------------------------------- var 검색주기 = 180;//120초 var 최대종목수 = 30,M1; var ItemList = [],CT = []; var req; var JongmokNum ; var JongmokCode = new Array(10); var ChartSet = new Array(10); var SystemSet = new Array(10); //스팟 시작할때 파워종목검색의 사용자검색조건 실행 //스팟시작 function Main_OnStart() { //종목검색 타이머 Main.SetTimer(1,검색주기*1000)//300초, 1000이 1초 //잔고체크 타이머 Main.SetTimer(2,3000)//3초, 1000이 1초 Main.MessageList("start"); //종목당 매수금 M1 = Math.floor(Account1.GetBalanceETCinfo(0)/최대종목수);//하이기준 예수금 //주문종목갯수 CTcnt = 0; } //타이머동작 function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090000 && CT.length < 50) { Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("통합종목검색"); //사용자검색조건명 지정 } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); Main.MessageList("종목검색 완료 nCount : ",nCount); //보유종목수 var num = Account1.GetTheNumberOfBalances(); //검색된 종목이 1개이상 if (nCount > 0) { ItemList = []; //첫검색일때 if (CT.length == 0) { //옵션1. 개별 입력 + 최대 종목수 제한 for (var i = 0; i < Math.min(최대종목수-num,nCount); i++ ) { ItemList.push(aItemList[i]); } //옵션2. 배열 전체 입력 //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].code) { add = false; } } if (add == true) { ItemList.push(aItemList[i]); if (ItemList.length == 최대종목수-num) { break; Main.MessageList("break: 최대종목수 도달"); } } } } Main.MessageList("종목검색 완료 ItemList :",ItemList.length); //집계된 종목이 1개 이상이면 순차적으로 차트객체 요청 if (ItemList.length > 0 && CT.length < 최대종목수) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, //거래수량 100000, //자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ALL, // 피라미딩 설정여부 1000, // 최대진입수량 20); // 최대진입횟수 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("통합시스템", YL_TYPE_NORMAL, null, null, null); Main.MessageList("현재차트갯수 : ",CT.length); //다음 차트 객체 요청 Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else //검색된 종목이 없으면 { if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//종목검색 타이머 재실행 } } } } function Main_OnRcvChartEx(ChartEx) { if (ItemList[req] == ChartEx.GetCode(1)) { CT[CTcnt] = ChartEx; //차트 종목 코드 저장 Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1)); CTcnt = CTcnt +1; req = req + 1; if (req < ItemList.length && CT.length < 최대종목수) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, //거래수량 100000, //자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ALL, // 피라미딩 설정여부 1000, // 최대진입수량 20); // 최대진입횟수 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("통합시스템", YL_TYPE_NORMAL, null, null, null); Main.MessageList("현재차트갯수 : ",CT.length); //다음 차트 객체 요청 Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 최대종목수 이하이면 if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//120초 } } } } //신호발생 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(M1/Signal.price),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); Main.MessageLog("미체결 주문취소"); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } }
프로필 이미지
기사단장
2023-01-18
1316
글번호 225763

좌오비우오비 님에 의해서 삭제되었습니다.

프로필 이미지
좌오비우오비
2023-01-12
4
글번호 225761
답변완료

수정부탁드려요

밑의 수식을 9시 이후 실행 되게 해주세요 //스팟 첫 실행시 function Main_OnStart() { //1번 타이머, 60초 Main.SetTimer(1, 2000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { //종목검색 수행 Main.ReqPowerSearch("2") } } //종목검색 완료 function Main_OnRcvItemList(aItemList, nCount) { //1종목 이상 검색되면 if (nCount >= 1) { //리스트 첫종목부터 마지막종목까지 순차적으로 //1번 타이머 동작 for (var i = 0; i < nCount; i++) { //잔고를 셋팅 Account1.SetBalance(aItemList[i],0); //보유수량이 없으면 if (Account1.Balance.count < 1) { //매수주문 Account1.OrderBuy(aItemList[i], 1,0,1); } } } }
프로필 이미지
아무다
2023-01-12
1214
글번호 225760
답변완료

차트 여러개에 반복 작업하는 경우

초보적인 질문 같은데,어떻게 하는지 감이 안 오네요. 차트1~차트50 : 예스트레이더에 50개의 차트가 있고, 차트객체 생성후 아이디 연결했을경우, 신호 발생시에 아래와 같이, 각각 동일작업을 수행하려 합니다. 이벤트에 같은 코드에 차트이름만 바꿔서 50번 붙여넣기 안 하고 한개만 수정해도 다 적용되게 하는 방법이 있을까요? function Chart1_OnRiseSignal(Signal) { rowNum = Excel1.GetRowCount(1)+1; //엑셀 새 행번호 Excel1.SetData(1, "A"+rowNum, Chart1.GetSDate(1,0)); //신호날짜 Excel1.SetData(1, "B"+rowNum, Chart1.GetSTime(1,0));//신호시간 Excel1.SetData(1, "C"+rowNum, Chart1.GetCode(1));//신호코드 Excel1.SetData(1, "D"+rowNum, Chart1.GetClose(1,0));//신호가격 } function Chart2_OnRiseSignal(Signal) { rowNum = Excel1.GetRowCount(1)+1; //엑셀 새 행번호 Excel1.SetData(1, "A"+rowNum, Chart2.GetSDate(1,0)); //신호날짜 Excel1.SetData(1, "B"+rowNum, Chart2.GetSTime(1,0));//신호시간 Excel1.SetData(1, "C"+rowNum, Chart2.GetCode(1));//신호코드 Excel1.SetData(1, "D"+rowNum, Chart2.GetClose(1,0));//신호가격 } . . . . . . . . . . . . . function Chart50_OnRiseSignal(Signal) { rowNum = Excel1.GetRowCount(1)+1; //엑셀 새 행번호 Excel1.SetData(1, "A"+rowNum, Chart50.GetSDate(1,0)); //신호날짜 Excel1.SetData(1, "B"+rowNum, Chart50.GetSTime(1,0));//신호시간 Excel1.SetData(1, "C"+rowNum, Chart50.GetCode(1));//신호코드 Excel1.SetData(1, "D"+rowNum, Chart50.GetClose(1,0));//신호가격 }
프로필 이미지
doit
2023-01-03
1275
글번호 225757