커뮤니티
예스스팟 Q&A
답변완료
주문함수를 전역변수에 담아 그 전역변수이름으로 쓸수 있나요?
안녕하세요? 수고 많으십니다.
시장상황에 따라 매수주문 또는 매도주문이 나가는 전략인데요
매 경우의 수마다 매수, 매도 주문을 구분하여 각각 코딩하려니깐 너무 길어지고 가독성이 떨어집니다
아래의 예처럼 주문함수를 변수에 담아 쓸 수 있을까요?
첵에 보면 bind 메소드를 이용하여 Function오브젝트를 생성하면 된다는데... 잘 안되는군요.
꼭 부탁드립니다
감사합니다. 꾸벅!
< 코딩예 >
외부입력변수: inpBuyOrSell
var ordFnc; //주문함수를 그때그때 복사해서 쓸 전역변수
function Main_OnStart()
{
if(inpBuyOrSell == "Buy"){
ordFnc = Account1.OrderBuy; //또는 Account1.OrderBuy.bind();
}else if(inpBuyOrSell == "Sell"){
ordFnc = Account1.OrderSell;
}
Main.SetTimer(1, 60000);
}
function Main_OnTimer(nEventID)
{
if(nEventID == 1){
ordFnc(Option1.GetATMCallRecent(0, 0), 1, Option1.GetCurrent(0, 0), 0);
}
}
2018-03-04
2618
글번호 224349
답변완료
문의 드립니다.
모의투자 진행 중입니다.
오늘 차트에서 기본적인 청산 신호인 ExitShort("청산"); 발생하여 예스스팟에서 청산 로직이 실행이 되었습니다.
그런데 ExitShort("청산", AtStop, lowest(L, BarsSinceEntry+1) + atr(var1)*var2); 청산신호가 차트에서 뜨면 예스스팟의 Chart_OnRiseSignal(Signal) 까지는 타고 가는데 Signal.signalKind == 4 로직을 실행 시키지 못했습니다.
(모의투자에서) AtStop 문제인가요? 아니면 다른 문제인가요?
28일 이전에는 AtStop 신호가 제대로 청산이 되었습니다.
2018-03-02
2565
글번호 224347
답변완료
봉의 시작시간
아래의 수식을
var T;
function Main_OnStart()
{
T = 0;
Main.MessageLog("시작");
OrderCode = Main.GetOrderCode(KP.code);
}
function C1_OnRiseIncompleteSignal(IncompleteSignal)
{
Main.MessageLog("미완성신호/"+IncompleteSignal.signalKind);
A1.SetBalance(Main.GetOrderCode(IncompleteSignal.code))
이하생략 }
매 영업일 09시 05분 이후부터 영업일 종료시간까지 발생하는 미완성신호만을 적용하고자 할 때의 수식으로 변경하여 주시면 감사하겠습니다.
2018-03-03
2647
글번호 224346
답변완료
문의드립니다.
선물옵션 거래시
옵션 양매도를 할경우 가격교차지점에서 양매도 포지션을 진입하거나, 일정시간즉 매일 11시에 양매도 진입하고, 양합이 50틱 수익 발생시 일괄청산하거나, 매일 15에 일괄청산하는 수식을 부탁드려도 될까요?
2018-03-01
2744
글번호 224345
달무드 님에 의해서 삭제되었습니다.
2018-02-23
15
글번호 224344
답변완료
질문입니다.
현재 선물 1계약을 운용하고 있습니다.
예스트레이더로 시스템을 작성하였고, 예스스팟으로 주문을 컨트롤하고 있습니다.
간단히 설명을 드리면 다음과 같습니다.
예스스팟 구동시 현재의 계좌상황을 파악하게됩니다.
현재 포지션이 없는지 있는지,
있다면 롱포지션인지 숏포지션인지 판단합니다.
그리고 예스트레이더에서 신호가 발생하면, 예스스팟으로 실행합니다.
만약 체결되지 않는다면 5초마다 정정거래를 발생시킵니다.
여기까지 적성되어 있습니다.
질문입니다.
예스트레이더 선물거래시스템을 3계약으로 늘릴려고합니다.
피라미딩으로 말이죠.
예를들어 1계약 매수진입 후 추가조건을 만족하면 1계약추가진입하고(총2계약),
또다시 추가조건진입을 만족하면 1계약추가진입합니다(총3계약).
매도쪽도 마찬가지입니다.
예스트레이더 시스템은 완성하였습니다.
이를 예스스팟으로 신호를 컨트롤하고자 합니다.
예스스팟 로직은 다음과 같이 구성하고 싶습니다.
처음 예스스팟 구동 시 현재 포지션의 상황을 파악합니다.
포지션이 없는지 있는지,
있다면 롱포지션인지 숏포지션인지,
그리고 추가사항이 현재포지션에서 진입한 계약수가 몇개인지 파악하고 싶습니다.
그리고 피라미딩 진입도 예스스팟으로 컨트롤하고 싶습니다.
예를들어 매수1계약 진입을 "Long1"으로 명명한다면,
추가1계약진입 시 "Long2"로 명명하고,
여기서 추가1계약진입 시 "Long3"로 명명하고 싶습니다.
매수청산도 각각 "Exit Long1", "Exit Long2", "Exit Long3"으로 명명하고 싶습니다.
매도쪽도 마찬가지입니다.
피라미딩 진입도 초기1계약진입과 마찬가지로
정정주문을 5초마다 현재가를 갱신하며 정정하고 싶습니다.
현재사용하고 있는 예스스팟을 올립니다.
아직 예스스팟에 익숙치못해 그러니,
상세한 주석과 함께 부탁드립니다.
감사합니다.
예스스팟
//yT7
var Position;
var OrderCode;
var BID, BXID, SID, SXID;
var BNum, BXNum, SNum, SXNum;
function Main_OnStart()
{
//"OnStart" 출력.
//Main.MessageLog("Start");
//시스템을 연결선물에 적용. 따라서 주문용 종목코드를 리턴받아 OrderCode에 저장.
OrderCode = Main.GetOrderCode(MarketData1.code);
//OrderCode종목 잔고셋팅.
Account1.SetBalance(OrderCode, 0);
//현재 포지션이 매도나 매수가 아니라면,
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);
//Position가 0이고, 시그널 종류가 매수라면,
if (Position == 0 && Signal.signalKind == 1)
{
//Position에 1 대입.
Position = 1;
//주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, BID에 주문식별번호 저장.
BID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0);
//"Long" 출력
Main.MessageLog("Long");
}
//Position이 1이고, 시그널 종류가 매수청산이라면,
if (Position == 1 && Signal.signalKind == 2)
{
//Position에 0 대입.
Position = 0;
//주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, BXID에 주문식별번호 저장.
BXID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0);
//"ExitLong" 출력
Main.MessageLog("ExitLong");
}
//Position이 0이고, 시그널 종류가 매도라면,
if (Position == 0 && Signal.signalKind == 3)
{
//Position에 -1 대입.
Position = -1;
//주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, SID에 주문식별번호 저장.
SID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0);
//"Short" 출력
Main.MessageLog("Short");
}
//Position이 -1이고, 시그널 종류가 매도청산이라면,
if (Position == -1 && Signal.signalKind == 4)
{
//Position에 0 대입
Position = 0;
//주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, SXID에 주문식별번호 저장.
SXID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0);
//"ExitShort" 출력
Main.MessageLog("ExigShort");
}
}
function Main_OnOrderResponse(OrderResponse)
{
//해당 주문응답이 Long신호에 대한 주문응답이라면,
if (OrderResponse.orderID == BID)
{
//BNum에 주문응답객체의 주문번호를 저장하고,
BNum = OrderResponse.orderNum;
//1번 타이머 실행(5초 간격).
Main.SetTimer(1, 5000);
}
//해당 주문응답이 ExitLong신호에 대한 주문응답이라면,
if (OrderResponse.orderID == BXID)
{
//BXNum에 주문응답객체의 주문번호를 저장하고,
BXNum = OrderResponse.orderNum;
//2번 타이머 실행(5초 간격).
Main.SetTimer(2, 5000);
}
//해당 주문응답이 Short신호에 대한 주문응답이라면,
if (OrderResponse.orderID == SID)
{
//SNum에 주문응답객체의 주문번호를 저장하고,
SNum = OrderResponse.orderNum;
//3번 타이머 실행(5초 간격).
Main.SetTimer(3, 5000);
}
//해당 주문응답이 ExitShort신호에 대한 주문응답이라면,
if (OrderResponse.orderID == SXID)
{
//SXNum에 주문응답객체의 주문번호를 저장하고,
SXNum = OrderResponse.orderNum;
//4번 타이머 실행(5초 간격).
Main.SetTimer(4, 5000);
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 실행.
if (nEventID == 1)
{
//1번 타이머 종료.
Main.KillTimer(1);
//BNum 주문번호의 미체결객체 셋팅.
Account1.SetUnfillOrderNumber(BNum);
//현재가 저장
var CC = MarketData1.current;
//미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC)
{
//가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum 새로 갱신하고 타이머 재셋팅.
BID = Account1.OrderReplacePrice(BNum, CC);
}
//미체결수량이 존재하나, 미체결가격과 현재가격이 같다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC)
{
//정정주문이 없으므로 1번 타이머 재셋팅.
Main.SetTimer(1, 5000);
}
}
//2번 타이머 실행.
if (nEventID == 2)
{
//2번 타이머 종료.
Main.KillTimer(2);
//BXNum 주문번호의 미체결객체 셋팅
Account1.SetUnfillOrderNumber(BXNum);
//현재가 저장
var CC = MarketData1.current;
//미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC)
{
//가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BXNum새로 갱신하고 타이머 재셋팅.
BXID = Account1.OrderReplacePrice(BXNum, MarketData1.current);
}
//미체결수량이 존재하나, 미체결가격과 현재가격이 같다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC)
{
//정정주문이 없으므로 2번 타이머 재셋팅.
Main.SetTimer(2, 5000);
}
}
//3번 타이머 실행
if (nEventID == 3)
{
//3번 타이머 종료
Main.KillTimer(3);
//SNum 주문번호의 미체결객체 셋팅
Account1.SetUnfillOrderNumber(SNum);
//현재가 저장
var CC = MarketData1.current;
//미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC)
{
//가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum새로 갱신하고 타이머 재셋팅.
SID = Account1.OrderReplacePrice(SNum, MarketData1.current);
}
//미체결수량이 존재하나, 미체결가격과 현재가격이 같다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC)
{
//정정주문이 없으므로 3번 타이머 재셋팅.
Main.SetTimer(3, 5000);
}
}
//4번 타이머 실행
if (nEventID == 4)
{
//4번 타이머 종료
Main.KillTimer(4);
//SXNum 주문번호의 미체결객체 셋팅
Account1.SetUnfillOrderNumber(SXNum);
//현재가 저장
var CC = MarketData1.current;
//미체결수량이 존재하고, 미체결가격이 현재가와 다르다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC)
{
//가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 SXNum새로 갱신하고 타이머 재셋팅.
SXID = Account1.OrderReplacePrice(SXNum, MarketData1.current);
}
//미체결수량이 존재하나, 미체결가격과 현재가격이 같다면,
if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC)
{
//정정주문이 없으므로 4번 타이머 재셋팅.
Main.SetTimer(4, 10000);
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
//"NotifyFill" 출력.
//Main.MessageLog("NotifyFill");
//BNum 주문 체결되면,
if (NotifyFill.orderNum == BNum)
{
//1번 타이머 종료.
Main.KillTimer(1);
//BNum 미체결객체 셋팅
Account1.SetUnfillOrderNumber(BNum);
//미체결 수량이 없으면
if (Account1.Unfill.count == 0)
{
//"Notify Long" 출력.
Main.MessageLog("N.Long");
}
}
//BXNum 주문 체결되면,
if (NotifyFill.orderNum == BXNum)
{
//2번 타이머 종료.
Main.KillTimer(2);
//BXNum 미체결객체 셋팅
Account1.SetUnfillOrderNumber(BXNum);
//미체결 수량이 없으면
if (Account1.Unfill.count == 0)
{
//"Notify ExitLong" 출력.
Main.MessageLog("N.ExitLong");
}
}
//SNum 주문 체결되면,
if (NotifyFill.orderNum == SNum)
{
//1번 타이머 종료.
Main.KillTimer(3);
//SNum 미체결객체 셋팅
Account1.SetUnfillOrderNumber(SNum);
//미체결 수량이 없으면
if (Account1.Unfill.count == 0)
{
//"Notify Short" 출력.
Main.MessageLog("N.Short");
}
}
//SXNum 주문 체결되면,
if (NotifyFill.orderNum == SXNum)
{
//4번 타이머 종료.
Main.KillTimer(4);
//SXNum 미체결객체 셋팅
Account1.SetUnfillOrderNumber(SXNum);
//미체결 수량이 없으면
if (Account1.Unfill.count == 0)
{
//"Notify ExitShort" 출력.
Main.MessageLog("N.ExitShort");
}
}
}
2018-02-20
2853
글번호 224341
답변완료
문의드립니다.
예제로 있는 수식보다가 궁금해졌는데요. 예스랭귀지 전략을 스팟에다 적용시키려면 이지랭귀지로 돼 있는 것을 다 자바스크립트 식으로 풀어서 작성해야 하나요? 비슷한 포맷인 웰스멘토도 마찬가지인가요?
/*스크립트시작-----------------------------------------------------*/
var Start;
function Main_OnStart()
{
Main.MessageLog("시작");
Start = 0;
}
function C1_OnRiseSignal(Signal)
{
var dayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,0);
var dayma2 = C2.GetIndicatorData("이동평균 5_20_60", 2,0);
var dayma3 = C2.GetIndicatorData("이동평균 5_20_60", 3,0);
var predayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,1);
var slowK = C2.GetIndicatorData("Stochastics",1,0);
if (Signal.signalKind == 1
&& dayma1 > dayma2 && dayma2 > dayma3
&& dayma1 > predayma1
&& slowK <= 30)
{
A1.OrderBuy(Signal.code,Signal.count,SSE.Ask(2),0);
Start = 1;
}
if (Signal.signalKind == 2 && Start == 1)
{
A1.OrderSell(Signal.code,Signal.count,SSE.Bid(2),0);
}
}
2018-02-11
2843
글번호 224340
파일럿 님에 의해서 삭제되었습니다.
2018-02-11
3
글번호 224339
약쟁이 님에 의해서 삭제되었습니다.
2018-02-10
2
글번호 224338
약쟁이 님에 의해서 삭제되었습니다.
2018-02-10
0
글번호 224337