첨부 이미지
그림1
그림2
수고하십니다.
na1 수식에 종목코드를 확인하라는 에러가 뜹니다.
첨부된 편집기화면에서와 같이
종목객체명을 MD7로 지정하고 종목은 E-Micro EUK/USD로 입력하였습니다.
계좌객체도 620으로 입력하였고 자동매매화면과 동일하게 620으로 표시됩니다.
종목객체도 C7로 지정하고 차트명을 s2로 지정하고, 챠트에도 s2로 표시하였고
보조지표 진입1도 챠트에 설정하였습니다.
Main.MessageList로는 보조지표 진입1값과 현재가격 및 손익이 정확하게 표시가
됩니다.
그러나 자동매매를 실행시키면
종목코드를 확인하라는 에러메세지가 뜹니다.
검토 부탁드립니다.
수식은 다음과 같습니다.
// 전역변수선언
var exit3;
var Position7;
var Snum7;
var Bnum7;
var BuyFill7;
var SellFill7;
var ID7,ID8,Num7,Num8;
var Xcode7,Xpst7,Xvo7,XID7;
var Xcode8,Xpst8,Xvo8,XID8;
//스팟 시작
function Main_OnStart()
{
Main.SetTimer(1, 10000);
exit3 = false;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if (exit3 == false)
{
Account7.SetBalanceItem(MD7.code, 0);
var vo7 = Account7.Balance.count; //수량
var po7 = Account7.Balance.position; //포지션방향(매도1, 매수2)
var Cu7 = Account7.Balance.current; //현재가
var PL7 = Account7.Balance.profit;
var woo = C7.GetIndicatorData("진입1", 1, 0);
Main.MessageList("진입1=",woo,"현재가=",Cu7,"손익=",PL7);
//Main.MessageList("na2=",Account7);
}
}
if ( po7 == 1 && Cu7 >=woo) //매도포지션이고 현재가격이 지표 "진입" 값과 크거나 같으면
{
exit3 = true; //첫번째 SetTimer 시작
//전량 시장가로 매수주문(청산) 및 ID7에 주문아이디 저장
ID7 = Account7.OrderBuy(MD7,vo7, 0, 1);
}
if (po7 == 2 && Cu7 <= woo) //매수포지션이고 현재가격이 지표"진입" 값과 같거나 작으면
{
//전량 시장가로 매도주문(청산) 및 ID7에 주문아이디 저장
ID7 = Account7.OrderSell(MD7,vo7, 0, 1);
}
//2번 타이머
if (nEventID == 2) //두번째 SetTimer 시작
{
Main.KillTimer(2);
//Num7주문번호의 미체결 객체 셋팅
Account7.SetUnfillOrderNumber(Num7);
//미체결 수량이 있으면
if (Account7.Unfill.count > 0)
{
Xcode7 = Account7.Unfill.code; //종목코드 저장
Xpst7 = Account7.Unfill.orderKind; //주문구분 저장
Xvo7 = Account7.Unfill.count; //주문수량 저장
XID7 = Account7.OrderCancel(Num7); //취소주문, 주문아이디 XID7 저장
}
}
//3번 타이머
if (nEventID == 3)
{
Main.KillTimer(3);
//Num8주문번호 미체결 객체 셋팅
Account7.SetUnfillOrderNumber(Num8);
if (Account7.Unfill.count > 0)
{
Xcode8 = Account7.Unfill.code;
Xpst8 = Account7.Unfill.orderKind;
Xvo8 = Account7.Unfill.count;
XID8 = Account7.OrderCancel(Num8);
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문응답 아이디(orderID)가 ID7(최초주문아이디)과 같으면
if (OrderResponse.orderID == ID7)
{
//주문번호 저장
Num7 = OrderResponse.orderNum;
Main.SetTimer(2, 5000);
}
//주문응답 아이디가 ID8과 같으면
if (OrderResponse.orderID == ID8)
{
Num8 = OrderResponse.orderNum;
Main.SetTimer(3, 5000);
}
//재주문
//주문응답 아이디가 XID7과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID7)
{
if (Xpst7== 1)
{
Account7.OrderSell(Xcod7, Xvo7, 0, 1);
}
if (Xpst7== 2)
{
Account7.OrderBuy(Xcod7, Xvo7, 0, 1);
}
}
//주문응답 아이디가 XID8과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID8)
{
if (Xpst8 == 1)
{
Account7.OrderSell(Xcod8, Xvo8, 0, 1);
}
if (Xpst8 == 2)
{
Account7.OrderBuy(Xcod8, Xvo8, 0, 1);
}
}
}
}
바쁘신데 감사합니다.
답변 2
예스스탁
예스스탁 답변
2023-10-26 10:40:44
안녕하세요
예스스탁입니다.
MD7은 종목객체입니다.
객체는 여러가지 값이 있는 집합체입니다.
종목객체 안에는 종목코드나 현재가등 여러가지 값을 리턴하는
프로퍼티가 별도로 있습니다.
MD7종목객체의 종목코드는 MD7.code로 지정하셔야 합니다.
즐거운 하루되세요
> 멋진감자 님이 쓴 글입니다.
> 제목 : 수식에러 검토 부탁드립니다.
> 수고하십니다.
na1 수식에 종목코드를 확인하라는 에러가 뜹니다.
첨부된 편집기화면에서와 같이
종목객체명을 MD7로 지정하고 종목은 E-Micro EUK/USD로 입력하였습니다.
계좌객체도 620으로 입력하였고 자동매매화면과 동일하게 620으로 표시됩니다.
종목객체도 C7로 지정하고 차트명을 s2로 지정하고, 챠트에도 s2로 표시하였고
보조지표 진입1도 챠트에 설정하였습니다.
Main.MessageList로는 보조지표 진입1값과 현재가격 및 손익이 정확하게 표시가
됩니다.
그러나 자동매매를 실행시키면
종목코드를 확인하라는 에러메세지가 뜹니다.
검토 부탁드립니다.
수식은 다음과 같습니다.
// 전역변수선언
var exit3;
var Position7;
var Snum7;
var Bnum7;
var BuyFill7;
var SellFill7;
var ID7,ID8,Num7,Num8;
var Xcode7,Xpst7,Xvo7,XID7;
var Xcode8,Xpst8,Xvo8,XID8;
//스팟 시작
function Main_OnStart()
{
Main.SetTimer(1, 10000);
exit3 = false;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if (exit3 == false)
{
Account7.SetBalanceItem(MD7.code, 0);
var vo7 = Account7.Balance.count; //수량
var po7 = Account7.Balance.position; //포지션방향(매도1, 매수2)
var Cu7 = Account7.Balance.current; //현재가
var PL7 = Account7.Balance.profit;
var woo = C7.GetIndicatorData("진입1", 1, 0);
Main.MessageList("진입1=",woo,"현재가=",Cu7,"손익=",PL7);
//Main.MessageList("na2=",Account7);
}
}
if ( po7 == 1 && Cu7 >=woo) //매도포지션이고 현재가격이 지표 "진입" 값과 크거나 같으면
{
exit3 = true; //첫번째 SetTimer 시작
//전량 시장가로 매수주문(청산) 및 ID7에 주문아이디 저장
ID7 = Account7.OrderBuy(MD7,vo7, 0, 1);
}
if (po7 == 2 && Cu7 <= woo) //매수포지션이고 현재가격이 지표"진입" 값과 같거나 작으면
{
//전량 시장가로 매도주문(청산) 및 ID7에 주문아이디 저장
ID7 = Account7.OrderSell(MD7,vo7, 0, 1);
}
//2번 타이머
if (nEventID == 2) //두번째 SetTimer 시작
{
Main.KillTimer(2);
//Num7주문번호의 미체결 객체 셋팅
Account7.SetUnfillOrderNumber(Num7);
//미체결 수량이 있으면
if (Account7.Unfill.count > 0)
{
Xcode7 = Account7.Unfill.code; //종목코드 저장
Xpst7 = Account7.Unfill.orderKind; //주문구분 저장
Xvo7 = Account7.Unfill.count; //주문수량 저장
XID7 = Account7.OrderCancel(Num7); //취소주문, 주문아이디 XID7 저장
}
}
//3번 타이머
if (nEventID == 3)
{
Main.KillTimer(3);
//Num8주문번호 미체결 객체 셋팅
Account7.SetUnfillOrderNumber(Num8);
if (Account7.Unfill.count > 0)
{
Xcode8 = Account7.Unfill.code;
Xpst8 = Account7.Unfill.orderKind;
Xvo8 = Account7.Unfill.count;
XID8 = Account7.OrderCancel(Num8);
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문응답 아이디(orderID)가 ID7(최초주문아이디)과 같으면
if (OrderResponse.orderID == ID7)
{
//주문번호 저장
Num7 = OrderResponse.orderNum;
Main.SetTimer(2, 5000);
}
//주문응답 아이디가 ID8과 같으면
if (OrderResponse.orderID == ID8)
{
Num8 = OrderResponse.orderNum;
Main.SetTimer(3, 5000);
}
//재주문
//주문응답 아이디가 XID7과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID7)
{
if (Xpst7== 1)
{
Account7.OrderSell(Xcod7, Xvo7, 0, 1);
}
if (Xpst7== 2)
{
Account7.OrderBuy(Xcod7, Xvo7, 0, 1);
}
}
//주문응답 아이디가 XID8과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID8)
{
if (Xpst8 == 1)
{
Account7.OrderSell(Xcod8, Xvo8, 0, 1);
}
if (Xpst8 == 2)
{
Account7.OrderBuy(Xcod8, Xvo8, 0, 1);
}
}
}
}
바쁘신데 감사합니다.