커뮤니티

예스스팟 Q&A

stier 님에 의해서 삭제되었습니다.

프로필 이미지
stier
2021-01-12
4
글번호 225395
답변완료

문의드립니다.

안녕하세요.. 주식거래중이며 예스랭귀지 시스템에서 신호가 나오면 스팟에서 확장차트를 만들어서 매매를 하고 있습니다. 시스템을 분할매도가 들어가게 바꾸었습니다. 그래서 한번 샀지만, 지표신호에 따라서 매도 신호가 나올때마다 보유수량을 일부씩 청산해갑니다. (차트에서는 정상적으로 나옵니다) 그런데 스팟에서는 매도신호를 받으면 아래의 식으로 매도를 하는데요 Acoount1.OrderSell(Main.GetOrderCode(ChartEx.code(1)),Account1.Balance.count,ChartEx.GetClose(1,0),0); 스팟은 차트에서의 매도신호에 담긴 <수량>이 분할이건, 전량이건 구분하지 않고 매도신호까지만 읽고 보유한 수량 전부를 청산 할수 밖에 없는 것인가요 그래서 분할청산을 하려면 랭귀지의 분할매도 신호와는 별개로 스팟에서 아예 따로 보유수량에 근거한 매도물량을 작성해야 하는 것인가요 1> 한마디로 차트에서 분할매도로 수식을 작성한게 스팟에서는 사용할수 없는 것인가요? 뭔가 그대로 사용할 수 잇는 해결책이 있을가 싶어서 문의드립니다.. 차트 신호에 최대한 가깝게 분할매도 하는 방법이 있을가요 안될경우 차트에서 매도신호나오면 , 동시에 n프로 수익중일때 분할익절 두번, 다시 신호나오면 전량청산 이렇게 확장차트에서 나오는 매도신호 + 잔고수익률 확인해서 청산수량을 3분할하는 방법좀 알려주세요.. 꼭좀 부탁드리겠습니다.
프로필 이미지
지스카드
2021-01-13
2761
글번호 225394

stier 님에 의해서 삭제되었습니다.

프로필 이미지
stier
2021-01-04
32
글번호 225393

온고지신 님에 의해서 삭제되었습니다.

프로필 이미지
온고지신
2020-12-23
0
글번호 225392

지스카드 님에 의해서 삭제되었습니다.

프로필 이미지
지스카드
2020-12-22
46
글번호 225391

cs아빠 님에 의해서 삭제되었습니다.

프로필 이미지
cs아빠
2020-12-19
11
글번호 225390
답변완료

수식 검토 부탁드립니다. (주문변경, 일부미체결, 다중 챠트)

안녕하세요? 코스닥선물을 거래하고 있습니다. (하이투자) 챠트는 KQ20과 KQ100이름으로 두개의 챠트객체가 있고 (둘다 코스닥150연결선물) 종목객체는 코스닥150연결선물입니다. (Marketdata1) 각 챠트에서 5개의 진입수를 가지고 거래를 하고 있는데 진입 및 가격을 현재가로 하다보니 대부분 거래가 잘 되기는 하나 시장이 빨리 움직일 때는 진입이나 청산을 일부 못하는 경우가 발생하고 있습니다. 그래서 상대3~5호가로 진입및 청산주문을 하고 있는데 아무래도 수익률이 떨어지고 있습니다. 그래서 나름 예스스팟으로 수식을 작성하여 보았는데 하이투자는 모의거래가 없어 시험하기가 어려운 상황입니다. 우선 아래의 수식을 보시고 문제가 될 만한 부분이 있는지 검토를 부탁드리겠습니다. *아래의 수식에서 청산신호가 아닌 스위칭신호(BUY신호인데 그전에 그 챠트에서 주문한 매도포지션이 있는 경우)가 발생했을 때도 잘 작동할 수 있을지 궁금합니다. 감사합니다. ----------------------------------------------------------------------- KQ20챠트에서 5개의 매수/매도 신호발생(현재가 주문) - 5초 후 일부 미체결 가격 조정 - 10초후 일부 미체결 가격 조정 - 15초 후 미체결주문 모두 취소 청산 시 현재가 주문 - 5초후 가격조정 - 10초후 가격조정 KQ100챠트에서도 위와 동일한 방식으로 주문함 KQ20챠트와 KQ100챠트는 서로의 진입과 청산에 영향없이 각각 독립적으로 운영 (서로 영향없이)함. --------------------------------------------------------------------------- var Position; var BuyID; var BuyOrderNum; var SellID; var SellOrderNum; var Position100; var BuyID100; var BuyOrderNum100; var SellID100; var SellOrderNum100; var KQ20num; var IniKQ20num; var KQ100num; var IniKQ100num; function Main_OnStart() { Position = 0; IniKQ20num =0; Position100 = 0; IniKQ100num =0; } function KQ20_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Position = 1; Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 2); IniKQ20num = Account1.Balance.count; BuyID = Account1.OrderBuy(Main.GetOrderCode(KQ20.GetCode(1)),Signal.count,MarketData1.current,0); Main.SetTimer(1, 5000); Main.SetTimer(2, 10000); Main.SetTimer(3, 15000); Main.SetTimer(4, 30000); } if (Signal.signalKind == 3) { Position = -1; Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 1); IniKQ20num = Account1.Balance.count; SellID = Account1.OrderSell(Main.GetOrderCode(KQ20.GetCode(1)),Signal.count,MarketData1.current,0); Main.SetTimer(1, 5000); Main.SetTimer(2, 10000); Main.SetTimer(3, 15000); Main.SetTimer(4, 30000); } if (Signal.signalKind == 2) { Main.SetTimer(5, 5000); Main.SetTimer(6, 10000); ELID = Account1.OrderSell(Main.GetOrderCode(KQ20.GetCode(1)),KQ20num,MarketData1.current,0) } if (Signal.signalKind == 4) { Main.SetTimer(5, 5000); Main.SetTimer(6, 10000); ESID = Account1.OrderBuy(Main.GetOrderCode(KQ20.GetCode(1)),KQ20num,MarketData1.current,0) } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) { BuyOrderNum = OrderResponse.orderNum; } if (OrderResponse.orderID == SellID) { SellOrderNum = OrderResponse.orderNum; } if (OrderResponse.orderID == ELID) { ELOrderNum = OrderResponse.orderNum; } if (OrderResponse.orderID == ESID) { ESOrderNum = OrderResponse.orderNum; } } function Main_OnTimer(nEventID) { if (nEventID == 1 && Position == 1) { Main.KillTimer(1); Account1.SetUnfillOrderNumber(BuyOrderNum); if (Account1.Unfill.count > 0) { BuyID = Account1.OrderReplacePrice(BuyOrderNum, MarketData1.Ask(1)); } } if (nEventID == 1 && Position == -1) { Main.KillTimer(1); Account1.SetUnfillOrderNumber(SellOrderNum); if (Account1.Unfill.count > 0) { SellID = Account1.OrderReplacePrice(SellOrderNum, MarketData1.Bid(1)); } } if (nEventID == 2 && Position == 1) { Main.KillTimer(2); Account1.SetUnfillOrderNumber(BuyOrderNum); if (Account1.Unfill.count > 0) { BuyID = Account1.OrderReplacePrice(BuyOrderNum, MarketData1.Ask(3)); } } if (nEventID == 2 && Position == -1) { Main.KillTimer(2); Account1.SetUnfillOrderNumber(SellOrderNum); if (Account1.Unfill.count > 0) { SellID = Account1.OrderReplacePrice(SellOrderNum, MarketData1.Bid(3)); } } if (nEventID == 3 && Position == 1) { Main.KillTimer(3); EnterN = 0; Account1.SetUnfillOrderNumber(BuyOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BuyOrderNum); } } if (nEventID == 3 && Position == -1) { Main.KillTimer(3); EnterN = 0; Account1.SetUnfillOrderNumber(SellOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SellOrderNum); } } if (nEventID == 4 && Position == 1) { Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 2); KQ20num = Account1.Balance.count - IniKQ20num ; Main.KillTimer(4); Main.MessageList("매수진입수:", KQ20num); } if (nEventID == 4 && Position == -1) { Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 1); KQ20num = Account1.Balance.count - IniKQ20num; Main.KillTimer(4); Main.MessageList("매도진입수:", KQ20num); } if (nEventID == 5 && Position == 1) { Main.KillTimer(5); Account1.SetUnfillOrderNumber(ELOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ELOrderNum, MarketData1.Bid(3)); } } if (nEventID == 5 && Position == -1) { Main.KillTimer(5); Account1.SetUnfillOrderNumber(ESOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ESOrderNum, MarketData1.Ask(3)); } } if (nEventID == 6 && Position == 1) { Main.KillTimer(6); Account1.SetUnfillOrderNumber(ELOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ELOrderNum, MarketData1.Bid(5)); } } if (nEventID == 6 && Position == -1) { Main.KillTimer(6); Account1.SetUnfillOrderNumber(ESOrderNum); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ESOrderNum, MarketData1.Ask(5)); } } } function KQ100_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Position100 = 1; Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 2); IniKQ100num = Account1.Balance.count; BuyID100 = Account1.OrderBuy(Main.GetOrderCode(KQ100.GetCode(1)),Signal.count,MarketData1.current,0); Main.SetTimer(7, 5000); Main.SetTimer(8, 10000); Main.SetTimer(9, 15000); Main.SetTimer(10, 30000); } if (Signal.signalKind == 3) { Position100 = -1; Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 1); IniKQ100num = Account1.Balance.count; SellID100 = Account1.OrderSell(Main.GetOrderCode(KQ100.GetCode(1)),Signal.count,MarketData1.current,0); Main.SetTimer(7, 5000); Main.SetTimer(8, 10000); Main.SetTimer(9, 15000); Main.SetTimer(10, 30000); } if (Signal.signalKind == 2) { Main.SetTimer(11, 5000); Main.SetTimer(12, 10000); ELID100 = Account1.OrderSell(Main.GetOrderCode(KQ100.GetCode(1)),KQ100num,MarketData1.current,0) } if (Signal.signalKind == 4) { Main.SetTimer(5, 5000); Main.SetTimer(6, 10000); ESID100 = Account1.OrderBuy(Main.GetOrderCode(KQ100.GetCode(1)),KQ100num,MarketData1.current,0) } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID100) { BuyOrderNum100 = OrderResponse.orderNum; } if (OrderResponse.orderID == SellID100) { SellOrderNum100 = OrderResponse.orderNum; } if (OrderResponse.orderID == ELID100) { ELOrderNum100 = OrderResponse.orderNum; } if (OrderResponse.orderID == ESID100) { ESOrderNum100 = OrderResponse.orderNum; } } function Main_OnTimer(nEventID) { if (nEventID == 7&& Position100 == 1 ) { Main.KillTimer(7); Account1.SetUnfillOrderNumber(BuyOrderNum100); if (Account1.Unfill.count > 0) { BuyID100 = Account1.OrderReplacePrice(BuyOrderNum100, MarketData1.Ask(1)); } } if (nEventID == 7 && Position100 == -1) { Main.KillTimer(7); Account1.SetUnfillOrderNumber(SellOrderNum100); if (Account1.Unfill.count > 0) { SellID100 = Account1.OrderReplacePrice(SellOrderNum100, MarketData1.Bid(1)); } } if (nEventID == 8 && Position100 == 1) { Main.KillTimer(8); Account1.SetUnfillOrderNumber(BuyOrderNum100); if (Account1.Unfill.count > 0) { BuyID100 = Account1.OrderReplacePrice(BuyOrderNum100, MarketData1.Ask(3)); } } if (nEventID == 8 && Position100 == -1) { Main.KillTimer(8); Account1.SetUnfillOrderNumber(SellOrderNum100); if (Account1.Unfill.count > 0) { SellID100 = Account1.OrderReplacePrice(SellOrderNum100, MarketData1.Bid(3)); } } if (nEventID == 9 && Position100 == 1) { Main.KillTimer(9); EnterN = 0; Account1.SetUnfillOrderNumber(BuyOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BuyOrderNum100); } } if (nEventID == 9 && Position100 == -1) { Main.KillTimer(9); EnterN = 0; Account1.SetUnfillOrderNumber(SellOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SellOrderNum100); } } if (nEventID == 10 && Position100 == 1) { Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 2); KQ20num = Account1.Balance.count - IniKQ100num ; Main.KillTimer(10); Main.MessageList("매수진입수:", KQ100num); } if (nEventID == 10 && Position100 == -1) { Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 1); KQ20num = Account1.Balance.count - IniKQ100num; Main.KillTimer(10); Main.MessageList("매도진입수:", KQ100num); } if (nEventID == 11 && Position100 == 1) { Main.KillTimer(11); Account1.SetUnfillOrderNumber(ELOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ELOrderNum100, MarketData1.Bid(3)); } } if (nEventID == 11 && Position100 == -1) { Main.KillTimer(11); Account1.SetUnfillOrderNumber(ESOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ESOrderNum100, MarketData1.Ask(3)); } } if (nEventID == 12 && Position100 == 1) { Main.KillTimer(12); Account1.SetUnfillOrderNumber(ELOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ELOrderNum100, MarketData1.Bid(5)); } } if (nEventID == 12 && Position100 == -1) { Main.KillTimer(12); Account1.SetUnfillOrderNumber(ESOrderNum100); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(ESOrderNum100, MarketData1.Ask(5)); } } }
프로필 이미지
songjs12
2020-12-05
2908
글번호 225383
답변완료

예스스팟에서 청산과 관련 질문

안녕하세요 예스 스팟 수식 작성 중 간단한 문의드립니다. 챠트 객체에서 stoploss나 endofday신호가 나오는 경우 Signalkind가 어떻게 잡히는 지요? Signalkind의 경우 1~4는 buy나 sell, exitlong, short인데 챠트에서 stoploss의 경우에 exitlong/exitshort으로 신호를 인식하게 되는지요? 신호챠트에서 BUY인경우 매도포지션이 있을때 청산하고 매수하는 것으로 알고 있습니다. 이경우 스팟에서는 매도청산 1개, 매수 한개로 신호가 가는지요? 아니면 매수2개로 신호가 가는지요? 감사합니다.
프로필 이미지
songjs12
2020-12-05
2862
글번호 225382

뭐뇌 님에 의해서 삭제되었습니다.

프로필 이미지
뭐뇌
2020-12-05
0
글번호 225381
답변완료

당일 개장시간, 폐장시간을 알 수 있는 함수

안녕하세요. YesSpot으로 당일의 장개시 시간과 장마감 시간을 알수 있는 함수나 방법이 있을까요? 자동매매를 돌리고 있는데 이번 수능일에 장마감 시간이 바뀌어서 오류가 발생했습니다. 물론 제가 좀더 부지런하게 예외조건을 넣어두면 되는 것입니다만, 가급적이면 이것도 자동적으로 처리가 되면 참 좋겠습니다.
프로필 이미지
좋은밤
2020-12-04
2764
글번호 225380