답변완료
문의
아래는 몇일전에 수정해주신 옵션매수식 인데요,
이것을 옵션매도로 바꾸고싶네요.
옵션가격 1.5 ~ 3 사이중 (2.3)에 가장 가까운 옵션매도로 수정 부탁드립니다.
감사합니다.
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] = Math.abs(Option.GetCurrent(0, i)-1.5);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && Option.GetCurrent(1, ii) >= 1.0)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-1.5);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
CC = 9999999;
CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC < 9999999)
{
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 = 9999999;
PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP < 9999999)
{
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);
}
}
}
2013-11-08
840
글번호 222705
답변완료
문의번호 759 관련입니다.
안녕하세요? 항상 수고 많으십니다.
저는 차트의 데이터를 GetIndicatorData(~~~)를 사용해서,완성신호가 아닌
지표검색으로 스팟수식을 작성하고 이를 수동매매하던 스캘핑에 적용하려고,
계속 시험적용으로 검토하고 있습니다.
저의 매매기준대로 지금의 스팟수식은 스캘핑을 위한 신속한 진입은 잘 이루어 지고 있어서,
감사드립니다.
하지만, 스캘핑의 속성상 STOP 매매를 해야 할 때가 허다합니다.
저의 매매기준이 잘 못 고안되어서 발생하는 청산손실은 제가 감수해야만 합니다만,
진입은 잘 이루어 지고 또한, 적절한 수익을 찍고도,
저항에 밀려서 손실로 청산되는 것을 방지하고 싶습니다.
그래서, 스탑(일정한 수익틱을 정해 놓고)을 적용하려고
귀사의 질의응답의 내용으로 시험적용해 봤습니다만,
원만한 결과물을 도출하지 못했습니다.
실 거래가 아닌 시험적용에서는
//계좌에 선물 종목이 편입될 때
function Main_OnUp*dateAccount(sAccntNum,sItemCode,IUp*dateID) 과
//선물종목 시세 업데이트가 되면 잔고 셋팅
function Main_OnUp*dateMarket(sItemCode,IUp*dateID) 이 작동하지 않는 건가요?
시험적용에서 작동하지 않는다면 검증해 보지 못 한 것을 실 거래에 적용할 수 없으니,
얼른 포기하려구요.
만일, 시험적용에서 검증할 방도가 있다면, 제가 만들어 놓은 수식으로 다시 질의드리려고
합니다.
감사합니다.
2013-11-08
785
글번호 222704
답변완료
문의 드립니다.
1. 아래는 게시판에 올라와 있는 스팟로직입니다. 선물신호로 옵션을 매매하는 로직으로 알고 있습니다. 아래 수식은 선물매수신호 발생하면 콜옵션등가 매수, 선물매도신호 발생하면 풋옵션등가매수식인데,,, 반대로 선물매수신호 발생하면 콜옵션등가 매도, 선물매도신호 발생하면 풋옵션등가 매도할 수 있도록 수정부탁드립니다.
2. 당일매매나 오버매매에 동일하게 진입/청산될 수 있도록 하고... 예스트레이더 선물신호와 동일한 진입계약수로 진입/청산될 수 있도록 부탁드립니다.
3. 예스스팟 처음사용자라서 그러는데 위의 로직을 가지고 실제 매매를 하기위한 객체추가등의 절차와 방법등을 알려주시면 감사하겠습니다.
안녕하세요
예스스탁입니다.
전화로 답변드린 부분에서 좀더 강화하여
스팟 적용시점에 UserValue의 BuyCall와 BuyPut에 종목코드가 저장되어 있고
해당 종목코드의 종목이 실제 잔고에도 있으면 적용시점 이후에
최초 신호가 청산일때도 신호가 발생하게 했습니다.
아래식으로 테스트 해 보시기 바랍니다.
var BStart = 0;
var SStart = 0;
var BuyCallCode;
var BuyPutCode;
var SellCallCode;
var SellPutCode;
function Main_OnStart()
{
Main.MessageList("시작");
var AA = Main.GetUserValue("BuyCall");
if (AA == "")
{
BStart = 0;
Main.MessageList("UserValue의 BuyCall - 저장된 종목코드 없음");
}
else
{
A1.SetBalanceItem(AA,0);
if (A1.Balance.count > 0)
{
BStart = 1;
BuyCallCode = AA;
Main.MessageList("UserValue의 BuyCall - : ",BuyCallCode);
}
}
var BB = Main.GetUserValue("BuyPut");
if (BB == "")
{
SStart = 0;
Main.MessageList("UserValue의 BuyPut - 저장된 종목코드 없음");
}
else
{
A1.SetBalanceItem(BB,0);
if (A1.Balance.count > 0)
{
SStart = 1;
BuyPutCode = BB;
Main.MessageList("UserValue의 BuyPut - : ",BuyPutCode,"계좌에도 해당 종목 있음");
}
}
Main.MessageList(BStart,SStart);
}
function C1_OnRiseSignal(Signal)
{
Kind = Signal.signalKind;
Main.MessageLog("신호완성/"+Kind);
//선물차트에서 매수신호발생하면 콜 매수
if (Signal.signalKind ==1)
{
BStart = 1;
BuyCallCode = Option.GetATMCallRecent(0);//ATM콜 종목코드
var BuyCallPrice = Option.GetBidByCode(BuyCallCode, 2);//ATM콜 매수2호가
A1.OrderBuy(BuyCallCode, vol, BuyCallPrice, 0);
Main.MessageLog("등가콜매수 : "+BuyCallCode);
//주문 후 내부파일에 콜종목코드를 BuyCall이름으로 저장
Main.SetUserValue("BuyCall",BuyCallCode);
}
//선물차트에서 매도신호발생하면 풋 매수
if (Signal.signalKind ==3)
{
SStart =1;
BuyPutCode = Option.GetATMPutRecent(0);//ATM풋 종목코드
var BuyPutPrice = Option.GetBidByCode(BuyPutCode, 2);//ATM풋 매수 2호가
A1.OrderBuy(BuyPutCode, vol, BuyPutPrice, 0);
Main.MessageLog("등가풋매수 : "+BuyPutCode);
//주문 후 내부파일에 풋종목코드를 BuyPut이름으로 저장
Main.SetUserValue("BuyPut",BuyCallCode);
}
if (BStart == 1 && Signal.signalKind == 2)//선물차트 매수 청산신호발생하면 콜 매수 청산
{
var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2);
A1.OrderSell(BuyCallCode, vol, BxCallPrice, 0);
Main.MessageLog("등가콜청산 : "+BuyCallCode);
// 매수청산 주문후 내부파일의 BuyCall의 값을 ""저장(공백)
Main.SetUserValue("BuyCall","");
}
if (SStart == 1 && Signal.signalKind == 4)//선물차트 매도 청산신호발생하면 풋 매수 청산
{
var BxPutPrice = Option.GetBidByCode(BuyPutCode, 2);
A1.OrderSell(BuyPutCode, vol, BxPutPrice, 0);
Main.MessageLog("등가풋청산 : "+BuyPutCode);
// 매수청산 주문후 내부파일의 BuyPut의 값을 ""저장(공백)
Main.SetUserValue("BuyPut","");
}
}
즐거운 하루되세요
> 몬자 님이 쓴 글입니다.
> 제목 : Re : Re : 스팟문의드립니다.
> 답변감사합니다.
매수주문 완료되고, 프로그램 재접속 후
시험적용으로 확인하는도중 주문가격과 종목코드에서 이상한 결과가 나옵니다.
위 그림과 같이 매수 주문가격 1.46
매도 주문가격 1.-2147483648
주문가격과 종목코드가 이상합니다. 어떻게 된 것인지 궁금합니다.
고민 중에 SetBalance 함수를 이용하면 될 것 같은데 많이 어렵습니다.
번거롭게 질문이 잦아 죄송합니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 스팟문의드립니다.
> 안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
SetUserValue함수와 GetUserValue 함수를 이용해 처리했습니다.
주석 참고하시기 바랍니다.
//아래 전략은 기존 수식입니다.
var BStart;
var SStart;
var BuyCallCode;
var BuyPutCode;
var SellCallCode;
var SellPutCode;
function Main_OnStart()
{
Main.MessageLog("시작");
SStart = 0;
//스팟 적용시에 BuyCall값을 불러와 공백이면 0 아니면 1
var AA = Main.GetUserValue("BuyCall");
if (AA == "")
BStart = 0;
else
BStart = 1;
//스팟 적용시에 BuyPut값을 불러와 공백이면 0 아니면 1
var BB = Main.GetUserValue("BuyPut");
if (BB == "")
SStart = 0;
else
SStart = 1;
}
function C1_OnRiseSignal(Signal)
{
Kind = Signal.signalKind;
Main.MessageLog("신호완성/"+Kind);
//선물차트에서 매수신호발생하면 콜 매수
if (Signal.signalKind ==1)
{
BStart = 1;
BuyCallCode = Option.GetATMCallRecent(0);//ATM콜 종목코드
var BuyCallPrice = Option.GetBidByCode(BuyCallCode, 2);//ATM콜 매수2호가
A1.OrderBuy(BuyCallCode, vol, BuyCallPrice, 0);
Main.MessageLog("등가콜매수 : "+BuyCallCode);
//주문 후 내부파일에 콜종목코드를 BuyCall이름으로 저장
Main.SetUserValue("BuyCall",BuyCallCode);
}
//선물차트에서 매도신호발생하면 풋 매수
if (Signal.signalKind ==3)
{
SStart =1;
BuyPutCode = Option.GetATMPutRecent(0);//ATM풋 종목코드
var BuyPutPrice = Option.GetBidByCode(BuyPutCode, 2);//ATM풋 매수 2호가
A1.OrderBuy(BuyPutCode, vol, BuyPutPrice, 0);
Main.MessageLog("등가풋매수 : "+BuyPutCode);
//주문 후 내부파일에 풋종목코드를 BuyPut이름으로 저장
Main.SetUserValue("BuyPut"",BuyCallCode);
}
if (BStart == 1 && Signal.signalKind == 2)//선물차트 매수 청산신호발생하면 콜 매수 청산
{
var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2);
A1.OrderSell(BuyCallCode, vol, BxCallPrice, 0);
Main.MessageLog("등가콜청산 : "+BuyCallCode);
// 매수청산 주문후 내부파일의 BuyCall의 값을 ""저장(공백)
Main.SetUserValue("BuyCall","");
}
if (SStart == 1 && Signal.signalKind == 4)//선물차트 매도 청산신호발생하면 풋 매수 청산
{
var BxPutPrice = Option.GetBidByCode(BuyPutCode, 2);
A1.OrderSell(BuyPutCode, vol, BxPutPrice, 0);
Main.MessageLog("등가풋청산 : "+BuyPutCode);
// 매수청산 주문후 내부파일의 BuyPut의 값을 ""저장(공백)
Main.SetUserValue("BuyPut","");
}
}
즐거운 하루되세요
> 몬자 님이 쓴 글입니다.
> 제목 : 스팟문의드립니다.
> 선물신호를 받아서 옵션 매수후 2~3 일간 포지션 홀딩시, 다음날(프로그램 재시작) 스팟전략이 디폴트되어
청산식이 제대로 되지 않습니다.
계좌함수를 통해 해결할 수 있다고 들었는데요,
계좌함수를 이용해 선물에서 청산신호 발생시 포지션을 청산하고 싶습니다.
부탁드립니다.
//아래 전략은 기존 수식입니다.
var BStart;
var SStart;
var BuyCallCode;
var BuyPutCode;
var SellCallCode;
var SellPutCode;
function Main_OnStart()
{
Main.MessageLog("시작");
BStart = 0;
SStart = 0;
}
function C1_OnRiseSignal(Signal)
{
Kind = Signal.signalKind;
Main.MessageLog("신호완성/"+Kind);
//선물차트에서 매수신호발생하면 콜 매수
if (Signal.signalKind ==1)
{
BStart = 1;
BuyCallCode = Option.GetATMCallRecent(0);//ATM콜 종목코드
var BuyCallPrice = Option.GetBidByCode(BuyCallCode, 2);//ATM콜 매수2호가
A1.OrderBuy(BuyCallCode, vol, BuyCallPrice, 0);
Main.MessageLog("등가콜매수 : "+BuyCallCode);
}
//선물차트에서 매도신호발생하면 풋 매수
if (Signal.signalKind ==3)
{
SStart =1;
BuyPutCode = Option.GetATMPutRecent(0);//ATM풋 종목코드
var BuyPutPrice = Option.GetBidByCode(BuyPutCode, 2);//ATM풋 매수 2호가
A1.OrderBuy(BuyPutCode, vol, BuyPutPrice, 0);
Main.MessageLog("등가풋매수 : "+BuyPutCode);
}
if (BStart == 1 && Signal.signalKind == 2)//선물차트 매수 청산신호발생하면 콜 매수 청산
{
var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2);
A1.OrderSell(BuyCallCode, vol, BxCallPrice, 0);
Main.MessageLog("등가콜청산 : "+BuyCallCode);
}
if (SStart == 1 && Signal.signalKind == 4)//선물차트 매도 청산신호발생하면 풋 매수 청산
{
var BxPutPrice = Option.GetBidByCode(BuyPutCode, 2);
A1.OrderSell(BuyPutCode, vol, BxPutPrice, 0);
Main.MessageLog("등가풋청산 : "+BuyPutCode);
}
}
2013-11-06
867
글번호 222700