답변완료
예스트레이더를 활용해서
수고가 많으십니다
저는 예스트레이더를 이용하여 시장가주문이 아닌 지정가주문(시스템 매매 설정창에서 종가로 설정)으로 시스템트레이딩을 하려고 합니다.
그런데, 이럴 경우 가장 문제가 미체결이 발생할 경우 그 다음부터 제가 수동으로 개입하지 않으면 원하는 수량의 매매가 안되고 수량이 자꾸 꼬인다는 것입니다.
그래서 이를 해결하고자 예스스팟을 이용하려고 합니다.
그런데, 저는 예스스팟의 수식작성법을 전혀 몰라서 도움을 받고자 합니다.
예스트레이더로 매매수식은 작성완료했습니다.
그리고, 유진투자선물에서 해외선물을 매매할 계획입니다.
한번 매매할 때 마다 9계약씩 매매한다고 가정하겠습니다.
피라미딩은 적용하지 않습니다.
제가 원하는 것은...
예스트레이더의 매매신호에 따라 지정가로 주문이 발생하되, 앞전 매매신호에서 혹시 미체결이 발생하더라도 자동으로 현재 잔고를 확인하여 잔고만큼만 청산하고 새로운 9계약이 진입되도록 하고자 합니다.
그리고, 이렇게 새로운 매매신호가 발생하면 앞선 미체결(부분 미체결 포함)은 자동취소가 되도록 하고 싶습니다.
참고로, 제가 현재 작성한 예스트레이더의 매매수식은 하나의 시스템식안에 매수되는 경우가 몇가지 있고(매수명 : 매수A, 매수B, ... 등), 매도되는 경우에도 몇가지(매도명 : 매도A, 매도B, ... 등)가 있습니다.
제가 수동으로 개입하지 않더라도 예스트레이더 신호를 이용하여 지정가 매매를 할수 있도록 예스스팟 수식을 만들어 주시면 감사하겠습니다.
2019-01-21
2990
글번호 224704
답변완료
GetTheNumberOfBalances 명령시 갯수가 0인 이유?
Account1 계좌객체에 계좌를 선택하고, 아래코드를 실행하면 잔고갯수가 0 나오는데,
이유를 알 수 있을까요? 참고로 잔고 캡쳐 이미지 첨부합니다.
var num = Account1.GetTheNumberOfBalances();
Main.MessageList("<<<", num, Account1.number);
혹시, 중복접속시에는 알 수 없는것인가요?
PC 1에서 주문 및 체결
PC 2에서 위 코드를 실행하면 어떻게 되나요?
2019-01-04
3024
글번호 224701
답변완료
설정시간 신호유지
아래의 수식에서
미완성신호가 발생 후 계속하여 미완성신호가 유지되고 있는 동안만
타이머가 작동하도록 하고자 하나,
타이머 설정시간보다 아주짧게 미완성신호가 발생 한다음 소멸하여도
타이머는 계속 작동하여 주문이 접수체결 됩니다.
이를 타이머가 설정 된 시간동안 미완성신호가 계속유지되고 있을 때에만
주문이 접수체결 되도록 아래의 수식을 변경하여 주시면 감사 하겠습니다.
즉, 타임어 설정시간이 5초인경우
1. 5초 미만 미완성신호 발생 후 소멸시 -------> 주문접수/체결 발생하지 않음.
2. 5초간 미완성신호가 계속유지되고 있을때 만 --------> 주문접수 / 체결 됨
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))
if (T <= 0 && (A1.Balance.position == 1 || A1.Balance.position == 0) && IncompleteSignal.signalKind == 1)
{
T = 1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(1,5000);
}
if (T >= 0 && A1.Balance.position == 1 && IncompleteSignal.signalKind == 3)
{
T = 0;
Main.KillTimer(1);
Main.SetTimer(2,5000);
}
if (T >= 0 && (A1.Balance.position == 2 || A1.Balance.position == 0) && IncompleteSignal.signalKind == 3)
{
T = -1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(2,5000);
}
if (T <= 0 && A1.Balance.position == 2 && IncompleteSignal.signalKind == 1)
{
T = 0;
Main.KillTimer(2);
Main.SetTimer(1,5000);
}
}
function Main_OnTimer(nEventID)
{
//마지막봉 미완성 신호정보 셋팅
var Incom = C1.GetIncompleteSignal();
if (nEventID == 1 && T == 1)
{
Main.KillTimer(1);
A1.OrderBuy(KP.code, VV, KP.Ask(2),2);
Main.MessageLog("매수진입");
}
if (nEventID == 1 && T == 0)
{
Main.KillTimer(1);
Main.MessageLog("중복매수진입금지");
}
if (nEventID == 2 && T == -1)
{
Main.KillTimer(2);
A1.OrderSell(KP.code, VV, KP.Bid(2),2);
Main.MessageLog("매도진입");
}
if (nEventID == 2 && T == 0)
{
Main.KillTimer(2);
Main.MessageLog("중복매도진입금지");
}
}
2019-01-02
3124
글번호 224700
답변완료
질문드립니다.
아래는 친절히 답해주셔서 잘 사용하고 있습니다. 감사합니다.
1. 종목검색을 9시에 시작하고 원하는시간을 설정하여 종목검색을 종료할 수 있었으면 좋겠습니다.
2. 관심종목에 넣은 종목을 매매하고싶습니다.
3. 아래 스톱셋 기능을 제거하고 싶습니다.
4. 2%수익시 종목의 80%를 시장가로 청산하는 청산식이 추가되었으면 좋겠습니다.
감사합니다.아래는 로직입니다.
var reqItemList = []; //검색되서 차트요청한 종목에 대해 종목코드를 저장할 배열변수
var ItemList = []; //검색된 종목 중 reqItemList에 없는 종목에 대해 종목코드를 저장한 배열변수장
var Count; //요청할 종목갯수
var ReqCount; //종목검색 후 차트객체 요청한 종목갯수
function Main_OnStart()
{
Main.MessageList("스팟시작");
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색완료 : 검색된 종목수 : ",nCount);
//ItemList 변수 초기화
ItemList = [];
//검색종목수가 1개 이상일떄만 수행
if (nCount > 0)
{
//reqItemList에 저장된 종목코드가 한개도 없을때
if (reqItemList.length == 0)
{
//ItemList 배열변수에 aItemList를 차례대로 모두 옮김
Count = 0;
for (var i = 0; i < nCount; i++)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
else//reqItemList에 저장된 종목코드가 한개이상일때
{
//검색된 종목 중 reqItemList에 없는 종목만 ItemList에 담음
Count = 0;
for (var i = 0; i < nCount; i++)
{
var add = true;
for (var z = 0; z < reqItemList.length; z++)
{
if (aItemList[i] == reqItemList[z])
{
add = false;
Main.MessageList("이미 차트생성된 종목 : ",aItemList[i]);
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
}
//생성할 종목수가 1개 이상일떄
if (Count > 0)
{
Main.MessageList("차트객체 생성시작 : 생성할 종목수 : ",Count,ItemList);
Main.SetTimer(1, 1000);
ReqCount = 0;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 2)
{
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(
new StopLoss(5, CALCMETHOD_PERCENT, 0),
new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0),
new StopProfitTarget(10, CALCMETHOD_PERCENT, 0),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(230000));
var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
//생성요청한 종목에 대해 reqItemList에 종목코드 추가
reqItemList.push(ItemList[ReqCount]);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageList("차트객체 생성완료 : 생성된 종목수 : ",ReqCount);
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,ChartEx.GetClose(1,0),1);
Main.MessageList("매도주문");
} //잔고수량만큼만 시장가매도
}
}
2019-01-18
3099
글번호 224698
답변완료
왜 1820 답을 안 달아 주시나요?
chart1 이름이 울트라수퍼챠트
account1 이름이 9999-9999-99
콜옵션 가격은 0원에서 7만원사이 가격중 가장 큰 콜옵션 선택
울트라수퍼챠트에서 선물로 매수신호가 나올때 콜옵션 매수,
선물로 매도신호가 나올때 콜옵션 매도 나오게
예스스탁수식 작성해주세요
(물론 데이 트레이딩용이므로 첫신호가 선물의 매수신호가 먼저 나온 경우는 다음신호가 매도 일경우 매수청산후 매도진입하도록,
선물의 매도신호가 첫신호로 먼저 나온경우는 매도 청산후 매수 진입하도록, 신호 나오게 해주시고요
즉 울트라수퍼차트에서 나오는 선물의 신호가 그대로 옵션 챠트에서도 작동되도록 수식 부탁드립니다.
그리고 제가 스팟은 처음이라 자동매매를 위해 제 계좌를 연계하는 방법도 모릅니다.
그것도 수식에 넣어 주십시요
항상 감사드립니다
문의사항 010 3231 4592 유원장드림
2018-12-22
2945
글번호 224683