답변완료
스팟수식문의
1. 종목검색을 통해 검색된 종목을 확장차트를 이용해 매매 테스트중입니다.
종목당 총 예수금의 5%이내에서만 진입하게 하려는데 피라미딩 설정에서 다른진입신호로 해줄경우는 문제가 없는데 모든진입신호로 하니 총 예수금의 주문가능금액까지 진입이 됩니다.
아래는 코드 일부입니다.
gTotalMoney, gEntryMoney는 전역변수선언되었음
gTotalMoney = Math.floor(CAC.GetBalanceETCinfo(0)); // 계좌 총 예수금 조회
gEntryMoney = gTotalMoney * (5 / 100); // 종목당 총 예수금의 5%내에서 매수진입
function Main_OnRiseSignal(ChartEx, Signal)
{
for (var i = 0; i < gRcvCount; i++)
{
if (ChartEx.GetCode(1) == gEntryItemObject[i].code)
{
if (Signal.signalKind == SIG_BUY)
{
Main.MessageList(GetTicketTime() + ": 매수주문[" + Signal.code + "]");
gEntryItemBuyVolume[i] = 0;
// 매수가능금액으로 총 주문가능수량 산출
gEntryItemBuyVolume[i] = Math.floor(gEntryMoney / gEntryItemObject[i].Ask(5));
CAC.OrderBuy(Signal.code, gEntryItemBuyVolume[i] /3, gEntryItemObject[i].Ask(1), 0); // 매도1호가 주문
CAC.OrderBuy(Signal.code, gEntryItemBuyVolume[i] /3, gEntryItemObject[i].Bid(2), 0); // 매수3호가 주문
CAC.OrderBuy(Signal.code, gEntryItemBuyVolume[i] /3, gEntryItemObject[i].Bid(5), 0); // 매수5호가 주문
gUnfillCode[i] = Signal.code;
Main.SetTimer(10, 60000); // 10번 타이머 N분
}
}
~~~~
}
2. 첨부그림 1과 같이 메시지가 뜨는 원인은 무엇인지요?
3. 총 예수금이 1천만원이라고 치면 종목당 최대 10% 금액인 100만원 내에서만 진입을 하고자 합니다. 매수를 2 ~ 3일에 걸쳐 진입하는데 최대 10% 금액을 넘어서면 안됩니다.
위 수식 개선 좀 부탁드리겠습니다.
4. 60분봉으로 종목검색후 1분봉으로 진입하는데 60분봉 검색된 종목에 한해서 1분봉 확장차트 생성 이후부터 시스템 신호를 발생시킬 수는 없는지요? 1분봉 시스템식에서 조건이 만족하면 이미 신호가 발생된 상태가 많아 60분봉 검색된 종목이 실제적으로 진입을 하지 못하는 문제가 있습니다. 따로 논다고 할까요~~
목적은 확장차트 생성 이후부터 시스템 신호가 발생되게 하고, 오버나잇하여 잔고가 있는 상태라면 시스템 신호가 이전에 발생된 것을 유지하게 했으면 합니다.
어떤 해결책이 있는지 궁금합니다. 힌트라도 주시면 감사하겠습니다.
확장차트 생성이후부터 시스템식을 적용할 것인지, 아닌지를 구분할 수 있는 옵션을 추가했으면 합니다.
감사합니다.
2017-01-05
1902
글번호 224083
답변완료
Account1.GetBalanceETCinfo 값이 0으로 나옵니다.
var gIsNH = true;
var infoNum = gIsNH ? 16 : 5;
var d100 = Account1.GetBalanceETCinfo(infoNum); //NH D 100% 주문가능금액, 하이투자증권 : 5, 주문가능금액
var dplus2 = Account1.GetBalanceETCinfo(20); //NH D + 2 예수금
this.currency = gIsNH ? dplus2 : d100;
dplus2, ", currency = ", this.currency);
this.balance = Account1.GetTotalAmount(1, 2); //주식 잔고 평가금액
gInitialMoney = Math.min(초기투자금액, gInitialMoney);
var fakeCurrency = gInitialMoney - this.balance;
this.currency = this.currency > fakeCurrency ? fakeCurrency : this.currency;
if( this.currency <= 0 ) {
this.moneyPerStock = this.moneyToBuyStock = this.moneyToBuy = 0;
Log.msg("주문 가능 현금이 없습니다. currency = ", this.currency, ', balance = ', this.balance, ', balance = ', this.balance
, ', fakeCurrency = ', fakeCurrency, ', moneyForTrade = ', this.moneyForTrade, ', gInitialMoney = ', gInitialMoney);
return;
}
코드는 복잡해보이지만 Account1.GetBalanceETCinfo(20) 값이 가끔 0 으로 나오는 오류가 난다는 내용입니다.
찍히는 로그는 캡쳐해두었습니다.
평상시 잘 읽히다가 가끔 불특정 상황에서 일어나는 일이라서 스팟 적용에 당황스런 상황이 발생합니다.
추가)
this.balance = Account1.GetTotalAmount(1, 2);
이 값도 잘 안들어올 때가 있습니다.
예를 들어 매수체결 후 6초가 지난 후 읽었는데도 balance 값이 0으로 찍혔습니다.
2016-12-29
1811
글번호 224077
답변완료
부탁드립니다.
1.아래 수식에서는 현재 1계약의 포지션이 있는경우 반대포지션으로의 1계약 진입을 위하여는,
청산과 진입을 위하여 2계약 (VV = 2;) 이 동시에 주문체결하게 됩니다.
이를 5초간의 시간차를 두고 1계약씩 주문체결 되도록 수식을 변경 하여 주시면 감사 하겠습니다.
2. 매수 미완성신호발생을 IncompleteSignal.signalKind == 1 로
매도 미완성신호발생을 IncompleteSignal.signalKind == 3 으로 하면
미완성신호가 없는 경우의 표기는 IncompleteSignal.signalKind == 0 으로 하면 되나요?
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 ((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,10000);
}
if ( A1.Balance.position == 1 && IncompleteSignal.signalKind == 3)
{
T = 0;
Main.KillTimer(1);
Main.SetTimer(2,10000);
}
if ((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,10000);
}
if (A1.Balance.position == 2 && IncompleteSignal.signalKind == 1)
{
T = 0;
Main.KillTimer(2);
Main.SetTimer(1,10000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1 && T == 1)
{
Main.KillTimer(1);
A1.OrderBuy(KP.code, VV, KP.Ask(5),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(5),2);
Main.MessageLog("매도진입");
}
if (nEventID == 2 && T == 0)
{
Main.KillTimer(2);
Main.MessageLog("중복매도진입금지");
}
}
2016-12-23
1993
글번호 224072
답변완료
스팟에 있었으면 하는 메소드
먼저 성심성의껏 알려주신 점에 깊이 감사드립니다.
전화상 말씀드린 스팟에 있었으면 하는 메소드를 정리해보았습니다.
귀찮다 생각지마시고 귀사의 프로그램에 대해 애정이 있고 지속적으로 사용하기를 원하기에 이런 글을 올린다는 것으로 이해해주셨으면 합니다.
1. 관심종목
Refresh(그룹명) - 관심종목의 해당그룹명을 재갱신 (현재 종목이 추가되면 조회버튼으로 일일이 누르고 있음)
Sort() - 이름순, 등락순, 거래량순 등으로 소팅
DeleteItem(그룹명, 종목명) - 해당 그룹의 종목삭제
DeleteGroup(그룹명) - 해당 그룹삭제
CreateGroup(그룹명) - 해당 그룹생성
2. 확장차트객체
DeleteChartEx(차트번호 or 종목명) - 확장차트제거
진입된 종목이 청산되면 더 이상 차트가 필요없을 수도 있기에....
ArrageChartEx(방식) - 만약 차트가 10개생성되면 쭈욱 나열이 되는데, 바둑판식 배열 등으로 정렬될 수 있도록 하는 기능
3. 엑셀객체
CreateSheet(생성시트번호, 시트이름) - 시트생성
DeleteSheet(시트번호) - 해당시트 제거
그외 좀 개선되었으면 하는 기능.
1. YS특징상 리얼타임에서 코딩 -> 검증 -> 디버깅하는 과정을 반복적으로 거치는데
6131화면에서 디버깅후 기존 올려진 전략을 X로 내리고, 다시 적용하고, 시험적용 or 자동주문 선택후 확인 누르는 작업을 수없이 하게 됩니다. 안정화되기까지 수도 없이 할 것입니다. 이를 좀 간단히 할 수 있게 개선이 꼭 되었으면 합니다. 가령 적용된 전략의 X 옆에 변경된 소스를 Reload 하는 버튼을 만들어서 바로 적용가능하게 하여 전략을 내리고 올리고 하는 반복적인 시간낭비를 없애면 어떨까합니다....
2. YS 스튜디오에서 옵션창이 있어서 편집창 글꼴 변경, 글꼴 크기 조절등이 되었으면 하네요.
UHD 모니터를 사용하다보니 글자크기가 너무 작아서..
3. YS를 처음 접하는 유저나 어떤 전략을 기술하기 위해 이곳을 찾는 유저들을 위해 이 게시판의 상단에 자주 쓰이는 코드의 프레임워크를 만들어 놓으면 어떨까요? 가령, 주식매매하는 사람들을 위해 종목 검색부터 확장차트 띄우고 주문내는 대략적인 코드...선물옵션하는 사람들도 마찬가지고... 모범 답안은 아니더라도 프로그램의 전체 흐름을 파악할 수 있는 PSEUDO 코드라든지...암튼 자주 질문하는 내용을 상단에 표기하는것이 목적입니다. 여기 게시판의 담당자도 많은 질문에 대한 답변으로 에너지를 줄여 다른 곳에 포커싱할 수 있다고 보여집니다.
여러가지 올렸는데 귀사의 적극적 검토를 부탁드립니다.
감사합니다.
2016-12-19
2065
글번호 224071