답변완료
수정부탁드려요
밑의 수식에서 재진입을 안하고 싶은데 부탁드려요
//스팟 첫 실행시
function Main_OnStart()
{
//1번 타이머, 60초
Main.SetTimer(1, 2000);
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//종목검색 수행
Main.ReqPowerSearch("3")
}
}
//종목검색 완료
function Main_OnRcvItemList(aItemList, nCount)
{
//1종목 이상 검색되면
if (nCount >= 1)
{
//리스트 첫종목부터 마지막종목까지 순차적으로
//1번 타이머 동작
for (var i = 0; i < nCount; i++)
{
//잔고를 셋팅
Account1.SetBalance(aItemList[i],0);
//보유수량이 없으면
if (Account1.Balance.count < 1)
{
//매수주문
Account1.OrderBuy(aItemList[i], 3,0,1);
}
}
}
}
답변완료
OnOrderReponse에서 OrderNum 값이 return되지 않습니다.
안녕하세요.
오랜만에 인사드립니다. 환절기 건강 유의하시기바랍니다.
다름아아니라 OnOrderResponse 기능에서 OrderNum의 값이 Return되지 않아 혹시 시스템상 어떤 특정 조건이 만족되어야 해당 값이 나오는 것인지 문의드리고자 합니다.
아래와 같은 코드로 주문시 응답 메세지를 보면 OnOrderResponse에서 OrderID값은 보이는데, OrderNum 값은 아무값도 Return되지 않습니다.
(MessageList 표시 예: 체결정보 1
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == ID)
{
Number = OrderResponse.orderNum;
Main.MessageList("체결정보", OrderResponse.orderID, OrderResponse.orderNum);
var RowN = 0;
RowN = Excel1.GetRowCount(2);
//엑셀에 매수주문 정보 기록: 일자,시간, 종목명, 종목코드, 매매종류, 가격, 수량, 금액
Excel1.SetArrayToRow(2, 'K'+RowN, [Number]);
}
}
제 시스템의 현재 흐름은 아래와 같습니다. 혹시 아래 흐름에서 OrderNum를 Return 받는데 문제가 되는 부분이 있을까요?
1. function Main_OnRiseSignal(ChartEx, Signal) 를 통해 Account1.OrderBuy를 사용하여 매수/매도 주문
ID = Account1.OrderBuy(Main.GetOrderCode(Signal.code),SplitCount,BuyPrice,0);
2. 위 function Main_OnOrderResponse(OrderResponse) 를 통해 동일한 ID의 값을 Return 받아 엑셀에 저장함
여기서 MessageList에서 OrderID만 표시됨
3. function Main_OnNotifyFill(NotifyFill) 를 통해 체결정보 저장
궁극적으로 주문정보와 체결정보를 OrderNum를 통해 데이터를 연결하고자 함.
아무리 가이드라인을 보고 관련 질의응답을 봐도 관련 내용이 없어서 격무로 바쁘시겠지만 도움을 주시면 정말 감사하겠습니다.
답변완료
풋스프레드 매수
아래식은 하방 Put 스프레드 수식입니다
차트1에서 매도 신호가 나오면 1.00 과 가장 가까운 Put 옵션을 매수하고
동시에 바로 아래 외가격(Put종목-1)은 매도합니다.
과거 게시글의 상방 콜 스프레드 수식을 참조하여 작성하여 보았습니다.
진입은 되는데 청산이 안됩니다.
수식이 맞는지 살펴주시기 바랍니다.
************************************************************************
var S1= 0,S2 = 0,PutCode1,PutCode2;
var RemainDays,entry;
function Main_OnStart()
{
Main.MessageList("Start");
RemainDays = Option1.GetRemainDays(0,0);
entry = true;
if (RemainDays == 1)
{
Main.SetTimer(1, 1000);
}
}
function Chart1_OnRiseSignal(Signal)
{
S2 = S1;
S1 = Signal.signalKind;
if (S1 == 3 && entry == true)
{
if (S2 != 3)
{
var HNum = Option1.uppersATM;
var LNum = Option1.lowersATM;
var CP = [];
var PD1 = [];
var PD2 = [];
for (var i = -LNum; i <= HNum; i++)
{
CP[i+LNum] = Math.abs(Option1.GetCurrent(0, i)-1);
PD1[i+LNum] = Option1.GetATMPutRecent(i);
PD2[i+LNum] = Option1.GetATMPutRecent(i+1);
}
var MinV = CP[0];
PutCode1 = PD1[0];
PutCode2 = PD2[0];
for (var i = 0; i < CP.length; i++)
{
if (CP[i] < MinV)
{
MinV = CP[i];
PutCode1 = PD1[i];
PutCode2 = PD2[i];
}
}
Account1.OrderBuy(PutCode1, 1, Option1.GetAskByCode(PutCode1, 5), 0);
Account1.OrderSell(PutCode2, 1, Option1.GetBidByCode(PutCode2, 5), 0);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var d = new Date();
var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (T1 >= 150000)
{
Main.KillTimer(1);
entry = false;
Account1.SetBalance(PutCode1);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol1 = Account1.Balance.count;
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(PutCode2);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
var vol2 = Account1.Balance.count;
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}