답변완료
간단한 질문 문의
안녕하세요
기존 게시판에 공개된 스팟전략으로 공부중인데 초보라 이해부탁드려요
아래는 선물신호시 3.0~1.5의 프리값중 2.3에 가까운 옵션 종목을 매도하는
스팟전략인데요
장중의 프리값의 큰변동시 진입종목이 변경될때가 있는데 이와 상관없이 처음 진입한
종목을 당일 장중 내내 거래하고 싶습니다. 어려우셔도 아래식을 지정종목으로 거대될수
있도록 스팟전략 부탁드립니다.
- 예)금일의 경우 장중내내
선물 매수신호시 ---> 풋 외가 1호가(P257.5) 매도
선물 매도신호시 ---> 콜 외가 1호가(C262.5) 매도
=============================================================================
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) <= 3.0 && Option.GetCurrent(0, i) >= 1.5)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.3);
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) <= 3.0 && Option.GetCurrent(1, ii) >= 1.5)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-2.3);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = 9999999;
PutOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (PutPrice[iii+LNum] < PP)
{
PP = PutPrice[iii+LNum];
PutOrderCode = PutCode[iii+LNum]
}
}
if (PP < 9999999)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitlong신호 발생시
if (Start == 1 && Signal.signalKind == 2)
{
Start = 0;
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);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = 9999999;
CallOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (CallPrice[iiii+UNum] < CC)
{
CC = CallPrice[iiii+UNum];
CallOrderCode = CallCode[iiii+UNum];
}
}
if (CC < 9999999)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("B신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitshort신호 발생시
if ( Start == -1 && Signal.signalKind == 4)
{
Start = 0;
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);
}
}
}
================================================================================
수고하세요~
2014-06-09
1370
글번호 223014
답변완료
문의 올립니다.
안녕하세요.
922 문의글에 올려 주신 답변 대단히 감사합니다.
그와 관련하여 부분적으로 보완 질의 드리고자 합니다.
상황:
1. 차트와 지표들을 눈으로 관찰하면서, 일정 조건에 손으로 시장가 주문을 클릭해서 진입하고,
2. 또 계속 지표들을 눈으로 관찰하면서 손으로 시장가 주문 클릭으로 청산하고 나오는 방식으로 매매하는데,
3. 혹시라도 손으로 청산을 제대로 못하는 경우를 대비해서 안전방책으로 넉넉한 스탑 거리를 두고 Spot을 이용한 자동 청산 예약주문을 해 둠.
4. 원하는 대로 손으로 제대로 시장가 주문 클릭으로 청산하고 나온 경우, 이제 필요 없어진, Spot으로 주문한 자동 청산 예약 미체결 주문은, Spot으로 자동 최소되게 함.
(스팟 식으로 부탁드리고 싶은 부분은 위의 3번, 4번 내용입니다.))
예를 들어서, 아래와 같은 상황을 위한 Spot식을 알려 주시면 대단히 감사하겠습니다.
A. 손으로 시장가 주문 클릭해서 100포인트로 매수진입함. ((이 것은 스팟 소스 필요 없음))
B. 이렇게 손으로 진입된 잔고가 발생하면, Spot에서 자동으로 이를 감지해서,
그 밑에 좀 넉넉한 안전 장치로서, 20틱 아래인 99.80포인트((1틱 = 0.01포인트))에 sell stop 주문이 자동으로 나가도록 Spot을 작동시킴.
C. 눈으로 다른 지표들 보면서 관찰하다가 진입가격의 5틱 아래인 99.95포인트에서 바로 손으로 시장가 주문 클릭해서 손절 청산 했다고 가정. ((이 C 부분은 스팟 소스 필요 없음))
이제 Spot이 99.80포인트에 sell stop 주문한 것은 필요가 없어진 상황임.
D. 그래서 이 99.80포인트에 sell stop되도록 한 미체결 주문이, Spot으로 취소되게 함.
즉,
Spot으로 아래의 내용 가동시킴:
가.
(손으로든, 또는 예스 랭귀지 시스템식으로든 간에) 매수진입된 롱포지션이 있는 경우,
스팟이 그 잔고를 감지해서,
Spot으로, 초기스탑으로써, 그 매수평균단가의 20틱 아래에 셀 스탑 주문이 나가서 유지되게 하고,
((요체: 잔고가 생기면 스팟이 스탑 주문 내보냄))
((여기에, 추가해서,
25틱 이익 발생 후 최고가 10틱 아래에 추적스탑하는 것을 추가해 주셔도 감사하겠습니다.))
나.
(손이나 시스템 식 자동거래로 매수진입된) 롱포지션이 (손거래나 시스템 식 자동거래로) 청산되어서, 사라지고 없어 지면 ((즉, 잔고가 있다가 없어 진 것이 확인된 후에)),
그와 동시에 즉시, (스팟으로 셀 스탑 주문이 된) 미체결 주문을 취소해 버림.
((요체: 잔고가 없어 지면 즉시 미체결 스탑주문 취소))
이런 내용의 스팟식을 알려 주시면 대단히 감사하겠습니다.
그러면 알려 주신 내용을 바탕으로 해서, 매수나 매도 진입 후 여러 가격 변동 상황에 대한 (익절, 손절, 추적스탑 등의) 청산소스들을 제가 만들어 보도록 하겠습니다.
감사합니다.
2014-06-05
1318
글번호 223010
답변완료
오버잔고가 있을시 확장챠트 구성
안녕하세요
콜옵션과 대항 풋옵션 255-255
풋옵션과 대항 콜옵션..
으로 확장챠트 구성.
잔고가 없을때는 위의 구성으로
오버잔고가 있을시는
잔고의 구분에 따라 오버 옵션의 콜풋으로 주종목을 구성하고 싶습니다
감사합니다.
var Start;
var S1, S2;
var OrderCode1; var OrderCode2;
var P1; var AvgCost; var PLsum;
var Nth = 0;
var ItemCode = new Array(100);//갯수
var ItemObject = new Array(100);//갯수
var ItemHigh = new Array(100);//갯수
var ItemLow = new Array(100);//갯수
var Balnum;
var UNum; var LNum;
var CallCode; var CallPrice; var CallATM; var PutATM;
var PutCode; var PutPrice; var CoCall; var CoPut;
var CC; var PP;
var vol1; var vol3; var vol4; var vol5;
var vol2; var vol6; var vol7;
var CaBuyID, CaSellID;
var CBcond, CScond;
var CaBuyNum, CaSellNum;
var PuBuyID, PuSellID;
var PBcond, PScond;
var PuBuyNum, PuSellNum;
var BFill,SFill;
var CallStart;
var PutStart;
var ChartEx11 ;//= null;
var ChartEx12 ;//= null;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시 작:");
Nth = 0;
Balnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Balnum);
if (Balnum > 0)
{
//계좌의 잔고리스트에서 첫번째 잔고 셋팅
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 20,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목요청",Account1.Balance.code);
}
if (Account1.Balance.categoryEx == 31 )
CallOrderCode = Account1.Balance.code;
if (Account1.Balance.categoryEx == 32 )
PutOrderCode = Account1.Balance.code;
}
//코스피200선물에 가장 가까운 콜/풋 종목 선정
var var1 = MarketData1.open;//current;//expectedPrice
var var2 = parseInt(var1/10)*10;
var var3 = var1%10;
var ATM = -1;
if (var3 >= 8.75)
ATM = var2+10;
else if (var3 < 8.75 && var3 >= 6.25)
ATM = var2+7.5;
else if (var3 < 6.25 && var3 >= 3.75)
ATM = var2+5.0;
else if (var3 < 3.75 && var3 >= 1.25)
ATM = var2+2.5;
else
ATM = var2+0.0;
CallATM = Option.GetCodeByExercisePrice(0, ATM);
PutATM = Option.GetCodeByExercisePrice(1, ATM);
Main.MessageList("선물시가 :",MarketData1.open,"ATM",ATM,"콜ATM :",CallATM ,"풋ATM :",PutATM);
//2.0에 가장 가까운 콜/풋 종목
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);
if (Balnum == 0 || Account1.Balance.categoryEx != 31)
{
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
CC = 99999999;
CallOrderCode = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum];
}
if (CallOrderCode == CallCode[i+LNum])
{
CallOrderCode1 = CallCode[i+LNum-1];
CallOrderCode2 = CallCode[i+LNum+1];
CallOrderCode3 = CallCode[i+LNum+2];
}
}
}
if (Balnum == 0 || Account1.Balance.categoryEx != 32)
{
for (var ii = -UNum; ii <= LNum; ii++)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-2.0);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
PP = 99999999;
PutOrderCode = -1;
for (var ii = -UNum; ii < LNum; ii++)
{
if (PutPrice[ii+UNum] <= PP)
{
PP = PutPrice[ii+UNum];
PutOrderCode = PutCode[ii+UNum];
}
if (PutOrderCode == PutCode[ii+UNum])
{
PutOrderCode1 = PutCode[ii+UNum-1];
PutOrderCode2 = PutCode[ii+UNum+1];
PutOrderCode3 = PutCode[ii+UNum+2];
PutOrderCode4 = PutCode[ii+UNum+3];
}
}
}
//2.0과 가장 가까운 콜의 반대 옵션종목
CoPut = Option.GetCodeByExercisePrice(1,Option.GetExercisePrice(CallOrderCode));
CoCall = Option.GetCodeByExercisePrice(0,Option.GetExercisePrice(PutOrderCode));
Main.MessageList("2.0근접콜",CallOrderCode,"콜반대",CoPut,"2.0근접풋",PutOrderCode,"풋반대",CoCall);
//확장 차트객체 요청
//주종목 시가기준 콜
var ChartSet4 = new ReqChartItem(CallOrderCode,3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
var ChartSet5 = new ReqChartItem(PutOrderCode,3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//시스템 설정
var TradeSet4 = new SystemTradeInfo(TRADE_FIXCAPITAL,1, 10000000,1, // 자산
0.07, 0.07,CALCMETHOD_PERCENT, // 진입/청산 수수료
0.01, 0.01,CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
50, //1000, // 최대진입수량
10); // 최대진입횟수
var SystemSet4 = new SystemInfo("Opover",YL_TYPE_NORMAL,null,TradeSet4,null);
//지표 설정
I1 = new IndicatorInfo("중심", YL_TYPE_NORMAL,new Array(new YLInputVar(null,null)));
var IndicatorSet4 = new Array(I1);
//참조데이터 추가
//data2 2.0 근접콜
var R31 = new ReqChartItem(CallOrderCode, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data3 2.0 근접콜 반대종목
var R32 = new ReqChartItem(CoPut, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data4 3.0 근접풋
var R33 = new ReqChartItem(PutOrderCode, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data4 3.0 근접풋 반대종목
var R34 = new ReqChartItem(CoCall, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet4 = new Array(R32);
var ReferDataSet5 = new Array(R34);
//지정한 설정으로 챠트 생성을 요청
Main.ReqChartEx(ChartSet4, SystemSet4, IndicatorSet4, ReferDataSet4);
Main.ReqChartEx(ChartSet5, SystemSet4, IndicatorSet4, ReferDataSet5);
}
function Main_OnU*pdateAccount(sAccntNum, sItemCode, lU*pdateID)
{
//계좌에 변동이 생기면
if (sAccntNum == Account1.number && (lU*pdateID == 30001 ))
{
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code,20,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목요청",Account1.Balance.code);
}
}
//요청한 종목객체 수신되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == ItemCode[Nth])
{
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemCode[Nth]);
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
ItemLow[Nth] = 99999; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최저값 계산해 저장할 변수)
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Balnum > 0)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목요청",Account1.Balance.code);
}
}
}
}
//요청한 차트객체 생성이 완료되면
function Main_OnRcvChartEx(ChartEx)
{
if ( ChartEx.GetCode(1) == CallOrderCode)
{
ChartEx4 = ChartEx;
OrderCode1 = Main.GetOrderCode(ChartEx4.GetCode(1));//ATM단위로 사용할때
Main.MessageList("Cx코드 :",ChartEx4.GetCode(1));
}
if ( ChartEx.GetCode(1) == PutOrderCode)
{
ChartEx5 = ChartEx;
OrderCode2 = Main.GetOrderCode(ChartEx5.GetCode(1));//ATM단위로 사용할때
Main.MessageList("Px코드 :",ChartEx5.GetCode(1));
}
Start = 1;
}
2014-05-31
1263
글번호 223004