선물신호연계(옵션 매수. 옵션 매도)식입니다만,
가격설정을 1.0~2.0 사이로 했더니 가끔 두 종목이 겹치네요.
* 수정 문의 부탁드릴 것은,
그런 오류 없게끔 이식을 (2.0)에 제일 가까운 종목 한 개종목만 매매하도록
수정 부탁드립니다
(매수. 매도식 두개다 수정 부탁드립니다)
* 추가로 질문인데,
1. 이렇게 가격이 겹칠 때 두 종목중 한 종목만 체결되는 것인지요?
2. 또 손절식이setstop이나 setstopprofit같은 함수식 조건이라도 오류없이
청산이 되는지요?
감사합니다
1. 옵션매수
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
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);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && 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;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitlong신호 발생시
if (Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitshort신호 발생시
if ( Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}
2. 옵션매도
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
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);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && 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;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitlong신호 발생시
if ( Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitshort신호 발생시
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}
답변 1
예스스탁
예스스탁 답변
2013-05-02 21:03:11
안녕하세요
예스스탁입니다.
1,
해당식 매수나 매도신호가 발생할때
2.0에 가장 가까운 종목으로 하나의 종목만 주문이 됩니다.
내일 편하신 시간에 전화주시기 바랍니다.
02-3453-1060
2.
차트에서 강제청산신호가 발생하면
매수포지션에 대한 강제청산이면 signalKind가 2으로
매도포지션에 대한 강제청산이면 signalKind가 4로 수신됩니다.
오류없이 청산됩니다.
즐거운 하루되세요
> 털보 님이 쓴 글입니다.
> 제목 : 수정 문의
> 선물신호연계(옵션 매수. 옵션 매도)식입니다만,
가격설정을 1.0~2.0 사이로 했더니 가끔 두 종목이 겹치네요.
* 수정 문의 부탁드릴 것은,
그런 오류 없게끔 이식을 (2.0)에 제일 가까운 종목 한 개종목만 매매하도록
수정 부탁드립니다
(매수. 매도식 두개다 수정 부탁드립니다)
* 추가로 질문인데,
1. 이렇게 가격이 겹칠 때 두 종목중 한 종목만 체결되는 것인지요?
2. 또 손절식이setstop이나 setstopprofit같은 함수식 조건이라도 오류없이
청산이 되는지요?
감사합니다
1. 옵션매수
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
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);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && 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;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitlong신호 발생시
if (Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitshort신호 발생시
if ( Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}
2. 옵션매도
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
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);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && 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;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitlong신호 발생시
if ( Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitshort신호 발생시
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}