답변완료
매도, 매도식 부탁드립니다.2
==================================================================================
****매수대상 선정 방법 선택
매수시 아래 방법으로 종목선정
1. 매수 대상 선정 방법1: a. 관심종목2에 저장된 종목 호출
b. 파워종목검색
2. 매수 대상 선정 방법2: c. (a or b) 방법으로 선정된 종목 중 관심종목3에 저장된 종목을 제외
d. (a or b) 방법으로 선정된 종목 중 파워종목검색의 조건을 만족하는 종목만 선정
(((d의 검색식은 과거의 조건으로 검색하므로, 검색당일에는 검색 내용이 달라지지 않을 예정입니다.)))
*****매수방식을 조합할 수 있게 부탁드립니다*****
if (inputvar1 == 1 ) ==> a+c
if (inputvar1 == 2 ) ==> a+d
if (inputvar1 == 3 ) ==> b+c
if (inputvar1 == 4 ) ==> b+d
==================================================================================
****매수방법선택
아래의 (1-1+1-2)와 (2-1+2-2)중 선택한 방법으로 tt3 ~ tt4 시간 사이에 매수한다.
종목당 매수금액 = 총매수금액/선정된 종목개수
매수후 매수량의 xx%만큼 익절 tp%, 손절 sl%를 설정한다.
선택한 종목을 tt3 ~ tt4 시간 사이에
1-1. 전일 종가대비 >= -dd% 이면 전일 종가대비 -nn1%에 매수주문
(종가대비 -nn1%에 해당하는 가격의 지정가)
1-2. 전일 종가대비 < -dd% 이면 전일 종가대비 -nn2%에 매수주문
(현재가 대비 -nn2%에 해당하는 가격의 매수3호가)
선택한 종목을 tt3 ~ tt4 시간 사이에
2-1. nn2 회 분할 매수한다.
2-2. 마지막 매수직후 미체결 취소후 취소량 만큼 현재가 매수.
****매수방법도 1, 2중에 선택하도록 부탁드립니다.
예1) if(inputvar2 == 1) ==> 매수방법 (1-1+1-2)로 매수
예2) if(inputvar2 == 2) ==> 매수방법 (2-1+2-2)로 매수
==================================================================================
****당일 매도
3. 보유종목중 관심종목4에 있는 종목은 매도에서 제외한다.
4. tt5 직전 미체결 매수 취소
5. tt5~tt6까지 cnt2 회 분할매도한다.
6. 매번 매도전 미체결 매도를 취소한다.
7. 매번 매도량는 잔고/(남은 매도 회차) 로 한다.
예) 총 cnt2 회 매도 일때.
1회차 매도: 잔고수량/cnt2
2회차 매도: 갱신된 잔고수량/(cnt2-1)
mm2회차 매도: 갱신된 잔고수량/(cnt2-mm2+1)
cnt2회차 매도 : 갱신된 잔고수량/1
8. 마지막 회차매도시에는 전량매도 한다.
(마지막회차만 시장가, 나머지 매도는 매도1호가+1틱)
==================================================================================
****매수 다음날 오전 매도
9. 보유종목중 관심종목1에 있는 종목은 매도에서 제외한다.
10. tt1~tt2까지 cnt1 회 분할매도한다.
11. 매번 매도전 미체결 매도를 취소한다.
12. 매번 매도량는 잔고/(남은 매도 회차) 로 한다.
예) 총 cnt1 회 매도 일때.
1회차 매도: 잔고수량/cnt1
2회차 매도: 갱신된 잔고수량/(cnt1-1)
mm1회차 매도: 갱신된 잔고수량/(cnt1-mm1+1)
cnt1회차 매도 : 갱신된 잔고수량/1
13. 마지막 회차매도시에는 전량매도 한다.
(마지막회차만 시장가, 나머지 매도는 매도1호가+1틱)
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
매매 당일 시간순서는 (tt1-tt2), (tt3-tt4), (tt5-tt6) 순입니다.
모든 매수, 매도는 관심종목에서 호출한 종목만을 대상으로 한다(<-- 가능한 방법이라면 실현되도록 부탁드립니다.*****
2019-10-01
3662
글번호 224996
답변완료
홈페이지에 있는 예스스팟 안내서 관련해서 질문드립니다.
예제 3번이
스팟전략이 [예스스팟 모니터]에 적용하면
삼성전자를 매수1호가에 1주 매수주문하고
해당 주문에 대한 주문응답이 수신된 후 60초 후에도 미체결 상태이면
매도2호가로 정정주문을 발생합니다.
라는 문제인데 해당 파일에선 코딩을
var ID;
var Number;
function Main_OnStart()
{
ID = A1.OrderBuy(SSE.code, 1, F1.Bid(1), 0);
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == ID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(1, 60000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
A1.OrderReplacePrice(Number,F1.Ask(2));
Main.KillTimer(1);
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == Number)
Main.KillTimer(1);
}
이렇게 해 놓았더라구요 A1은 계좌고.
그런데 똑같이 만들어서 돌려보니 ID = A1.OrderBuy(SSE.code, 1, F1.Bid(1), 0); <-- 이 부분에서 에러가 뜹니다 기타 에러요.
주문에서부터 오류가 생성되니 당연히 밑의 코드들은 돌아가지 않구요. 이거 어떻게 해결하나요?
2019-09-09
3498
글번호 224988
답변완료
종목 검색 후 시스템 적용
"바닥지지" 종목 검색 후 결과 종목들에 대해서 "우드스탁_주식_매매신호_Ver7.0"을 적용하라는 예스스팟 수식을 작성해 봤습니다.
예스스팟을 실행하면, 1분 정도 후에 프로그램이 꺼져 버리는데.. 수식이 잘못된 건지 아니면, 시스템 수식이 복잡하다보니(10000줄정도 됩니다.) 프로그램이 터지는 건지 궁금합니다. (실제로 수동으로 시스템 돌릴 때 4개 이상 차트에 시스템을 적용하면 프로그램이 꺼집니다.)
그리고, 아래 주어진 식을 보면 검색으로 나온 모든 종목들을 각각 시스템을 돌리는데, 그렇게 하지 않고 하나의 차트에 종목이 순서대로 적용되고, 시스템에서 매수 신호가 발생할 경우만 새로운 차트를 만들게 하고 싶습니다.
조언 부탁드립니다.
var List;
var ListCnt;
var ReqCount;
//스팟 첫 실행시
function Main_OnStart()
{
//시작 메세지 출력
Main.MessageLog("시작");
// 파워종목검색의 test Search라는 이름의 사용자검색조건 검색 요청
Main.ReqPowerSearch("바닥지지")
}
//종목검색 완료되어 리스트(검색된 종목코드) 수신
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목코드를 저장
List = aItemList;
//검색된 종목수 저장
ListCnt = nCount;
Main.SetTimer(1,2000);//2 타이머
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
//2초 단위로 한종목씩 차트 생성
if (nEventID == 1)
{
//요청이 검색된 종목수 만큼 되었으면 터이머 종료
if (ReqCount == ListCnt)
Main.KillTimer(1);
//ReqCount번째 종목요청
//종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청
//차트설정 :종목, 주기 1, 일간, 조회건수 400
var C1 = new ReqChartItem(List[ReqCount], 1, CHART_PERIOD_DAILY, 400, CHART_REQCOUNT_DAILY, false,false);
//시스템 설정
var S1 = new SystemInfo("우드스탁_주식_매매신호_Ver7.0");
//C1차트설정, S1시스템설정으로 첫번째 종목 차트 생성
Main.ReqChartEx(C1,S1);
ReqCount = ReqCount+1;//요청횟수 1증가
}
}
//생성된 차트에서 신호가 발생하면
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호완성 출력
Main.MessageLog("신호완성");
//매수신호 발생하면 매수주문
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Main.GetOrderCode(ChartEx.code),1,0,1);
Main.MessageLog("매수");
}
//청산신호 발생하면 매도주문
if (Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(ChartEx.code),1,0,1);
Main.MessageLog("매수청산");
}
}
2019-09-08
3357
글번호 224985
답변완료
수식 보완 부탁드립니다.
평소 도움에 감사드립니다.
조건검색으로 검색된 종목을 특정기준으로 정렬해서 그중 10종목만 매수하려합니다.
-정렬기준: (전일고가-전일종가/(전일종가) (내림차순)
* 전일 데이타를 가져오는게 어려움이 많다면 전일 15:30분이후에 검색해서
종목정렬 및 관심종목 저장한후 당일에 가져오는 로직도 좋습니다.
*아래 수식은 기존 QnA에 있던 건데 여기에 수정 보완해주시면 감사하겠습니다.
-------------------------------------------------------------------
var list;
//차트객체 순서대로 저장할 변수
var ct = [];
//스파시작
function Main_OnStart()
{
//종목검색
Main.ReqPowerSearch("aaa");
}
//종목검색완료
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목을 전역변수에 저장
//list = aItemList;
list = ["005930","000660","010950","090430","299660"];
//요청카운트 (첫종목 0으로 시작)
req = 0;
//차트설정, 시스템 설정
var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null);
//차트객체 요청
Main.ReqChartEx(ChartSet,SystemSet);
}
//차트객체 생성완료
function Main_OnRcvChartEx(ChartEx)
{
//ct배열에 차트객체 저장
ct[req] = ChartEx;
Main.MessageList(req,ct[req].GetCode(1));
//요청횟수 1 증가
req = req+1;
//요청횟수가 검색된 종목수 보다 작으면
//다음종목 요청
if (req < list.length)
{
//차트설정, 시스템 설정
var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null);
//차트객체 요청
Main.ReqChartEx(ChartSet,SystemSet);
}
else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝
{
Main.MessageList("차트객체 생성끝");
}
}
//차트에서 신호가 발생하면
function Main_OnRiseSignal(ChartEx, Signal)
{
Main.MessageList("신호발생 : ",Signal.code,Signal.signalKind);
for (var i = 0; i < ct.length; i++)
{
//전체 차트 객체 중 신호발생된 객체를 찾고
if (ChartEx.GetCode(1) == ct[i].GetCode(1))
{
//매수신호이면 신호가격으로 10주 주문
if (Signal.signalKind == 1)
{
Main.MessageList("매수주문 : ",i,ct[i].GetCode(1));
Account1.OrderBuy(ct[i].GetCode(1), 10, Signal.price,0);
//타이머를 차트객체 배열방 번호와 동일번호로 지정
Main.SetTimer(i, 10000);//10초 타이머
}
//매도신호이면
if (Signal.signalKind == 2)
{
//전체 미체결 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체미체결 중 신호발생 종목과 같은 종목의 미체결은 모두 취소
for (var z = 0; z < num; z++)
{
Account1.SetUnfill(z);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == ChartEx.GetCode(1))
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고셋팅
Account1.SetBalance(ct[i].GetCode(1), 0);
//잔고수량이 있으면 신호가격으로 전량청산
if (Account1.Balance.count > 0)
{
Main.MessageList("매도주문 : ",i,ct[i].GetCode(1));
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Signal.price, 0);
//타이머를 차트객체 배열방 번호와 동일번호로 지정
Main.SetTimer(i, 10000);//10초 타이머
}
}
break;
}
}
}
//타이머가 동작하면
function Main_OnTimer(nEventID)
{
Main.MessageList("타이머 : ",nEventID);
//동작된 타이머 번호의 차트객체에서 종목코드 가져와 종목객체생성
Main.ReqMarketData(ct[nEventID].GetCode(1));
//1회 동작 후 타이머 종료
Main.KillTimer(nEventID);
}
//종목객체 생성되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체생성 : ",MarketData.code);
//종목객체 MD변수에 저장
var MD = MarketData;
//전체 미체결 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체미체결 중 신호발생 종목과 같은 종목의 미체결을 찾아
for (var z = 0; z < num; i++)
{
Account1.SetUnfill(z);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == MD.code)
{
//매수주문이면
if (Account1.Unfill.orderKind == 2)
{
//정정할 가격 매도1호가
var ReplacePrice = MD.Ask(1);
//정정할 가격이 주문가겨과 다르면
if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price)
{
//정정주문
Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice);
}
}
//매도주문이면
if (Account1.Unfill.orderKind == 1)
{
//정정할 가격 매수 1호가
var ReplacePrice = MD.Bid(1);
//정정할 가격이 주문가격과 다르면
if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price)
{
//정정주문
Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice);
}
}
}
break;
}
//종목객체 삭제
Main.RemoveObject(MD);
}
2019-09-06
3268
글번호 224984