커뮤니티

관심종목(선정종목) 자동매수

프로필 이미지
dedoyes
2025-12-07 14:47:56
97
글번호 228742
답변완료

다음은 예스랭귀지 시스템(식) 입니다.

예스스팟으로 자동매수하도록 부탁 합니다.

계좌잔고의 1/3 매수하도록 수고 바랍니다^^


// ============================================================

// 삼성전자 자동매수 로직 (예스랭귀지 완성본)

// - 전일 종가 신호 발생 시 다음날 갭/비갭 조건에 따라 매수

// ============================================================

Inputs:

BuyDelayGapUp(0910), // 갭업 대기시간

BuyDelayGapDown(0920), // 갭다운 대기시간

NoGapBuyStart(0900), // 비갭 매수 시작 시간

NoGapBuyEnd(0915); // 비갭 매수 종료 시간

Vars:

BuySignal(false),

BuySignalDate(0),

DelayTime(0),

IsGap(false),

GapSize(0);

//--------------------------------------------

// ① 삼성전자 종목이 아니면 종료

Var: Symbol(0);

If Symbol <> 005930 Then

Begin

//--------------------------------------------

// ② 전일 종가에서 매수 신호 발생 (PhantomTrend 등 자가 지표 기반)

If CrossUp(Close, Ema(C, 20)) Then

Begin

BuySignal = True;

BuySignalDate = Date;

End;

//--------------------------------------------

// ③ 다음날 매수 준비

If BuySignal and (Date > BuySignalDate) Then

Begin

// --------------------------------------------------------

// ?? 갭 정의: GapSize = 오늘 시가 - 전일 종가

// 갭업: GapSize > 0

// 갭다운: GapSize < 0

// 비갭: Abs(GapSize) < 전일종가 * 0.001 (예: ±0.1% 이내)

// --------------------------------------------------------

GapSize = Open - Close[1];

If AbsValue(GapSize) >= Close[1] * 0.001 Then

IsGap = True; // 갭 발생

Else

IsGap = False; // 비갭

// --------------------------------------------------------

// ========== [A] 갭일 경우 ==========

If IsGap = True Then

Begin

// 갭업 / 갭다운 판단

If Open > Close[1] Then

DelayTime = BuyDelayGapUp; // 09:10

Else

DelayTime = BuyDelayGapDown; // 09:20

// 대기시간 이후

If Time >= DelayTime Then

Begin

// 가격 재확인 3조건

If (High >= High[1]) OR

(Close >= Close[1]) OR

(Low > Low[1]) Then

Begin

Buy("AutoBuy_Gap", AtMarket, Def, 0);

BuySignal = False;

BuySignalDate = 0;

End;

End;

End;

// ========== [B] 비갭일 경우 ==========

If IsGap = False Then

Begin

// 지정된 시간 구간에서만 진입 허용

If Time >= NoGapBuyStart and Time <= NoGapBuyEnd Then

Begin

// 1) 최소 09:10 이후 조건

If Time >= 0910 Then

Begin

// 2) 오늘 양봉(현재가 > 시가)일 때만 매수

If Close > Open Then

Begin

Buy("AutoBuy_NoGap", AtMarket, Def, 0);

BuySignal = False;

BuySignalDate = 0;

End;

End;

End;

End;

End; // End of BuySignal section

End; // End of Symbol <> "005930"

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-12-18 15:46:06

안녕하세요 예스스탁입니다. 1 시스템(차트기반) 수식 내용은 스팟으로 구현이 되지 않습니다. 스팟에서는 차트객체를 이용해 시스템이 적용된 차트에서 신호가 발생하면 신호를 전달받아 이용만 가능합니다. 시스템은 직접 거래하고자 하는 종목의 차트에 시험적용으로 적용하고 해당 차트에서 신호가 발생하면 스팟에서 주문이 나가게 구현하셔야 합니다. 아래는 스팟 수식입니다. 차트에서 매수신호 발생하면 계좌의 주문가능현금의 33%만큼 매수하고 청산신호시 진입된 수량에서 미체결된 수량 빼고 매도주문을 하게 됩니다. 스팟 사용법등은 스팟 도움말 참고하시기 바랍니다. 2 스크립트 객체설정 차트객체 추가 -> 속성에서 객체명은 Chart1, 차트아이디 지정하고 시스템 적용된 차트와 동일하게 지정 계좌객체 추가 -> 속성에서 객체명은 Account1, 주문낼 계좌번호 지정 var OC, MK, pst, BV, XV, OP; var BID, BNUM; function Main_OnStart() { Main.MessageList("Start"); //차트종목 종목코드 OC = Main.GetOrderCode(Chart1.GetCode(1)); //종목객체 요청 Main.ReqMarketData(OC); pst = 0; } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OC) { MK = MarketData; } } function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1) { //계좌의 주문가능 현금 var cash = Account1.GetBalanceETCinfo(18); //주문가 매도3호가 OP = MK.Ask(3); //주문가능현금의 33%금액만큼 수량 계산 BV = Math.floor((cash*0.33)/OP); //매수주문 집행 BID = Account1.OrderBuy(OC, BV, OP,0); //포지션은 1 pst = 1; Main.MessageList("매수진입신호:",BV); } //스팟에서 매수진입 이후에 매수청산 신호 발생 if (pst == 1 && Signal.signalKind == 2) { var XV = BV; //진입매수주문 미체결 객체 셋팅 Account1.SetUnfillOrderNumber(BNUM); //미체결이 있으면 if ( Account1.Unfill.count > 0 ) { //진입수량에서 미체결수량 차감 XV = BV-Account1.Unfill.count; //미체결 주문 취소 Account1.OrderCancel(BNUM); } Main.MessageList("매수청산:",BV); //매수진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결) if (BV > 0) { //청산을 위해 매도주문 집행(수량은 BV, 매수5호가 지정가) Account1.OrderSell(OC, BV, MK.Bid(5), 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이 오면 if (OrderResponse.orderID == BID) { //주문번호 저장 BNUM = OrderResponse.orderNum; } } 즐거운 하루되세요