답변완료
수식 수정 부탁드립니다.(에러)
잘 작동을 하다가 아래와 같은 에러메시지가 뜨면서 작동을 멈춥니다.
특히, 신규종목이 추가될때 에러가 발생하는듯 합니다.
78번줄 'TypeError : Cannot read property 'code' of undefined'
문제점과 해결책을 알려주시면 감사하겠습니다.
================================================================
var Nth = 0;
var ItemCode = new Array(200);
var ItemObject = new Array(200);
var ItemHigh = new Array(200);
var Bnum;
function Main_OnStart()
{
Nth = 0;
Bnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Bnum);
if (Bnum > 0)
{
//계좌의 잔고리스트에서 첫번째 잔고 셋팅
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
//요청한 종목객체 수신되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == ItemCode[Nth])
{
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code);
//순번은 1 증가
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Bnum > 0)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
}
//잔고에 종목이 추가된다면
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제
{
if (sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제
{
Nth = Nth+1;
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
//종목객체 시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)// *제거
{
//편입된 종목수 만킄만 수행
for (var i = 0; i < Nth; i++)
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)// *제거
{
Main.MessageList("-----------------------------------------------");
Main.MessageList(ItemObject[i].code,"업데이트");
//잔고셋팅
Account1.SetBalanceItem(ItemObject[i].code,0);
//종목편입 이후의 최고가 계산
if (ItemObject[i].current > ItemHigh[i])
{
ItemHigh[i] = ItemObject[i].current;
}
//매수잔고
if (Account1.Balance.position == 2)
{
//현재가가 평균단가 대비 10%이상 상승하면 목표이익 매도
if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제");
}
// 현재가가 평균단가 대비 3%이상 하락하면 손절매도
if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.97)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제");
}
//현재가가 평균단가 대비 7% 이상 상승후 평균단가+5%까지 하락하면 매도주문
if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.07 &&
ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제");
}
}
Main.MessageList("-----------------------------------------------");
Main.MessageList("종 목 : ",ItemObject[i].code);
Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost);
Main.MessageList("현 재 가 : ",ItemObject[i].current);
Main.MessageList("진입최고 : ",ItemHigh[i]);
}
}
}
2019-06-27
3615
글번호 224903
답변완료
모의 거래 옵션 잔고리스트 개수 문의
안녕하십니까? 수고하십니다. 문의드리고자 하는 바는 아래와 같습니다.
옵션 모의거래 테스트를 하면서 GetTheNumberofBalances를 이용하여 잔고리스트의 개수를
불러오고자 했습니다. 하지만 분명 계좌 잔고에는 옵션 종목이 4개가 있는데
위 함수를 이용하여 잔고리스트 수를 불러오면 10개로 나옵니다.
잔고에 있는 옵션을 청산하고 1개만 남겨도 잔고리스트의 수는 10개로 나옵니다.
해당 부분내용은 아래와 같습니다.
참고로 모의계좌번호 일치 확인했습니다.
그리고 추가적인 문의사항은 지금은 6월인데 아래 date결과가 5월로 나옵니다.
분명 컴퓨터에 뜨는 날은 오늘로 뜨는데 말이죠 이부분도 함께 문의드립니다.
감사합니다.
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
var Month = d.getMonth();
var SCallCode, BCallCode;
var SPutCode, BPutCode;
var IDPB, IDPS, IDCS, IDCB;
var NumPB, NumPS, NumCS, NumCB;
var entryBPutCode, entrySPutCode, entrySCallCode, entryBCallCode;
var amount = 20;//매매수량
function Main_OnStart()
{
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"--시작--");
var num = A.GetTheNumberOfBalances();
if (HHMMSS >= 90100 && HHMMSS <= 155000 && PstEntry == 0)
{
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"num",num);
for (var i = 0; i < num; i++)
{
A.SetBalance(i);
if (A.Balance.position == 1)
{
if (O.GetDelta(A.Balance.code) < 0)
{
SCallCode = A.Balance.code;
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"SCallCode",A.Balance.code,O.GetDelta(A.Balance.code));
}
else
{
SPutCode = A.Balance.code;
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"SPutCode",A.Balance.code,O.GetDelta(A.Balance.code));
}
}
else
{
if (O.GetDelta(A.Balance.code) < 0)
{
BPutCode = A.Balance.code;
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"BPutCode",A.Balance.code,O.GetDelta(A.Balance.code));
}
else
{
BCallCode = A.Balance.code;
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"BCallCode",A.Balance.code,O.GetDelta(A.Balance.code));
}
}
}
Main.SetTimer(1, 5000);
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"--잔고 내 옵션보유 확인 후 5초 타이머셋--");
}
if (HHMMSS >= 90100 && HHMMSS <= 153500 && PstEntry == 1)
{
Main.SetTimer(2, 5000);
Main.MessageList(getYYYYMMDD(),getHHMMSSS(),"--포지션 진입 준비--");
Main.SetTimer(3, 30000);
}
}
2019-06-17
3248
글번호 224902
답변완료
Orderbuy에 대해 설명 부탁드립니다.
Account1.OrderBuy(“005930”,10,0,1)
예스스탁을 설명한 파일에 위와 같은 예시가 있었습니다.
종목코드가 005930인 삼성전자 10주를 시장가로 사라는 명령어로 알고 있습니다.
1) 현재가로 살 때 3번째칸(dPrice)을 0으로 지정해도 현재가로 주문이 나가는지입니다.
Account1.OrderBuy(“005930”,10,0,0)
위와 같이 주문하면 삼성전자 10주를 0원에 지정가 매수로 나가는지
아니면 매수 당시 현재가로 지정가 매수가 나가는지 궁급합니다.
2) 제가 하고 싶은것은 최우선지정가로 주문하는 것인데,
Account1.OrderBuy(“005930”,10,0,10)
dPrice칸은 0으로 둔채 위와 같이 입력하면
삼성전자 10주를 최우선지정가로 사라는 명령이 나가는지 궁금합니다.
모의매매에는 다 0원으로 주문이 나가는 것 같아서 질문드립니다.
2019-06-12
3136
글번호 224898
답변완료
수식 작성 부탁드립니다.
안녕하세요
많은 도움에 항상 감사드립니다.
아래 예시의 스팟 수식을 부탁드립니다.
1. 아래의 스팟 샘플은 매수 포지션 일때, 익절과 손절 설정입니다.
아래의 조건문에 추가하거나 아니면 새롭게 트레일링 조건을 하나 더 추가하고 싶습니다.
( 예시 : 수익 최고치가 진입가의 + 25틱 이되면 트레일링 발동하여 (최고치에서) -5틱 아래로 내려오면 전량 청산.
예로는 +25틱에서 -5틱 이상 떨어지지 않으면 계속 증가하여 최종 +50틱에서 전량 청산한다.)
// ----------------------------------------------------------
//잔고가 매수포지션이고 매수잔고 수량이 있을떄
if (Account1.Balance.position == 2 )
{
//현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가)
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
}
}
// ----------------------------------------------------------
2. 스팟에서 매매시간 설정이 가능하다면, 스팟에서 아래와 같이 설정하고 싶습니다.
(1) 거래시간 #1 : 당일 오전 10시 ~ 저녁 9시
#2 : 당일 저녁 11시 ~ 저녁 12시
#3 : 다음날 오전 00시 ~ 오전 4시
( 오전 10시~ 다음날 오전4시 (당일 저녁 9시~11시 제외) )
3. 손절 익절 초기 설정은 손절(25틱)/익절(25틱) 입니다.
(1) 진입후에 30분이 지나도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 30분이 지나도 청산이 되지 않으면 현재가에 청산한다.
(2) 진입후에 20봉이 경과해도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 또 20봉이 경과해도 청산이 되지 않으면 현재가에 청산한다.
감사합니다.
2019-06-19
3256
글번호 224896
답변완료
수식작성 문의드립니다.
수고많으세요. 궁금한게 있어 질문드립니다.
먼저 수식을 적용하고, 매매를 해보고,
매매를 한 상태에서 수식을 적용해보았습니다.
청산이 되지 않는 경우가 있는데 왜 그런지 궁금합니다.
(수식)
var tEnable = true, BID,SID,Bnum,Snum;
function Main_OnStart()
{
Main.MessageLog("청산식 시작");
}
function Main_OnU*dateMarket(sItemCode, lU*dateID)
{
if (sItemCode == M1.code && lU*dateID == 20001 && tEnable == true) {
A1.SetBalanceItem(M1.code,0);
if (A1.Balance.profit > tProfit || A1.Balance.profit < tLoss) {
if (A1.Balance.position == 1 && tEnable == true) {
BID = A1.OrderBuy(A1.Balance.code, A1.Balance.count, 0, 1);
tEnable = false;
}
else if (A1.Balance.postion == 2 && tEnable == true) {
SID = A1.OrderSell(A1.Balance.code, A1.Balance.count, 0, 1);
tEnable = false;
}
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BID)
Bnum = OrderResponse.orderNum;
else if(OrderResponse.orderID == SID)
Snum = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == Bnum) {
Main.MessageList("매도청산");
tEnable = true;
}
else if (NotifyFill.orderNum == Snum) {
Main.MessageList("매수청산");
tEnable = true;
}
}
2019-06-07
3272
글번호 224895