커뮤니티
예스스팟 Q&A
답변완료
예스트레이더 진입및 청산에 대해서
제가 수식을 만들었는데
이게 진입청산해서 수익률이 나오긴하는데
이 진입청산이 뭐 대기없이 그 신호오면 바로 사진다는걸 전제로 하는거겠죠?
2016-12-01
2298
글번호 224047
답변완료
질문드립니다.
예스트레이더에서 스팟으로 신호가 넘어올때
즉, 차트객체를 이용할시에
차트설정에서 상대1호가, 우선1호가 등을 설정하면,
signal.price로 넘어올때 그 설정상태의 시그널 가격으로 넘어오는 것인지?
아니면
그냥 차트의 돌파가격을 기준으로 신호가 들어와서
스팟에서 상대1호가, 우선1호가 등을 설정을 해야 하는 것인지 궁금합니다.
2016-11-28
2215
글번호 224046
답변완료
수식 문의 드립니다.
안녕하세요
당일청산 선물신호 시스템 을 이용한, 아래 스팟수식으로 당일손실제한(1.0 PT)
전량 청산할경우, 당일 추가 선물신호가 발생해도 추가 진입이 안되도록 수정
요청 드립니다.
(스팟수식으로 당일손실제한정산 될 경우, PT 청산 메시지 출력 요청 드림니다)
감사합니다.
스팟수식요류
if (Signal.signalKind == 3 sumPL > 당일손실제한) => ReferenceError 오류
=> if (Signal.signalKind == 3, sumPL > -1.0) 수정 확인 점검 요청드림니다.
스크립트 객체설정
차트객체 추가 --> 속성에서 객체명은 Chart1, 아이디 연결
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호 지정
종목객체 추가 --> 속성에서 객체명은 MarketData1, 주문낼 종목으로 지정
입력변수 추가 --> 속성에서 변수명은 당일손실제한, 초기값 음수로 지정, 데이터형 숫자
var sumPL; -1.0 //당일손실제한 1.0 PT 설정
var BuyID, BxID, SellID,SxID;
var BuyNum, BxNum, SellNum,SxNum;
var BuyAvg,SellAvg;
var EntryStart,Dayloss,sumPL,T;
function Main_OnStart()
{
sumPL = 0;
T = 0;
EntryStart = false;
Dayloss = false;
Main.SetTimer(1, 5000);
}
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1 && Dayloss == false)
{
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0);
EntryStart = true;
}
//매수청산신호 발생
if (EntryStart == true && Signal.signalKind == 2)
{
//매수진입 미체결 있으면 취소
Account1.SetUnfill(BuyNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
}
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수포지션 잔고 평단가 저장
BuyAvg = Account1.Balance.avgUnitCost;
BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0);
T = 1;
}
}
//매도진입신호 발생
if (Signal.signalKind == 3 sumPL > 당일손실제한) <============= 수식요류메세지
{
SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(3), 0);
EntryStart = true;
}
//매도청산신호 발생
if (EntryStart == true && Signal.signalKind == 4)
{
//매수진입 미체결 있으면 취소
Account1.SetUnfill(SellNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
}
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
//매도포지션 잔고 평단가 저장
SellAvg = Account1.Balance.avgUnitCost;
SxID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0);
T = -1;
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID)
BuyNum = OrderResponse.orderNum;
if (OrderResponse.orderID == BxID)
BxNum = OrderResponse.orderNum;
if (OrderResponse.orderID == SellID)
SellNum = OrderResponse.orderNum;
if (OrderResponse.orderID == SxID)
SxNum = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
//매수청산신호의 체결이 수신되면
if (NotifyFill.orderNum == BxNum)
{
sumPL = sumPL +(NotifyFill.fillPrice-BuyAvg)*NotifyFill.fillCount;
}
//매도청산신호의 체결이 수신되면
if (NotifyFill.orderNum == SxNum)
{
sumPL = sumPL +(SellAvg-NotifyFill.fillPrice)*NotifyFill.fillCount;
}
}
function Main_OnTimer(nEventID)
{
if (EntryStart == true && T == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
tempPL = sumPL+(Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count;
if (tempPL <= 당일손실제한)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0);
Dayloss = true;
}
}
}
if (EntryStart == true && T == -1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
tempPL = sumPL+(Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count;
if (tempPL <= 당일손실제한)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(3), 0);
Dayloss = true;
}
}
}
}
2016-11-25
2344
글번호 224044
관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
2016-11-24
7
글번호 224043
관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
2016-11-18
26
글번호 224042
답변완료
당일청산
15:10:00 당일청산 예스스팟수식을 부탁드립니다.
2016-11-23
2261
글번호 224040
답변완료
타종목2개 추가후 차트객체이용시 signalkind 에러
타종목2개 추가후 차트객체이용시 signalkind 에러
1. 타종목 차트 2개를 차트에 추가
data1 : 연결선물
data2 : 외국인선물 순매수
data3 :KP외국인 순매수
2. 예스스팟 차트객체와 차트 연결
3. 차트에서 매도 신호 발생후, 매수신호 전환 (리버스 신호)
signalkind 3 => 1 으로 변경될거로 예상해으나 1 이 아닌 0 으로 나옴
2016-11-08
2175
글번호 224033
답변완료
부탁드리겠습니다..
안녕하세요?
제가 시스템식으로 당일매매를 하고 있습니다.
종목객체에서 수신된 매수/매도신호가 당일에 발생이 되지 않는 경우,
수동으로 매도처리를 하고 있습니다.
즉, 종목객체에서 수신되는 매수/매도 신호외 과거 보유종목이 있으면
보유종목의 평단을 수신하여 평단대비 4%대면 매도를 할 수 있는 식을
추가로 부탁드리겠습니다.
아래식으로 시스템을 입혀서 종목객체를 수신하였습니다.
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
RcvData = RcvData+1;
DataReq = false;
EntryItem[RcvData] = MarketData.code;
EntryObject[RcvData] = MarketData;
Account1.SetBalanceItem(MarketData.code,0);
Main.MessageList("종목수신",EntryObject[RcvData]);
Main.MessageList(RcvData,"번째 종목생성",MarketData.name);
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 기타정보들..)
var C1 = new ReqChartItem(EntryObject[RcvData].code, 기타정보들..)
var S1 = new SystemInfo("당일매매식",YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(C1,S1);
}
function Main_OnRiseSignal(ChartEx, Signal)
{
for (var i = 1; i <= RcvData; i++)
{
if (EntryObject[i].code == ChartEx.GetCode(1))
{
if (Signal.signalKind == 1)
{
BuyVol[i] = 0;
if (EntryObject[i].tradeUnit == 1)
BuyVol[i] = Math.floor(EntryMoney/EntryObject[i].Ask(5) );
else
BuyVol[i] = Math.floor((EntryMoney/EntryObject[i].Ask(5) )/EntryObject[i].tradeUnit);
Account1.OrderBuy(Signal.code,BuyVol[i],EntryObject[i].Ask(5),0); Main.MessageList("매수주문종목 : ",Signal.code);
}
if (Signal.signalKind == 2)
Account1.OrderSell(Signal.code,BuyVol[i],EntryObject[i].Bid(5),0); Main.MessageList("매도주문종목 : ",Signal.code);
}
}
}
2016-11-05
2217
글번호 224032
답변완료
(간단한 질문)엑셀 연동 관련
질문 1. 예스스팟에서 예스트레이더를 지원하지 않는 증권사 API를 이용하여 바로 주문이 가능한가요?(예스스팟 → 타 증권사 API)
질문 2. 만약 가능하지 않다면, 예스스팟에서 엑셀이나 C++로 신호를 보내서 예스트레이더를 이용하지않는 증권사로 신호를 보내 매수 매도를 할 수 있나요? (예스스팟 → 엑셀 이나 C++ → 타 증권사 API)
2016-11-03
2161
글번호 224031
답변완료
수식을 만들었는데 에러가 납니다.
제가 만들어봤는데 에러가 나고 주문이 안됩니다.
1. 매수(도)신호가 나오면 신호가로 매수(도) 주문이 1계약 들어가고 그 뒤로 5분간 1초에 한번씩 매수(도)주문이 반복해서 들어감(1계약 -> 1계약 -> 1계약 계속적으로 5분간 반복 주문)
2. 동시호가에 잔고가 있으면 시장가 청산
현재 신호가로 주문이 잘 반복적으로 주문되지도 않고 시장가로 청산도 안됩니다. 어디가 문제인가요? 수정 부탁드립니다. 감사합니다.
var Tcnt;
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
//매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt = Tcnt+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
// 4분 50초가 290초 이므로 카운트가 290번이 되면 1번 타이머 종료
if (Tcnt == 290)
{
Main.KillTimer(1);
}
}
}
var Tcnt;
function Chart1_OnRiseSignal(Signal)
{
//매도진입신호 발생
if (Signal.signalKind == 3)
{
//매도주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt = Tcnt+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
// 4분 50초가 290초 이므로 카운트가 290번이 되면 1번 타이머 종료
if (Tcnt == 290)
{
Main.KillTimer(1);
}
}
}
//15시 36분에 잔고에 포지션 있으면 청산
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//15시 36분 이후
if (nEventID == 1 && HHMMSS >= 153600)
{
//타이머 종료
Main.KillTimer(1);
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수포지션이면
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
//매도포지션이면
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
2016-10-26
2093
글번호 224028