답변완료
스팟 수식 하나로 여러 종목 매매하는법 문의
안녕하세요. 이전에 손봐주신 아래 수식으로 거래를 잘하고 있습니다. 그런데 아래 수식의 경우 한번에 10개의 종목을 거래하려면 종목별로 차트 10개와 스팟수식 10개를 연결시켜 거래해야하므로 여간 번거로운게 아닙니다. 아래수식을 관심 그룹으로 지정된 다수의 종목에 한번에 적용하고 싶은데 어떻게 바꾸면 되는지요?
function Chart1_OnRiseSignal(Signal)
{
//buy신호발생
if (Signal.signalKind == 1)
{
//신호종목 잔고 셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//보유수량이 없으면
if (Account1.Balance.count == 0)
{
//10주 시장가로 매수
Account1.OrderBuy(Main.GetOrderCode(Signal.code), 10,MarketData1.current ,0)
}
//보유수량이 있다면
else if (Account1.Balance.count > 0)
{
//현재가가 평균단가 대비 10% 하락시 보유수량+10주 시장가로 매수
if (Account1.Balance.current < Account1.Balance.avgUnitCost*0.9)
{ Account1.OrderBuy(Main.GetOrderCode(Signal.code), Account1.Balance.count +10, MarketData1.current,0);
}
//현재가가 평균단가 대비 3% 이상 상승시 전량매도
if (Account1.Balance.current > Account1.Balance.avgUnitCost*1.03)
{ Account1.OrderSell(Main.GetOrderCode(Signal.code), Account1.Balance.count, Account1.Balance.current,0)
}
2017-01-05
1884
글번호 224085
답변완료
스팟수식문의
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
1892
글번호 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
1789
글번호 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
1983
글번호 224072