사용자 매뉴얼 / 3. 실전 전략 구현
3. 실전 전략 구현
와이즈 트레이딩 룸을 이용한 전략 구현법에 대해 설명합니다.
입문자 관점에서 조건검색식과 스크립트의 조합으로 전략을 구현해 보고, 기초 예제와 응용 예제를 통해 스크립트 사용법을 익힐 수 있습니다.
3.1 조건검색식과 스크립트로 첫 전략 만들어 보기
전략 개요
키움 조건검색식으로 당일 거래량이 최근 일주일(5일)의 2배가 되는 종목을 검색하고, 스크립트에서 오전 11시이전 매수세가 강할때 매수하고 2% 익절, -2% 손절로 매도 되는 전략 구현
키움 영웅문 HTS에서 조건검색식 작성
기존의 사용하고 있는 조건검색식을 사용하거나, 아래처럼 키움 영웅문 HTS에서 조건검색식을 작성합니다. 조건검색식은 사용자 데이터 보안 때문에 HTS에서만 작성할 수 있고, API를 이용한 와이즈 트레이딩 룸에서는 검색된 종목만 수신할 수 있습니다.
1) 키움 영웅문 HTS에서 조건검색 메뉴 선택.
2) 조건검색 대상변경. 검색에서 제외할 종목을 체크함.
3) 조건검색식 작성. 아래 조건식은 당일 거래량이 최근 5일간의 평균거래량보다 2배이상 증가할 경우 종목이 검색됨.
4) 조건검색식 저장.
와이즈 트레이딩 룸에서 전략 구현
와이즈 트레이딩 룸을 실행하고, 상단메뉴에서 시스템접속 버튼을 눌러서 키움에 접속합니다. 시스템에 접속해야만 키움 영웅문 HTS에서 작성한 조건검색식 목록을 확인할 수 있습니다.
신규 전략을 구현하려면 스크립트 작성 -> 전략 설정 -> 세트 생성 순으로 작업이 진행되지만, 개념의 이해를 위해서 상위 개념순(세트 생성 -> 전략 설정 -> 스크립트 작성)으로 설명합니다(2.1 -> 2.2 -> 2.3 순으로 개념의 흐름대로 보고, 실습할때는 2.3 -> 2.2 -> 2.1 순으로 작업하시기 바랍니다).
시스템 접속
1) 타이틀바 메뉴의 시스템접속 버튼을 눌러서 키움서버에 접속 요청
2) 로그인창이 팝업되면 실서버와 모의서버 선택하여 접속
3) API 최신버전이 있으면 와이트 트레이딩 룸을 종료하고 업데이트를 진행할 필요 있음
와이즈 트레이딩 룸의 시스템 접속을 누르면 키움 API의 로그인 창이 팝업되어 계좌와 비밀번호를 입력하도록 되어 있습니다. 이 화면은 키움이 제공하는 화면으로 와이즈 트레이딩 룸을 포함하여 어떠한 외부 프로그램에게도 입력 데이터가 노출되지 않도록 보호됩니다.
API 업데이트를 진행할 경우, 팝업 메시지에서 안내하는 것처럼 API를 사용하고 있는 와이즈 트레이딩 룸을 종료하고 API를 진행해야 합니다.
세트 생성
세트 추가 버튼을 눌러 조건검색식과 전략 등을 설정합니다. 세트유형을 조건식세트로 설정하면 HTS에서 작성한 조건검색식을 선택할 수 있습니다. 조건검색식으로 검색된 종목들은 하단의 매매전략이 적용됩니다.
전략 설정
추가 버튼을 눌러서 사용할 전략을 생성합니다. 스크립트를 이용하기 위해서 전략유형을 차트전략으로 설정하고, 작성한 스크립트를 설정합니다.
스크립트 작성
추가 버튼을 눌러서 스크립트를 작성합니다. 스크립트 작성시 if문, 변수선언, 주석처리 등 모든 기본 문법은 C#의 구문입니다.
전체 스크립트
/*
매매 대상:
- 당일 거래량이 최근 5일 평균거래량 보다 2배 이상일 경우 종목이 검색됨.
매수:
- 오전 10시 이전에 거래량이 증가했을때만 매수.
- 1분봉으로 계속해서 주가가 오르고 있을때만 매수(1분봉 저가 상승중).
- 체결강도 증가하면서 100이상일 경우만 매수.
매도:
- 평가손익율 2% 도달시 익절
- 평가손익율 -2% 도달시 손절
*/
var _현재시간 = DateTime.Now.TimeOfDay;
var _매매시간_매수 = _현재시간 >= TimeSpan.Parse("09:00:00") && _현재시간 <= TimeSpan.Parse("11:00:00");
if (_매매시간_매수)
{
var _매수_1분봉저가상승중 = 단분봉_2봉전.저가 < 단분봉_1봉전.저가 && 단분봉_1봉전.저가 < 단분봉_0봉전.저가;
var _매수_체결강도_상승_100이상 = 단분봉_1봉전.체결강도 < 단분봉_0봉전.체결강도 && 탐색종목.체결강도 >= 100;
if (_매수_1분봉저가상승중 && _매수_체결강도_상승_100이상)
Post(매수, 100, 0, 메시지:"1분봉 저가 상승, 체결가도 증가 매수");
}
if (탐색종목.주문가능수량 > 0)
{
var _매도_익절 = 탐색종목.평가손익율 >= 2.0;
var _매도_손절 = 탐색종목.평가손익율 <= -2.0;
if ( _매도_익절)
Post(매도, 100, 100, 메시지:"2% 수익 익절 매도");
if ( _매도_손절)
Post(매도, 100, 100, 메시지:"-2% 손실 손절 매도");
}
스크립트 설명
- C#의 주석처리문을 이용해서 전략 개요 작성
- C#의 변수 선언자 var를 이용하여 매수와 매도신호를 저장할 변수 선언(변수명은 한글도 가능)
- C#의 DateTime.Now.TimeOfDay으로 현재시간 갖어와서 변수에 저장
- C#의 논리연산자 and(&&)로 여러개의 조건이 모두 만족하는지 확인
- if문은 매수조건과 매도조건을 확인하여 Post로 신호 생성
스크립트 검증 및 저장
스크립트 작성 후 컴파일 버튼을 눌러서 오류없이 정상적으로 컴파일되는지 확인하고, 오류가 없으면 저장합니다. 컴파일로는 작성된 스크립트의 문법 및 구문 오류만 검증이 가능합니다. 실제 스크립트가 실행되면서 데이터 포맷 등의 런타임 오류가 발생할 수 있습니다. 런타임 오류는 스크립트에 오류 대응 코드를 추가하여 방지할 수 있습니다.
3.2 매매대상 종목을 사용자가 직접 지정하기
때에 따라서는 사용자가 직접 선별한 종목들만을 대상으로 매매하고자 할 경우가 있습니다. 이때는 조건검색식의 대상변경 기능을 이용하여 전략을 쉽게 구현할 수 있습니다.
키움 HTS에서 관심종목 생성
1) 키움 HTS 실행
2) HTS에서 매매 대상 종목들로 구성된 관심종목 생성
키움 HTS에서 관심종목을 대상으로 한 조건검색식 생성
1) HTS의 조건검색 메뉴 선택
2) 대상변경 버튼 클릭하여 대상을 포트폴리오로 변경
3) 미리 생성한 관심종목을 선택
4) 관심종목이 모두 검색될 수 있도록 간단한 조건 작성
와이즈 트레이딩 룸에서 세트 생성
1) 와이즈 트레이딩 룸 실행
2) 시스템 접속
3) 세트 추가
4) 세트 유형을 조건식세트로 설정
5) 조건식을 HTS에서 작성한 조건식으로 설정
6) 기타 설정 후 저장
전략, 스크립트 설정 및 스크립트 작성은 5.1 예제 사용하거나 참고하여 작성
3.3 기초 스크립트 예제
기초 예제로 알 수 있는 내용
- 일봉, 분봉 등의 차트와 보조지표를 이용한 매수와 매도
- 일정 시간 경과 후나 특정 시간에 매도
- Post를 이용한 매수, 매도 신호 생성
학습전 알아야할 사항
- 스크립트는 기본적으로 매수와 매도신호 생성을 위한 if문 형태로 작성
- 신호 생성을 위한 매매 데이터는 객체(탐색종목, 일봉_0봉전, 탐색리스트 등)의 형태로 제공되고 객체가 갖고 있는 데이터(탐색종목.평가손익율, 탐색종목.등락율 등)를 사용
3.3.1 가격 이동평균 정배열
예제로 알 수 있는 내용
- 기본제공 일봉, 분봉 사용
- 가격이동평균 보조지표 사용
스크립트 설명
- 일봉상으로 가격 이동평균선이 정배열, 단기 이동평균선이 상승중이면서 분봉상 이동평균선으로도 상승일 경우, 매수신호를 생성하는 예제입니다.
- Post로 매매신호 생성시 스크립트에서 다양한 사용자 옵션이 가능하지만, 신호만 줄 수도 있습니다.
- 기본 제공 일봉, 분봉 등은 최대 10봉전까지 입니다.(예, 일봉_10봉전, N분봉_10봉전)
스크립트
// 일봉 이평선 정배열, 분봉 이평선 정배열, 일봉 이평선, 분봉 이평선이 상승추세일 경우, 신규매수
// 1. 일봉정배열
// 2. 일봉 단기선이 상승
// 3. 분봉 단기선이 중기선 위에 위치
// 4. 분봉 단기선이 상
if (일봉_0봉전.MA_단기 > 일봉_0봉전.MA_중기 && 일봉_0봉전.MA_중기 > 일봉_0봉전.MA_장기
&& 일봉_0봉전.MACD > 일봉_1봉전.MACD && 일봉_1봉전.MACD >= 일봉_2봉전.MACD
&& N분봉_0봉전.MA_단기 > N분봉_0봉전.MA_중기
&& 일봉_2봉전.MA_단기 < 일봉_0봉전.MA_단기
&& N분봉_2봉전.MA_단기 < N분봉_0봉전.MA_단기 )
Post(매수);
추가 설명
- 스크립트에서 사용할 수 있는 차트는 일봉, 1분봉, N분봉, N2분봉, N틱봉의 5종류이고 일봉, 1분봉은 스크립트에서 사용여부와 상관없이 기본적으로 생성되고, 나머지 차트는 스크립트에서 사용될 경우에만 생성됩니다.
- 스크립트 작성 편의를 위해 각 차트마다 0봉전부터 10봉전까지는 별도의 차트 객체를 제공합니다(예, 일봉_0봉전, N분봉_10봉전 등).
- 10봉이전의 차트 데이터를 이용하기 위해서는 탐색종목의 차트 객체를 직접 이용할 수도 있습니다(예, 탐색종목.차트_일, 탐색종목.차트_N분 등).
- 스크립트에서 1분봉은 단분봉이라는 명칭으로 사용됩니다.
- 차트 및 보조지표는 전략 설정에서 사용자가 설정할 수 있습니다.
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
3.3.2 매수후 10분 경과하면 매도
예제로 알 수 있는 내용
- 차트를 이용하여 매수시간 알아내기
- C# DateTime.ParseExact로 문자열 시간을 DateTime으로 변환하기 및 경과시간 계산하기
- 타임컷 구현
스크립트 설명
- 매수후 무조건 10분 경과하면 매도
스크립트
var _매수 = 탐색종목.차트_1분.Where(w => w.매수수량 > 0).FirstOrDefault();
if (_매수 != null)
{
var 경과시간 = (DateTime.Now - DateTime.ParseExact(_매수.체결시간, "yyyyMMddHHmm", null)).TotalMinutes;
if (경과시간 >= 10)
Post(매도, 100, 0);
}
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
3.3.3 매수후 익일 9시 30분에 전량 매도
예제로 알 수 있는 내용
- 일봉 차트를 이용하여 전일 매수여부 알아내기
- C# TimeSpan.Parse로 문자열을 시간으로 변환하기
- 타임컷 구현
스크립트 설명
- 매수후 익일 9시 30분에 전량 매도
스크립트
var _전일매수수량 = 일봉_1봉전.매수수량;
var _현재시간 = DateTime.Now.TimeOfDay;
var _매도시간도달 = _현재시간 >= TimeSpan.Parse("09:30:00");
if (_전일매수수량 > 0 && 탐색종목.주문가능수량 > 0)
{
if (_매도시간도달)
Post(매도,100,0);
}
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
3.3.4 시초가 대비 하락시 매도
예제로 알 수 있는 내용
- 무조건 매수
- 시초가 대비 하락률 계산
스크립트 설명
- 무조건 참(true) 조건으로 매수하고, 시초가 대비 3% 이상 하락시 매도하는 스크립트
스크립트
if (true)
Post(매수);
var 시초가 = 일봉_0봉전.시가;
var 현재가 = 일봉_0봉전.종가;
var 하락폭 = 시초가 - 현재가;
var 하락율 = 하락폭 / 시초가 * 100;
if ( 하락폭 > 0 && 하락율 > 3.0)
Post(매도);
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
3.3.5 이평선을 이용한 ETF단타
예제로 알 수 있는 내용
- 분봉을 이용한 일정 주기 분할 매수법
- 분봉 가격 이동평균선 사용
- Post로 이벤트 메시지 기록하기
스크립트 설명
- 분봉을 이용하여 분할매수와 분할매도 하기
스크립트
// ETF 단타를 위한 이평선 전략
// 3분봉, 5,30,60
var _매수주문여부 = N분봉_0봉전.매수주문횟수 > 0;
var _중기아래단기이평선 = N분봉_0봉전.MA_단기 < N분봉_0봉전.MA_중기;
var _단기이평선상승 = N분봉_0봉전.MA_단기 > N분봉_1봉전.MA_단기 && N분봉_1봉전.MA_단기 > N분봉_2봉전.MA_단기;
//단기 이평선이 중기 이평선 밑에서 상승중이면 매수
if (!_매수주문여부)
{
if (_중기아래단기이평선 && _단기이평선상승)
Post(매수,10,0, 비중계산:1, 메시지:"변동성돌파");
}
var _매도주문여부 = N분봉_0봉전.매도주문횟수 > 0;
var _단기이평선하락 = N분봉_0봉전.MA_단기 < N분봉_1봉전.MA_단기 && N분봉_1봉전.MA_단기 < N분봉_2봉전.MA_단기;
if (!_매도주문여부)
{
if (_단기이평선하락 && 탐색종목.종가 < N분봉_0봉전.MA_단기)
if (탐색종목.주문가능수량 > 0 && 탐색종목.평가손익율 > 1.0)
Post(매도,20,0);
}
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
3.4 응용 스크립트 예제
응용 예제로 알 수 있는 내용
- 변동성 돌파 전략 구현
- 보조지표를 이용한 단기적 상승 시점 포착
- 여러 탐색종목 중 우선순위로 매수하거나 매도하는 법
- 외인, 기관의 시장 수급을 이용한 매매
- 사용자 로거로 매매 검증 데이터 남기는 법
3.4.1 변동성 돌파 전략
예제를 통해 알 수 있는 내용
- 변동성 돌파 전략 구현
- 탐색종목.차트_일 객체 직접 참조 및 계산
- 일봉을 이용한 당일 1번 매수법
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
// 전일에 매수했고, 당일 매도주문이 없었으면 매도
if (일봉_0봉전.매도주문횟수 == 0 && 일봉_1봉전.매수주문횟수 > 0)
Post(매도,100,0);
// 당일 아직 매수하지 않았고, 현재가가 설정한 가격을 돌파하면 매수
var 일봉갯수 = 탐색종목.차트_일.Count;
var 계산시작위치 = 일봉갯수 - 20 - 1; //전일까지 계산위해서 -1
var rangeTemp = 0.0;
double[] rangeArray = new double[20];
for (int i = 0; i < 20; i++)
{
rangeTemp = 탐색종목.차트_일.ElementAt(계산시작위치).고가 - 탐색종목.차트_일.ElementAt(계산시작위치).저가;
rangeArray[i] = rangeTemp;
계산시작위치++;
}
var range_평균 = rangeArray.Average();
var 배수 = 0.5;
if (일봉_0봉전.매수주문횟수 == 0)
if (일봉_0봉전.종가 > (일봉_0봉전.시가 + range_평균 * 배수))
Post(매수, 100, 0);
3.4.2 단기 상승 전환시 매수하는 스크립트
아래 예제는 실제 매매에 사용되고 있는 스크립트 예제입니다.
예제를 통해 알 수 있는 내용
- 특정 시간대에서만 매수하거나 매도
- 차트 및 보조지표 이용
- 평가손익율, 등락율 등의 종목 데이터 이용(탐색종목 객체)
- Post로 매매신호 생성
- 여러 탐색 종목 중 가장 조건이 좋은 종목을 우선해서 매수(탐색리스트 객체 이용)
- 여러 영업일에 걸쳐서 분할매도(탐색종목.체결내역 객체 이용)
- 세트 수익률에 따라 손절종목 골라서 매도(탐색종목.세트 객체 이용)
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
var 현재시간 = DateTime.Now.TimeOfDay;
var 매수시간_장중 = 현재시간 >= TimeSpan.Parse("09:10:00") && 현재시간 <= TimeSpan.Parse("15:10:00");
var 매수시간_장마감 = 현재시간 > TimeSpan.Parse("15:21:00");
var 매도시간_장마감 = 현재시간 > TimeSpan.Parse("15:10:00");
var 매도시간_장중 = 현재시간 >= TimeSpan.Parse("09:10:00") && 현재시간 <= TimeSpan.Parse("15:20:00");
if(매수시간_장중)
{
// 매수조건
//10분봉
//10분봉기준 이동평균20선 상승 추세 유지일때 매수
var 이동평균상승추세 = N분봉_0봉전.MA_장기 > N분봉_1봉전.MA_장기 && N분봉_1봉전.MA_장기 >= N분봉_2봉전.MA_장기;
// 10분봉기준, 종가가 5이평 위에 위치.
var 단기이평돌파 = N분봉_0봉전.종가 > N분봉_0봉전.MA_단기;
var 저점상승 = 단분봉_0봉전.저가 > 단분봉_1봉전.저가 && 단분봉_1봉전.저가 > 단분봉_2봉전.저가;
var 체결강도 = 탐색종목.체결강도 > 100 && 탐색종목.체결강도 < 300;
var _당일편입 = 탐색종목.최초편입시간.Date == DateTime.Today;
if (이동평균상승추세 && 단기이평돌파 && 저점상승 && 체결강도 && _당일편입)
Post(매수, 100, 0, 유지:60, 재주문:0, 메시지:"20이평상승 중 종가 5이평 위에 위치");
}
if (매수시간_장마감)
{
// 조건식편입상태로 오래있던 종목 우선순위로 매수
var 매수대상종목 = 탐색종목리스트.Where(w=>w.매수상태 == "탐색" && w.세트번호 == 탐색종목.세트번호 && w.등락율 >= 1.0 && w.등락율 < 15.0 && w.누적거래량 > 50000 && w.체결강도 < 300).OrderByDescending(w=>w.차트_1분.Count(z=>z.조건식편입)).FirstOrDefault();
if (매수대상종목 != null)
if (탐색종목.종목코드 == 매수대상종목.종목코드)
Post(매수,100,100, 메시지:"종가매수");
}
if (매도시간_장마감)
{
if(탐색종목.세트.수익률 < -5.0)
{
var 손절종목 = 탐색종목리스트.Where(w=>w.세트번호 == 탐색종목.세트번호 && w.검증모드 == 탐색종목.검증모드).MinBy(w=>w.평가손익율).FirstOrDefault();
if (손절종목 != null)
if (손절종목.종목코드 == 탐색종목.종목코드)
Post(매도,100, 0, 유지:60, 메시지:"장마감세트손절 -5%도달");
}
if (탐색종목.평가손익율 > 1.0)
Post(매도,100,100,메시지:"1% 익절"+탐색종목.종목명);
}
// 1, 2, 3, 종가 매도
if (매도시간_장중)
{
var 마지막매도주문 = 탐색종목.체결내역.FirstOrDefault(w=>w.주문구분 == "매도" || w.주문구분 == "매도정정");
if (탐색종목.평가손익율 >= 3.0)
{
//매도3
if (마지막매도주문 == null)
Post(매도, 75, 0, 비중계산:1, 유지:20, 재주문:0, 메시지:"3% 매도");
else
{
// 3차매도
if (마지막매도주문.주문평가손익율 >= 2.0 && 마지막매도주문.주문평가손익율 < 3.0)
Post(매도, 25, 0, 비중계산:1, 유지:60, 재주문:0, 메시지:"3% 3차 매도");
else if (마지막매도주문.주문평가손익율 >= 3.0)
if (탐색종목.평가손익율 - 탐색종목.최고평가손익율 <= -3.0)
Post(매도, 100, 100, 메시지:"3차 분할매도후, 3%하락 전량매도");
}
// 20% 이상 도달시 전량 매도
if (탐색종목.평가손익율 > 20.0)
Post(매도, 100, 100, 메시지:"20%도달 전량매도");
}
else if (탐색종목.평가손익율 >= 2.0 && 탐색종목.평가손익율 < 3.0)
{
//매도2
if (마지막매도주문 == null)
Post(매도, 50, 0, 비중계산:1, 유지:20, 재주문:0, 메시지:"2% 매도");
else
{
if (마지막매도주문.주문평가손익율 >= 1.0 && 마지막매도주문.주문평가손익율 < 2.0)
Post(매도, 25, 0, 비중계산:1, 유지:60, 재주문:0, 메시지:"2% 2차 매도");
}
}
else if (탐색종목.평가손익율 >= 1.0 && 탐색종목.평가손익율 < 2.0)
{
//매도1
if (마지막매도주문 == null)
Post(매도, 25, 0, 비중계산:1, 유지:20, 재주문:0, 메시지:"1% 1차 매도");
else if (마지막매도주문.주문평가손익율 >= 3.0)
Post(매도, 100, 0, 유지:60, 재주문:0, 메시지:"3% 매도후 하락으로 전량매도");
}
if(탐색종목.세트.수익률 < -5.0)
{
var 손절종목 = 탐색종목리스트.Where(w=>w.세트번호 == 탐색종목.세트번호 && w.검증모드 == 탐색종목.검증모드).MinBy(w=>w.평가손익율 * (1/w.체결강도)).FirstOrDefault();
if (손절종목 != null)
if (손절종목.종목코드 == 탐색종목.종목코드)
Post(매도,100, 0, 유지:60, 메시지:"장중세트손절 -5%도달");
}
}
3.4.3 스윙 저점 스크립트
아래 예제 역시 실제 매매에 사용된 스크립트입니다.
예제를 통해 알 수 있는 내용
- 시장 지표 및 외인/기관 순매수를 이용한 수급 확인
- 수급계산에 따른 동적 목표수익률 조정
- 사용자 로거 함수 작성을 통한 스크립트 검증법
예제에 대한 질문
예제에 대하여 궁금한 점은 네이버 사용자 카페에 질문을 올려주시면 답변드리겠습니다.
https://cafe.naver.com/wisetrading
탐색종목.조건식이탈시신규매수중지 = false;
var 현재시간 = DateTime.Now.TimeOfDay;
var 매수가능_시간 = 현재시간 > TimeSpan.Parse("09:30:00");
var 매도시간_장중 = 현재시간 >= TimeSpan.Parse("15:00:00") && 현재시간 < TimeSpan.Parse("15:20:00");
var 매도시간_장마감 = 현재시간 > TimeSpan.Parse("15:21:00");
var 매도시간_장마감_세트손절 = 현재시간 > TimeSpan.Parse("15:10:00");
var 외인수급 = 0;
var 기관수급 = 0;
var 수급점수 = 0;
if (탐색종목.시장구분 == 0)
{
외인수급 = (시장.KOSPI.시장종합.외인순매수금액 > 0.0) ? 1 : 0;
기관수급 = (시장.KOSPI.시장종합.기관순매수금액 > 0.0) ? 1 : 0;
수급점수 = 외인수급 + 기관수급;
}
else
{
외인수급 = (시장.KOSDAQ.시장종합.외인순매수금액 > 0.0) ? 1 : 0;
기관수급 = (시장.KOSDAQ.시장종합.기관순매수금액 > 0.0) ? 1 : 0;
수급점수 = 외인수급 + 기관수급;
}
var 목표수익률조정 = 0.0;
if (수급점수 == 2) 목표수익률조정 = 1.5;
if (수급점수 == 1) 목표수익률조정 = 1.0;
if (수급점수 == 0) 목표수익률조정 = 0.5;
if (탐색종목.세트.전략.세트별청산_실행여부)
탐색종목.세트.전략.세트별청산_목표수익률 = 목표수익률조정;
if (수급점수 > 0)
{
var 스토캐스틱_과매수_일봉 = 일봉_1봉전.SlowK > 80 && 일봉_0봉전.SlowK > 80;
var 단분봉이평 = 단분봉_0봉전.MA_단기 > 단분봉_0봉전.MA_중기;
var 편입가이하 = 탐색종목.종가 <= 탐색종목.편입금액;
//var 단분봉조건 = 단분봉_0봉전.MA_단기 < 단분봉_0봉전.MA_중기;
var _당일편입 = 탐색종목.최초편입시간.Date == DateTime.Today;
if (매수가능_시간 && 단분봉이평 && 편입가이하 && !스토캐스틱_과매수_일봉 && _당일편입)
Post(매수,100,0, 유지:20, 재주문:0, 메시지:"단기선 돌파로 매수");
}
if (매도시간_장중)
{
if (탐색종목.평가손익율 < - 10.0)
Post(매도,100,0, 유지:60, 메시지:"손절");
var 단분봉이평하락 = 단분봉_2봉전.MA_단기 > 단분봉_1봉전.MA_단기;
if (탐색종목.평가손익율 > 1.0 && 단분봉이평하락)
Post(매도,100,100,메시지:"1% 익절");
}
if (매도시간_장마감_세트손절)
{
if(탐색종목.세트.수익률 < -20.0)
{
var 손절종목 = 탐색종목리스트.Where(w=>w.세트번호 == 탐색종목.세트번호 && w.검증모드 == 탐색종목.검증모드).MinBy(w=>w.평가손익율 * (1/w.체결강도)).FirstOrDefault();
if (손절종목 != null)
if (손절종목.종목코드 == 탐색종목.종목코드)
Post(매도,100, 0, 유지:20, 메시지:"세트손절로 손절매도");
}
}
if (매도시간_장마감)
{
if (탐색종목.평가손익율 > 1.0)
Post(매도,100,100,메시지:"1% 익절");
}
// 고점대비 2% 하락시 매도
if (탐색종목.평가손익율 > 2.0)
if (탐색종목.최고평가손익율 - 탐색종목.평가손익율 > 2.0)
Post(매도,100, -1, 유지:20, 재주문:0, 메시지:"최고손익율 대비 -2% 하락 매도");
var 기본로그 = String.Format("평가손익율 ={0}, 최고평가손익율={1}",탐색종목.평가손익율, 탐색종목.최고평가손익율);
로거(@".\logs\" + 탐색종목.종목명 + ".txt",기본로그);
아래 스크립트는 스크립트 작성 화면의 사용자함수 영역에 작성해야 합니다.
// 매수로그 사용자 정의 함수
private void 로거(string 파일명, string 메시지)
{
string fileName = 파일명;
string 로그메시지 = DateTime.Now.TimeOfDay + " " +메시지;
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName, true))
{
writer.WriteLine(로그메시지);
}
}
3.4.4 당일거래량 돌파 조건식에 적용한 스크립트
아래 예제는 조건검색식으로 거래량이 큰 폭으로 증가한 종목을 찾아서 매수세가 있을때 2% 익절과 -2% 손절로 매매하는 스크립트입니다.
/*
매매 대상:
- 당일 거래량이 최근 5일 평균거래량 보다 2배 이상일 경우 종목이 검색됨.
매수:
- 오전 10시 이전에 거래량이 증가했을때만 매수.
- 1분봉으로 계속해서 주가가 오르고 있을때만 매수(1분봉 저가 상승중).
- 체결강도 증가하면서 100이상일 경우만 매수.
매도:
- 평가손익율 2% 도달시 익절
- 평가손익율 -2% 도달시 손절
*/
var _현재시간 = DateTime.Now.TimeOfDay;
var _매매시간_매수 = _현재시간 >= TimeSpan.Parse("09:00:00") && _현재시간 <= TimeSpan.Parse("11:00:00");
if (_매매시간_매수)
{
var _매수_1분봉저가상승중 = 단분봉_2봉전.저가 < 단분봉_1봉전.저가 && 단분봉_1봉전.저가 < 단분봉_0봉전.저가;
var _매수_체결강도_상승_100이상 = 단분봉_1봉전.체결강도 < 단분봉_0봉전.체결강도 && 탐색종목.체결강도 >= 100;
if (_매수_1분봉저가상승중 && _매수_체결강도_상승_100이상)
Post(매수, 100, 0, 메시지:"1분봉 저가 상승, 체결가도 증가 매수");
}
if (탐색종목.주문가능수량 > 0)
{
var _매도_익절 = 탐색종목.평가손익율 >= 2.0;
var _매도_손절 = 탐색종목.평가손익율 <= -2.0;
if ( _매도_익절)
Post(매도, 100, 100, 메시지:"2% 수익 익절 매도");
if ( _매도_손절)
Post(매도, 100, 100, 메시지:"-2% 손실 손절 매도");
}
댓글
댓글 쓰기