답변완료
질문입니다.
주가지수선물을 거래하기 위해서,
예스랭귀지로 시스템을 작성하였고,(1계약을 거래하는 시스템)
예스스팟으로 주문을 컨트롤 할려고 합니다.
질문1.
예스랭귀지에서 나온 신호를 채결시키되,
만약 채결이 이루어지지 않은 경우 10초 간격으로
채결이 이루어질때까지 현재가로 주문정정을 넣는 것입니다.
질문2.
만약, 현재 시스템의 시그널이 매수(혹은 매도)이고,
손매매로 매수(혹은 매도)로 진입해 주었다면,
다음 시그널인 매수청산(혹은 매도청산)부터 작동하도록 예스스팟을 구성하고,
만약, 현재 시스템의 시그널이 매수(혹은 매도)이지만,
실재로 포지션이 없다면 시스템의 다음 진입신호부터 작동하도록 예스스팟을 작성하고 싶습니다.
즉, 예스스팟 시작시 포지션에 진입해있다면 청산시그널부터 실행하고,
시작시 포지션이 없다면 다음 진입시그널부터 실행하도록 만들고 싶습니다.
질문1.과 질문2.를 요약하자면 다음과 같습니다.
"
예스스팟 시작시 실제 포지션이 있다. -> 해당포지션의 청산부터 예스스팟 작동.
예스스팟 시작시 실제 포지션이 없다. -> 시스템의 다음 진입신호부터 예스스팟 작동.
미체결시에는 채결이 될때까지 10초마다 현재가로 주문을 정정한다.
(단, 현재가가 10초전에 주문한가격과 다를때만 주문을 정정한다.)
"
제가 스스로 만들고, 수정을 해본 코드입니다.
불편을 드려 죄송하지만, 제깐에는 간절하고 급해서 그럽니다.
살펴보시고 수정보완 부탁드립니다.
한가지 추가 요청사항은 체결이 완성된 경우,
"매수(매도, 매수청산, 매도청산, 매수정정, 매도정정) 체결완료"라는
메세지를 띄우고 싶습니다.
부탁드립니다.
다시한번 감사합니다.
var Position;
var OrderCode;
var BID;
var BNum;
var SID;
var SNum;
function Main_OnStart()
{
// 시작. "Start" 출력.
Main.MessageLog("Start");
// 시스템을 연결선물에 적용. 따라서 주문용 종목코드를 리턴받아 OrderCode에 저장.
OrderCode = Main.GetOrderCode(MarketData1.code);
// 현재 포지션이 매도나 매수가 아니라면,
if (Account1.Balance.position != 1 && Account1.Balance.position != 2)
{
// Position에 0 대입.
Position = 0;
// 포지션이 없으므로 "Current Zero" 출력.
Main.MessageLog("Current Zero");
}
// 현재 포지션이 매도라면,
if (Account1.Balance.position == 1)
{
// Position에 -1 대입.
Position = -1;
// 포지션이 매도이므로 "Current Short" 출력.
Main.MessageLog("Current Short");
}
// 현재 포지션이 매수라면,
if (Account1.Balance.position == 2)
{
// Position에 1 대입.
Position = 1;
// 포지션이 매수이므로 "Current Long" 출력.
Main.MessageLog("Current Long");
}
}
function Chart1_OnRiseSignal(Signal)
{
// 완성된 시그널 출력.
Main.MessageLog("Signal:"+Signal.signalKind);
// 시그널 종류가 매수라면,
if (Signal.signalKind == 1)
{
// Position에 1 대입.
Position = 1;
// 주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문.
// BID에 주문식별번호 저장.
BID = Account1.OrderBuy(OrderCode, Signal.count, 0, 1);
// 매수진입 "Long" 출력
Main.MessageLog("Long");
}
// 시그널 종류가 매수청산이라면,
if (Position == 1 && Signal.signalKind == 2)
{
// Position에 0 대입.
Position = 0;
// 주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문.
// SID에 주문식별번호 저장.
SID = Account1.OrderSell(OrderCode, Signal.count, 0, 1);
// 매수청산 "ExitLong" 출력
Main.MessageLog("ExitLong");
}
// 시그널 종류가 매도라면,
if (Signal.signalKind == 3)
{
// Position에 -1 대입.
Position = -1;
// 주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문.
// SID에 주문식별번호 저장.
SID = Account1.OrderSell(OrderCode, Signal.count, 0, 1);
// 매도진입 "Short" 출력
Main.MessageLog("Short");
}
// 시그널 종류가 매도청산이라면,
if (Position == -1 && Signal.signalKind == 4)
{
// Position에 0 대입
Position = 0;
// 주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문.
// BID에 주문식별번호 저장.
BID = Account1.OrderBuy(OrderCode, Signal.count, 0, 1);
// 매도청산 "ExitShort" 출력
Main.MessageLog("ExigShort");
}
}
function Main_OnOrderResponse(OrderResponse)
{
// 해당 주문응답이 현재 전략에서 발생한 주문이라면,
if (OrderResponse.orderID == BID)
{
// BNum에 주문응답객체의 주문번호를 저장하고,
BNum = OrderResponse.orderID;
// Timer1을 실행(10초 간격).
Main.SetTimer(1, 10000);
}
// 해당 주문응답이 현재 전략에서 발생한 주문이라면,
if (OrderResponse.orderID == SID)
{
// SNum에 주문응답객체의 주문번호를 저장하고,
SNum = OrderResponse.orderID;
// Timer2를 실행(10초 간격).
Main.SetTimer(2, 10000);
}
}
function Main_OnTimer(nEventID)
{
// 현재 실행된 Timer가 1이고,
if (nEventID == 1)
{
// ???
Account1.SetUnfillOrderNumber(BNum);
// 미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != MarketData1.current)
{
// 가격을 현재가로 정정하여 정정주문.
BID = Account1.OrderReplacePrice(BNum, MarketData1.current);
// Timer1 종료.
Main.KillTimer(1);
}
}
// 현재 실행된 Timer가 2이고,
if (nEventID == 2)
{
// ???
Account1.SetUnfillOrderNumber(SNum);
// 미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != MarketData1.current)
{
// 가격을 현재가로 정정하여 정정주문.
SID = Account1.OrderReplacePrice(SNum, MarketData1.current);
// Timer2 종료.
Main.KillTimer(2);
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
// 주문 체결되면,
if (NotifyFill.orderNum == BNum)
{
// Timer1 종료.
Main.KillTimer(1);
// 미체결수량이 체결되면, "Long OrderReplacePrice" 출력
Main.MessageLog("Long OrderReplacePrice");
}
// 추문 체결되면,
if (NotifyFill.orderNum == SNum)
{
// Timer2 종료
Main.KillTimer(2);
// 미체결수량이 체결되면, "Short OrderReplacePrice" 출력
Main.MessageLog("Short OrderReplacePrice");
}
}
2017-12-13
2768
글번호 224262
답변완료
예스스팟 모니터에 텍스트 출력 문의
매수, 매도, 청산 실행시에 예스스탁 모니터에 텍스트 출력을 하고 싶은데
출력이 되지 않습니다. 수식에 오류가 있는지 알고 싶습니다
챠트객체 아이디도 챠드아이디와 동일 하고 스팟 적용시 붉은 색으로 적용 표시도 됐는데
최근 메세지에 텍스트가 출력 되지 않네요.
예스글로벌을 사용하고 있습니다.
function system1_OnRiseSignal(Signal)
{
//매수신호 발생
if(Signal.signalKind == 1)
{
Main.MessageLog("1buy")
Main.OrderBuy(Account1.number, CME.code, 1, CME.Ask(5), 2);
}
//매수청산신호 발생
if(Signal.signalKind == 2)
{
Main.MessageLog("2exitlong")
Main.OrderSell(Account1.number, CME.code, 1, CME.Bid(5), 2);
}
//매도신호 발생
if(Signal.signalKind == 3)
{
Main.MessageLog("3sell")
Main.OrderSell(Account1.number, CME.code, 1, CME.Bid(5), 2);
}
//매도청산신호발생
if(Signal.signalKind== 4)
{
Main.MessageLog("4exitshort")
Main.OrderBuy(Account1.number, CME.code, 1, CME.Ask(5), 2);
}
}
2017-11-26
2811
글번호 224261
답변완료
문의 드립니다.
아래와 같이 수식을 작성했는데 별첨한 그림에서처럼 "주문오류"가 발생하고 체결이 안됩니다.
그리고 체결시 소리가 나도록 설정된 부분도 그림에서처럼 에러가 발생합니다.
오류를 수정하지 못하고 있습니다. 도움을 좀 부탁드립니다.
차트 3개 중에서 매수신호가 2곳에서 발생하면 매수, 한 곳이라도 매도신호 발생하면 청산 그리고 10틱 이익이면 익절청산, 10틱손해면 손절청산을 하려고 합니다.
아래는 차트 1의 수식이고 차트2나 차트3도 같은 형태입니다.
===================
var SK1;
var SK2;
var SK3;
function Main_OnStart()
{
SK1 = 0;
SK2 = 0;
SK3 = 0;
}
function Chart1_OnRiseSignal(Signal)
{
SK1 = Signal.signalKind;
//현재차트1에서 매도신호 발생하고 차트2 또는 차트3에서 매도신호 발생중이면 매도
if (SK1 == 3 &&( SK2 == 3 || SK3 == 3) )
{
//1계약 신호가격으로 매도주문
Account1.OrderSell(Main.GetOrderCode(Signal.code), 1, Signal.price, 0);
PlaySound("C:₩WRFutures₩YesGlobalPro₩data₩Sound₩sell.wav");
}
//잔고가 매도포지션이고 수량이 있을떄만
if (Account1.Balance.position == 1 && Account1.Balance.count > 0)
{
//세 차트 중 하나라도 매도청산신호 발생하면 매도포지션 청산
if ( SK1 == 4 || SK2 == 4 || SK3 == 4 )
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code), Account1.Balance.count, 0, 1); //시장가 청산
// Account1.OrderBuy(Main.GetOrderCode(Signal.code), 1, Signal.price, 0);
PlaySound("C:₩WRFutures₩YesGlobalPro₩data₩Sound₩alert.wav");
}
//현재가가 잔고평단가 대비 -10틱 이하이면 익절청산
if (MarketData1.current <= Account1.Balance.avgUnitCost - MarketData1.GetTickSize()*10 ) //10틱이상 하락하면
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1);
// Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, MarketData1.Ask(1), 0);
PlaySound("C:₩예스트레이더₩data₩Sound₩alert.wav");
}
//현재가가 잔고평단가 대비 +10틱 이상이면 손절청산
if (MarketData1.current >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*10 ) //10틱이상 하락하면
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0, 1);
PlaySound("C:₩예스트레이더₩data₩Sound₩alert.wav");
}
}
//현재차트1에서 매수신호 발생하고 차트2 또는 차트3에서 매수신호 발생중이면 매수
if (SK1 == 1 && ( SK2 == 1 || SK3 == 1) )
{
//1계약 신호가격으로 매수주문
Account1.OrderBuy(Main.GetOrderCode(Signal.code), 1, Signal.price, 0);
PlaySound("C:₩WRFutures₩YesGlobalPro₩data₩Sound₩buy.wav");
}
//잔고가 매수포지션이고 매수잔고 수량이 있을떄
if (Account1.Balance.position == 2 && Account1.Balance.count > 0)
{
//세 차트 중 하나라도 매수청산신호 발생하면 매수포지션 청산
if ( SK1 == 2 || SK2 == 2 || SK3 == 2 )
{
Account1.OrderSell(Main.GetOrderCode(Signal.code), 1, Signal.price, 0);
PlaySound("C:₩WRFutures₩YesGlobalPro₩data₩Sound₩alert.wav");
}
//현재가가 잔고평단가 대비 +10틱 이상이면 익절청산
if (MarketData1.current >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*10 ) //10틱이상 하락하면
// if (MarketData1.current >= Account1.Balance.avgUnitCost + 0.25)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
PlaySound("C:₩예스트레이더₩data₩Sound₩alert.wav");
}
//현재가가 잔고평단가 대비 -10틱 이하이면 손절청산
if (MarketData1.current <= Account1.Balance.avgUnitCost - MarketData1.GetTickSize()*10 ) //10틱이상 하락하면
//if (MarketData1.current <= Account1.Balance.avgUnitCost - 0.3)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
PlaySound("C:₩예스트레이더₩data₩Sound₩alert.wav");
}
}
}
2017-11-24
2847
글번호 224260
답변완료
검토부탁드립니다.
수고 많으십니다.
당일 15시 25분에 잔고에 있는 종목전체를 불러와, 매수10호가로 청산하고자 할때
Main.ReqMarketData(RemainObject[i], 0, 0)로 불러와
매도호가에 RemainObject[i].Bid(10)로 작성해봤는데...
ReferenceError메세지가 뜨며 실행이 안되네요....
도움 부탁드립니다.
//15시 25분에 잔고에 있는 종목 전량 청산(당일청산)
if (DayX == false && HHMMSS >= 152500 && RcvData >= 1)
{
DayX = true;
Main.KillTimer(1);
Main.MessageList("동시호가 잔고청산 주문실행",EntryItem);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
var RemainObject = []; //종목객체 설정
Main.ReqMarketData(RemainObject[i], 0, 0);
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, RemainObject[i].Bid(10),0); //잔고 매수10호가 전량청산
// Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); //시장가
Main.MessageList("동시호가 청산매도: ", Account1.Balance.code);
}
}
2017-11-21
2792
글번호 224251
답변완료
질문입니다.
주가지수 선물에 적용되는 시스템을 예스랭귀지로 작성을 하였습니다.
예스랭귀지는 신호를 발생시키는 역할까지만 하고 채결에는 관여하지 않는다고 들었습니다.
그래서 예스스팍을 이용하려고 합니다.
질문1.
예스랭귀지로 작성한 시스템을 창에 걸어놓고,
그 상태에서 전입과 청산만을 예스스팟으로 컨트롤할수 있나요?
즉, 예스랭귀지로 작서한 시스템을 예스스팟으로 옮기는 작업이 꼭 필요한 것인지 궁금합니다.
질문2.
예스스팟으로 진입과 청산을 컨트롤할때,
예를들어 매수진입 후 매수청산과 매도진입이 동시에 일어날 경우,
순간적으로 증거금이 부족해서 신호가 채결되지 않는 경우가 있습니다.
이럴때를 대비해서 매수청산과 매도진입 시그널이 동시에 나왔다고 하더라도,
매수청산 후 증거금이 계좌로 들어온 후 매도진입 시그널을 채결시키는
기능이 예스스팟으로 가능한지 알고 싶습니다.
꼭 알고 싶은 사항입니다. 자세한 답변 부탁드립니다.
감사합니다.
추가로 질문하나 더 드립니다.
예를들어 선물차트에서 50이평을 crossup하면 매수, crossdown하면 매도하는
시스템이 있다고 가정할때,
이를 예스랭귀지로 작성했습니다.
저는 예스스팟으로 나오는 신호는 어떻게 해서든 채결시키고 싶습니다.
예를들어 현재상태가 매수인데 매도 시그널이 발생했을 때,
만약 미채결이 발생했다고하면,
매x초(예를들어5초0마다 주문을 정정하여 그때의 현재가, 혹은 1호가에 진입시키도록하고
예스스팟을 작성하고 싶습니다.
예시로 부탁드립니다.
감사합니다.
2017-11-22
2634
글번호 224249