예를 들어 선물 신호기준 콜옵션 1.0에 가장 가까운 종목을 매수했을때. 가격이 올라 만약 2.5 가 되었을때 청산 신호가 뜬다면 예스스탁님이 올려주신 아래식을 적용한다면 매수는 a라는 종목에 나가고 청산은 b라는 종목에 나갈꺼 같습니다... 맞는지요..
그래서 아래처럼.OnNotifyFill 을 사용해서 체결유무를 확인하고 체결되었다면 checkbuycallcode 변수에 CallOrderCode 를 넣은후...청산 신호가 발생시 ...
Main.OrderSell(a1.number, CallOrderCode, 1, Option.GetAskByCode(checkbuycallcode, 2), 0);
이렇게 청산되게 했습니다... 근데 메시지 로그에 checkbuycallcode 값이 안나오네요
수정 및 설명부탁드립니다.
var CPrice = new Array(101);
var CCode = new Array(101);
var PPrice = new Array(101);
var PCode = new Array(101);
var MaxCall;
var MaxCallCode;
var MaxPut;
var MaxPutCode;
var checkbuycallcode;
function c1_OnRiseSignal(Signal)
{
//ATM 위 행사가 갯수
UNum = Option.uppersATM;
//ATM 위 행사가 갯수
LNum = Option.lowersATM;
//배열변수 준비(가격, 종목코드)
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
//3.0이하의 가격을 가지는 콜종목은 해당 값과 종목코드 저장
//3.0을 초과하는 콜종목은 가격과 종목코드를 모두 -1 처리
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= money)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]);
}
//3.0이하의 가격을 가지는 풋종목은 해당 값과 종목코드 저장
//3.0을 초과하는 풋종목은 가격과 종목코드를 모두 -1 처리
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
// Main.MessageLog(ii+"풋종목코드:"+PutCode[ii+UNum]+"/가격:"+PutPrice[ii+UNum]);
}
//각 배열에 저장된 값중 가장 큰 값을 찾음
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
// Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP);
if (Signal.signalKind == 1)// ----------->A 여기서부터 수정했습니다.
{
Main.OrderBuy(a1.number, CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0);
}
if (Signal.signalKind == 2)
{
Main.OrderSell(a1.number, CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 2), 0);
}
}
//그래서 A 에서 아래와 같이 수정했지만 메시지로그 에서는값이 나오지 않네요.
if (Signal.signalKind == 1)// -------> 이렇게요.
{
Main.OrderBuy(a1.number, CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0);
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill == 2)
{
checkbuycallcode = CallOrderCode;
}
}
}
Main.MessageLog("call주문종목코드:"+checkbuycallcode);
if (Signal.signalKind == 2)
{
Main.OrderSell(a1.number, checkbuycallcode, 1, Option.GetAskByCode(checkbuycallcode, 2), 0);
답변 1
예스스탁
예스스탁 답변
2013-01-08 19:06:49
안녕하세요
예스스탁입니다.
체결을 확인하시려면 아래와 같은 순서로 코딩을 해 가셔야 합니다.
1. 주문할때 주문아이디 저장하고
2. 주문응답 수신되면 주문시 저장한 주문아이디와 주문응답의 주문아이디가 같은것을 확인
3. 확인되었으면 주문번호 저장
4. 체결응답 수신시에 3번에서 저장된 주문번호와 같은 번호인지 확인
5. 종목코드 저장
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
var CallOrderID;
var CallOrderNum;
var CallOrderFill;
var checkbuycallcode;
//차트에서 신호가 발생하면
function c1_OnRiseSignal(Signal)
{
//1.0이하 중 가장 큰 가격을 가지는 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= money)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]);
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
//매수신호가 발생하면
if (Signal.signalKind == 1)
{
//매수주문후에 주문아이디를 CallOrderID에 저장
CallOrderID = Main.OrderBuy(a1.number, CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0);
//체결여부를 확인하는 변수는 0
CallOrderFill = 0;
}
//매수청산신호가 발생하고 CallOrderFill 변수에 값이 1일때
if (Signal.signalKind == 2 && CallOrderFill == 1)
{
Main.OrderSell(a1.number, checkbuycallcode, 1, Option.GetBidByCode(checkbuycallcode, 2), 0);
}
}
//주문응답이 발생하면
function Main_OnOrderResponse(OrderResponse)
{
//해당 주문응답의 주문아이디가 CallOrderID와 같은지 확인하고 같으면
//주문번호를 저장
if (CallOrderID == OrderResponse.orderID)
CallOrderNum = OrderResponse.orderNum;
}
//체결응답이 수신되면
function Main_OnNotifyFill(NotifyFill)
{
//체결응답의 주문번호가 주문응답시 저장한 주문번호와 같으면
//종목코드 저장
if (CallOrderNum == NotifyFill.orderNum)
{
checkbuycallcode = NotifyFill.code;
//체결여부를 확인하는 변수는 1
CallOrderFill = 1;
}
}
아래와 같이 1.0이하의 종목을 찾는 식을
매수신호 발생시로 한정하시면
모든 신호가 발생할때 1.0이하의 종목을 찾는 것은 아니므로
매수신호 발생시 찾은 종목((CallOrderCode)을 청산신호시에 그대로
사용하셔도 됩니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
//차트에서 신호가 발생하면
function c1_OnRiseSignal(Signal)
{
//해당 신호가 매수신호이면
if (Signal.signalKind == 1)
{
//1.0이하 중 가장 큰 가격을 가지는 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= money)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]);
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
//매수주문후에 주문아이디를 CallOrderID에 저장
Main.OrderBuy(a1.number, CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0);
}
if (Signal.signalKind == 2 && CallOrderFill == 1)
{
Main.OrderSell(a1.number, CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 2), 0);
}
}
※ 기존에 작성해서 올리신 내용에 자바스크립트 문법과 많이 다른 내용이 있습니다.
도움말이나 자바스크립트 서적을 통해 작성법이나
함수사용법등을 숙지하신 후에 식작성을 하시기 바랍니다.
즐거운 하루되세요