답변완료
확장챠트의 신호가...
확장챠틀를 두개이상 만들어서 신호의 조건에 따라 진입, 청산을 하는데
두챠트의 신호가 각각 구분되어 나오게 하는 것을 검토해 주세요...
참고로 아래의 수식은 ChartEx6에 ChartEx5의 신호까지 겹쳐서 나오네요..
var Start, CallStart, PutStart;
var Code1Vol; var Code2Vol, CodeVol;
var OrderCode, OrderCode1; var OrderCode2;
var Nth = 0; var Balnum, AccVol;
var CallStart; var PutStart;
var CallOrderCode;
var PutOrderCode;
var BuyNum,SellNum;
var BuyVol,BuyFillVol,BuyID, BuyStep = 0,BuyPrice ;
var BuyLimitPrice,BuyLimitEnd = false, BuyResponse = false;
var SellVol,SellFillVol,SellID, SellStep = 0,SellPrice ;
var SellLimitPrice,SellLimitEnd = false, SellResponse = false;
var Expr1, Expr2;
var CVit, PVit, CGoal, PGoal, Ma5;//
var ChartEx5; var ChartEx6;
//스팟 시작시에
function Main_OnStart()
{
Start = 0;
CallStart = 0;
PutStart = 0;
OrderCode1 = Main.GetOrderCode( MarketData1.code);//ATM단위로 사용할때
Account1.SetBalanceItem(OrderCode1, 0);
if (Account1.Balance.code == OrderCode1)
{
CodeVol = Account1.Balance.count ;
}
Main.MessageList("코 드: ",OrderCode1,"잔고:",CodeVol);
Main.ReqMarketData(OrderCode1, 10,0);
Main.MessageList("종목객체요청");
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//9시 5분에
if (Start == 0 && HHMMSS >= 083000)// && HHMMSS >= 90030
{
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 (HHMMSS < 090000)
{
CallPrice[i+LNum] = Math.abs(Option.GetExpectedPrice(0, i)-2.0);
}
else if (HHMMSS >= 090000)
{
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];
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (HHMMSS < 090000)
{
PutPrice[ii+UNum] = Math.abs(Option.GetExpectedPrice(1, ii)-2.0);
}
else if (HHMMSS >= 090000)
{
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];
}
}
Main.MessageList("콜",CallOrderCode ,"풋",PutOrderCode);
//확장 차트객체 요청
var ChartSet1 = new ReqChartItem(CallOrderCode,60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var ChartSet2 = new ReqChartItem(PutOrderCode,60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
//시스템 설정
//var SystemInputSet = new Array(new YLInputVar("HP", OpHLPIn1),new YLInputVar("LP", OpHLPIn2));
var TradeSet = new SystemTradeInfo(TRADE_FIXCAPITAL,1, 10000000,1, // 자산
0.07, 0.07,CALCMETHOD_PERCENT, // 진입/청산 수수료
0.01, 0.01,CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ALL, // 피라미딩 설정여부
50, //1000, // 최대진입수량
4); // 최대진입횟수
//var StopSet = new SystemStopInfo(new StopEndOfDay(150300));
var SystemSet1 = new SystemInfo("Opover틱-단타data4추세",YL_TYPE_NORMAL,null,TradeSet,null);
//var SystemSet2 = new SystemInfo("Opover틱-단타data4",YL_TYPE_NORMAL,null,TradeSet,null);
//지표 설정
//지표명 MACD를 기간 10,20으로 설정해서 차트에 적용
I1 = new IndicatorInfo("옵션거래량마디_data4추세", YL_TYPE_NORMAL,
null,null);
var IndicatorSet = new Array(I1);
//참조데이터 추가
var R11 = new ReqChartItem(PutOrderCode, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var R12 = new ReqChartItem(CallOrderCode2, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var R13 = new ReqChartItem(CallOrderCode1, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet1 = new Array(R11,R12,R13);
//참조데이터 추가
var R21 = new ReqChartItem(CallOrderCode, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var R22 = new ReqChartItem(PutOrderCode2, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var R23 = new ReqChartItem(PutOrderCode1, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet2 = new Array(R21,R22,R23);
//지정한 설정으로 챠트 생성을 요청
ChartEx5 = Main.ReqChartEx(ChartSet1, SystemSet1, IndicatorSet, ReferDataSet1);
ChartEx6 = Main.ReqChartEx(ChartSet2, SystemSet1, IndicatorSet, ReferDataSet2);
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == CallOrderCode)//CallOrderCode == ChartEx.GetCode(1))// ChartEx.GetCode(1) == CallOrderCode)
{
ChartEx5 = ChartEx;
CallStart = 1;
Main.ReqMarketData(ChartEx5.GetCode(1), 20,0);//ATM단위로 사용할때
Main.MessageList("Cx코드",ChartEx5.GetCode(1));
}
if (ChartEx.GetCode(1) == PutOrderCode)//PutOrderCode == ChartEx.GetCode(1))// ChartEx.GetCode(1) == PutOrderCode)
{
ChartEx6 = ChartEx;
PutStart = 1;
Main.ReqMarketData(ChartEx6.GetCode(1), 20,0);//ATM단위로 사용할때
Main.MessageList("Px코드",ChartEx6.GetCode(1));
}
}
function Main_OnRcvMarketData(MarketData)
{
Start = 1;
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == OrderCode1)
{
OrderCode1 = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
Main.MessageList("종목객체생성완료 : ",OrderCode1);
}
if (MarketData.code == CallOrderCode)
{
CallOrderCode = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
Main.MessageList("종목객체생성완료 : ",CallOrderCode);
}
if (MarketData.code == PutOrderCode)
{
PutOrderCode = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
Main.MessageList("종목객체생성완료 : ",PutOrderCode);
}
}
function Main_OnRiseSignal(ChartEx5,Signal)
{
//날자 및 시계계산
var d = new Date();
var HHMMSSTT = d.getHours()*10000000+d.getMinutes()*100000+d.getSeconds()*1000+d.getMilliseconds();
//CallStart = 2;
CVit = C3.GetIndicatorData("중심가격3-7",1, 0);//
PVit = C3.GetIndicatorData("중심가격3-7",2, 0);//
CGoal = C3.GetIndicatorData("중심가격3-7",5, 0);//
PGoal = C3.GetIndicatorData("중심가격3-7",6, 0);//
Ma5 = C3.GetIndicatorData("중심가격3-7",13, 0);//
if (ChartEx5.GetCode(1) == CallOrderCode && Signal.signalKind == 1)
{
Main.MessageList("CGoal",CGoal,HHMMSSTT);
if ((CallStart == 1 && C3.GetClose(1, 0) >= CVit && C3.GetClose(1, 0) >= CGoal) ||
(CallStart == 1 && C3.GetClose(1, 0) > Ma5 && (C3.GetClose(1, 0) >= CVit || C3.GetClose(1, 0) >= CGoal)))
{
Main.MessageList("신호Ex11:",Signal.name,"가격",Signal.price,"시간",HHMMSSTT);
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), BuyVol, BuyPrice, 0);
Main.MessageList("매수주문3 - ","주문아이디",BuyID,"주문가격",BuyPrice,"수량",BuyVol);
Main.SetTimer(11, 60000);//60초
}
else
{
}
}
}
function Main_OnRiseSignal(ChartEx6,Signal)
{
//날자 및 시계계산
var d = new Date();
var HHMMSSTT = d.getHours()*10000000+d.getMinutes()*100000+d.getSeconds()*1000+d.getMilliseconds();
//CallStart = 2;
CVit = C3.GetIndicatorData("중심가격3-7",1, 0);//C생명가반등
PVit = C3.GetIndicatorData("중심가격3-7",2, 0);//P생명가반등
CGoal = C3.GetIndicatorData("중심가격3-7",5, 0);//콜목
PGoal = C3.GetIndicatorData("중심가격3-7",6, 0);//풋목
Ma5 = C3.GetIndicatorData("중심가격3-7",13, 0);//
if (ChartEx6.GetCode(1) == PutOrderCode && Signal.signalKind == 1)
{
Main.MessageList("PGoal",PGoal,HHMMSSTT);
if ((PutStart == 1 && C3.GetClose(1, 0) <= PVit && C3.GetClose(1, 0) <= PGoal) ||
(PutStart == 1 && C3.GetClose(1, 0) < Ma5 && (C3.GetClose(1, 0) <= PVit || C3.GetClose(1, 0) <= PGoal)))
{
Main.MessageList("신호Ex21:",Signal.name,"가격",Signal.price,"시간",HHMMSSTT);
SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SellVol, SellPrice, 0);
Main.MessageList("매도주문3","주문아이디",SellID,"주문가격",SellPrice,"수량",SellVol);
Main.SetTimer(12, 60000);//60초
}
else
{
}
}
}
2016-06-15
1336
글번호 223928
답변완료
수식 수정 문의드립니다.
안녕하세요 항상 답변에 감사드리고 있습니다.
아래 수식은 선물매수시 스팟에서 콜매수, 풋매도 진입하고 선물매도시 스팟에서 풋매수,콜매도 옵션을 주문하는 합성선물 수식입니다.
이 합성선물 수식을 수정하여 아래와 같은 수식으로 변경하고자 합니다.
주내용은 선물신호발생하여 옵션주문시 당초 양합보다 (+)시에는(양매수장) 옵션매수를 하고 양합 (-)시에는(양매도) 옵션매도 판단하여 주문하는 수식입니다.
ㅁ선물신호 발생 --->(양합이 1% 이상일때) 콜매수 또는 풋매수
ㅁ선물신호 발생 --->(양합이 1% 미만일때) 콜매도 또는 풋매도
최종 합성선물수식은 아니고 방향성 수식이며 선물에서 신호발생시 스팟에서
양합에 따라 매수, 매도를 결정하여 한 종목만 네이키드 진입함
당일 9시1분 등가의 콜과 풋의 종목을 기억하고 콜값, 풋값과 그 양합을 구함
(당일 시초가 등가는 장이 시작되야 알기에 1분으로 함)
선물매수신호가 나오면 9시1분 기억한 종목의 양합을 체크하여 양합이 9시1분보다 1% 이상에 있을때는 콜매수하고 1%보다 낮을때는 풋매도 진입
선물매도신호가 나오면 9시 1분에 기억한 종목의 양합을 체크하여 현재의 양합이 9시1분보다 1% 이상에 있을때는 풋매수, 그렇지 않을때는 콜매도 진입
미리 답변에 감사드립니다. 주신답변 실전에 잘 응용해서 써먹고 있습니다.
아래는 합성선물 수식입니다.
================================================================================
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
T = 1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
if (T == 1 && Signal.signalKind == 2)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitLong신호 발생");
T = 0;
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
}
if (T >= 0 && Signal.signalKind == 3)
{
T = -1;
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0);
Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0);
}
}
if (T == -1 && Signal.signalKind == 4)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("ExitShort신호 발생");
T = 0;
Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0);
Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0);
}
}
==================================================================================
2016-06-13
1268
글번호 223925