커뮤니티

예스스팟 Q&A

답변완료

문의드립니다

예를 들어 1. 기존에 선물 롱포지션 10계약이 있는 상태 2. 차트 연계로 장중 매도 포지션 5계약 진입 3. 장중 매도 포지션 종가 단일가 청산. 이렇게 하려고 하면 매도 진입을 했을때 잔고는 여전히 롱포지션 5계약으로 되기때문에 메뉴얼에 당일청산 수식이 작동하지 않는 상황이 되어서 이런 상황을 감안하여 연계된 차트에 진입 수량만큼만 종가 단일가에 청산시키는 수식을 만들어주시면 감사히 쓰겠습니다.
프로필 이미지
시고르시고르
2021-08-28
1998
글번호 225545
답변완료

수식문의 드립니다.

안녕하세요! 아래 수식은 수정해주신것인데 작동시키면 매도는 잘되나 청산이 안되고, 매도한 상태에서 다시 부팅을 하면 청산이 될때도 있고 안될때도 있습니다. var EntryTime = 101700; var ExitTime = 102000; var MaxEnryVol = 10; var Entry,Exit,CurrentVol; var CSV,PSV,CSX,PSX; var CallOrderCode,PutOrderCode; function Main_OnStart() { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); Main.MessageList(HHMMSS,"Start"); Entry = true; if (HHMMSS >= EntryTime) { Entry = false; } Exit = true; if (HHMMSS >= ExitTime) { Exit = false; } if (Entry == true || Exit == true) { Main.MessageList(HHMMSS,"1번 타이머동작"); Main.SetTimer(1, 5000); } } function Main_OnTimer(nEventID) { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1) { if (Entry == true && HHMMSS >= EntryTime) { Main.MessageList(HHMMSS,"진입시작"); //양매도종목 CallOrderCode = Option.GetATMCallRecent(0); PutOrderCode = Option.GetATMPutRecent(0); Main.SetUserValue("SellDate",YYYYMMDD); Main.SetUserValue("CallOrderCode",CallOrderCode); Main.SetUserValue("PutOrderCode",PutOrderCode); Entry = false; if (ExitTime > EntryTime) Main.KillTimer(1); Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0); Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0); CurrentVol = 1; Main.SetTimer(2, 5000); } if (Exit == true && HHMMSS >= ExitTime) { Exit = false; if (ExitTime > EntryTime) Main.KillTimer(1); var SellDate = Main.GetUserValue("SellDate") Main.MessageList(HHMMSS,"청산시작",YYYYMMDD,SellDate); if (YYYYMMDD == SellDate) { CallOrderCode = Main.GetUserValue("CallOrderCode"); PutOrderCode = Main.GetUserValue("PutOrderCode"); if (CallOrderCode != "") { Account1.SetBalance(CallOrderCode, 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) CSV = Account1.Balance.count; else CSV = 0; if (CSV > 0) { Main.SetTimer(3, 5000); CSX = 1; Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0); } } if (PutOrderCode != "") { Account1.SetBalance(PutOrderCode, 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) PSV = Account1.Balance.count; else PSV = 0; if (PSV > 0) { Main.SetTimer(4, 5000); PSX = 1; Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0); } } } } } if (nEventID == 2) { CurrentVol = CurrentVol+1; if (CurrentVol <= MaxEnryVol) { Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0); Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0); } else { Main.KillTimer(2); } } if (nEventID == 3) { CSX = CSX+1; if (CSX <= CSV) { Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0); } else { Main.KillTimer(3); } } if (nEventID == 4) { PSX = PSX+1; if (PSX <= PSV) { Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0); } else { Main.KillTimer(4); } } }
프로필 이미지
팡팡
2021-08-28
2144
글번호 225544
답변완료

검색시 부탁합니다

300틱봉에서 21지수이평선과 55지수이평선을 기준으로 만약에 지수 이평선이 골든크로스시이고 MACD가 GC하면 매수, DC시에 매수청산 지수 이평선이 데드크로스이고, MACD가 DC시에 매도, GC시에 매도청산하는 식 부탁드립니다
프로필 이미지
라이블루
2021-08-22
2118
글번호 225534
답변완료

스팟 간단한 내용 검토요청

안녕하세요? 스팟수식 여쭤볼 곳이 없어서, 부득이 부탁드리고합니다. 아래 수식 목표는 단순 진입입니다. 차트에서 1계약 매수 / 매도 시그널 나오면 그대로 적용, 청산 신호 나오면 청산... 그런데 단순한 건데 이상하게 성능보고서와 다르게 청산이 되어도 잔고가 남아 있고... 오류가 있습니다. 검토요청드립니다. 청산시 잔고 없고, 신규 진입시 이전 물량 청산만 하면 됩니다. 다시 한 번 감사드립니다. ----------------------------------------------------------------- //진입청산주문을 모두 스팟에서 내게 하셔야 합니다. //차트에 시스템은 시험적용으로 적용하고 //신호가 발생하면 스팟에서 주문을 내고 추적해야 합니다. //차트객체추가 --> 속성에서 객체명은 Chart1, 아이디 부여해 차트와 연결 //종목객체추가 --> 속성에서 객체명은 MarketData1, 차트와 동일종목으로 지정 //계좌객체추가 --> 속성에서 객체명은 Account1, 계좌번호 지정 // 시장가 주문으로 변경(1)) var BID,Bnum,BIDx,Bnumx; var SID,Snum,SIDx,Snumx; function Main_OnStart() { Main.MessageLog("시작"); T = 0; } function Chart1_OnRiseSignal(Signal) { //매수신호 발생하면 신호수량으로 현재가 매수주문 if (Signal.signalKind == 1) { T = 1; //주문후 주문아이디 //주문번호로 미체결객체 셋팅 Account1.SetUnfillOrderNumber(Bnum); //미체결 잔량이 있으면 if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code)) { //취소 Account1.OrderCancel(Bnum); } //잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //매도수량이 있으면 매도수량만큼 매수로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { BIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1); } // 매수진입 BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.current, 1); } if (Signal.signalKind == 2) { T = 0; //주문번호로 미체결객체 셋팅 Account1.SetUnfillOrderNumber(Bnum); //미체결 잔량이 있으면 if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code)) { //취소 Account1.OrderCancel(Bnum); } //잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //매수수량이 있으면 매도로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { SIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Bid(3), 1) } //매도 신호 수량만큼 진입 SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count, MarketData1.Bid(3), 1) } //매도신호 발생하면 신호수량으로 현재가 매도주문 if (Signal.signalKind == 3) { T = -1; //잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //매수수량이 있으면 잔고만큼 매도로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1); } } if (Signal.signalKind == 4) { T = 0; //Snum에 저장된 주문번호로 미체결객체 셋팅 Account1.SetUnfillOrderNumber(Snum); //미체결 잔량이 있으면 if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code)) { //취소 Account1.OrderCancel(Snum); } //잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //매도수량이 있으면 잔고만큼 매수로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Ask(3), 1) } } } //주문응답수신 function Main_OnOrderResponse(OrderResponse) { //BID와 아이디가 같은 주문응답이면 if (OrderResponse.orderID == BID) { //매수주문번호를 Bnum에 저장 Bnum = OrderResponse.orderNum; } //SID와 아이디가 같은 주문응답이면 if (OrderResponse.orderID == SID) { //매도주문번호를 Snum에 저장 Snum = OrderResponse.orderNum; } //BIDx와 아이디가 같은 주문응답이면 if (OrderResponse.orderID == BIDx) { //매수주문번호를 Bnum에 저장 Bnumx = OrderResponse.orderNum; } //SID와 아이디가 같은 주문응답이면 if (OrderResponse.orderID == SIDx) { //매도주문번호를 Snum에 저장 Snumx = OrderResponse.orderNum; } }
프로필 이미지
심심00
2021-08-19
2343
글번호 225532

잼스딘 님에 의해서 삭제되었습니다.

프로필 이미지
잼스딘
2021-08-15
23
글번호 225525
답변완료

매수매도 수량 확인후 청산

매수매도가 체결되었는지 확인후 매수매도 청산하기 위해서 아래 프로그램을 사용하고자 합니다. 해외선물에서 지정가,+/_2호가로 매수매도를 위해서 BID = Account1.OrderBuy(Main.GetOrderCode(Signal.code),2,MarketData1.Bid(2),2); SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData1.Ask(2),2); 로 하였는데 맞게 된 건가요? ====================== 예제 =================== var BID,SID,BNum,SNum; function Main_OnStart() { Main.MessageList("Start") } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(Signal.code),2,MarketData1.Bid(1),2); Main.SetTimer(1,60000); } if (Signal.signalKind == 2) { Account1.SetUnfill(BNum); if ( Account1.Unfill.count > 0 ) { Account1.OrderCancel(Bnum); } Account1.SetBalance(Main.GetOrderCode(Signal.code), 2); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Ask(1),0) } } if (Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData1.Ask(2),2); Main.SetTimer(2,60000); } if (Signal.signalKind == 4) { Account1.SetUnfill(SNum); if ( Account1.Unfill.count > 0) { Account1.OrderCancel(Snum); } Account1.SetBalance(Main.GetOrderCode(Signal.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(1),2) } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; } if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID = Account1.OrderReplacePrice(Bnum,MarketData1.Ask(4); } } if (nEventID == 2) { Main.KillTimer(2); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID = Account1.OrderReplacePrice(Snum,MarketData1.Bid(4)); } } }
프로필 이미지
후따오
2021-08-12
2222
글번호 225524
답변완료

문의 드립니다.

틱차트에 연동된 지표의 데이타를 실시간으로 엑셀로 받아 엑셀로 다루고 싶은데요. 프로그램에 대해 전혀 몰라서... 설정하는 방법을 알 수 있을까요? 단지 실시간으로 엑셀에서 연동만 되면 됩니다.
프로필 이미지
종호
2021-08-12
2198
글번호 225523
답변완료

문의드립니다

아래와 같이 진입신호 청산신호 목표수익신호 3가지 신호로 된 예스스팟 가이드 시스템을 만들고 싶습니다 매수진입신호 신호가격 10틱 위로 매수주문 신호가격 15틱 위로 매도주문(목표수익신호미리주문) 매수목표수익신호 (매수진입신호시 미리 주문했기때문에 아무일없음) 매수청산신호 신호가격 10틱 아래로 매수청산주문 미체결 된 매수목표수익 주문취소 매도진입신호 신호가격 10틱 아래로 매도주문 신호가격 15틱 아래로 매수주문(목표수익신호미리주문) 매도목표수익신호 (매도진입신호시 미리 주문했기때문에 아무일없음) 매도청산신호 신호가격 10틱 위로 매도청산주문 미체결 된 매도목표수익 주문취소 감사합니다
프로필 이미지
파인애플
2021-08-09
2442
글번호 225522
답변완료

안녕하세요.. 명렁어 사전은 없나요.

예스랭귀지 편집기에서는 사전이 있어서.. 명령어 이해가 편했는데요. 스팟은 공용언어라 그런지.. 사전이 없어서 이해가 어렵네요. 참고할만한 방법이 없을까요
프로필 이미지
율담
2021-08-04
2723
글번호 225521
답변완료

종목검색 삭제

안녕하세요. 아래 수식에서 PSearch 종목검색후 종목검색조건에서 제외되어 파워종목검색에서 사라진 종목도 여전히 스팟에 남아 있는데요. 조건에서 제외되어 파워종먹검색에서 사라진 종목들은 스팟에서 검색 업데이트시 제외되도록 수정 부탁드립니다. var BL = [],req; var CT = [],MK = []; function Main_OnStart() { //처음 시작시 step은 0 step = 0; //시작시점의 보유종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장 if (num > 0) { BL = []; for(var i = 0 ; i < num ; i++) { Account1.SetBalance(i); BL.push(Account1.Balance.code); } Main.MessageList("BL : ",BL); if (BL.length >= 1) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); // 최대진입횟수 var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } } else //보유종목이 없으면 바로 1분 타이머 시작 { Main.MessageList("보유종목없음"); Main.SetTimer(1, 10000);//1번 타이머, 60초 } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == BL[req]) { Main.MessageList("차트객체생성 :",ChartEx.GetCode(1)); CT.push(ChartEx); Main.ReqMarketData(BL[req]); Main.MessageList("종목객체요청 :",BL[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == BL[req]) { Main.MessageList("종목객체생성 :",MarketData.code); MK.push(MarketData); req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } else { Main.SetTimer(1, 10000);//1번 타이머, 60초 Main.MessageList("보유종목차트생성완료",CT.length,MK.length); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); Main.ReqPowerSearch("PSearch"); } } function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목이 없으면 if (nCount == 0) { //타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } //검색된 종목이 있으면 if (nCount >= 1) { //검색된 종목과 기존 만든 차트들의 종목코드를 비교해 //차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가 BL = []; for(var i = 0 ; i < aItemList.length ; i++) { var add = true; for(var z = 0 ; z < CT.length ; z++) { if (aItemList[i] == CT[z].GetCode(1)) { add = false; break; } } if (add == true) { BL.push(aItemList[i]); } } Main.MessageList("BL : ",BL); //차트 생성해야할 종목이 있으면 차트요청 if (BL.length >= 1) { req = 0; //차트 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); } else //없으면 타이머 다시 셋팅 { Main.SetTimer(1, 100000);//1번 타이머, 60초 } } }
프로필 이미지
몬스터
2021-07-28
2602
글번호 225520