예스스탁
예스스탁 답변
2016-07-13 15:21:22
안녕하세요
예스스탁입니다.
function Main_OnRiseSignal(ChartEx6,Signal)
function Main_OnRiseSignal함수에서
ChartEx6와 같이 객체의 이름을 따로 지정하시는 것은 의미가 없습니다.
신호가 발생하면 해당 이름으로 차트정보가 담겨져 리턴됩니다.
즉 확장차트 객체는 개별적으로 이벤트가 있는 것이 아니고
function Main_OnRiseSignal로 통합해서 모든 신호를 받게 됩니다.
따로 이벤트가 존재하는 것은 일반차트객체 뿐입니다.
아래와 같이 이벤트는 하나만 사용하시고
신호가 발생하면 종목코드등으로 구별해서
스크립트 내용 작성해 사용하셔야 합니다.
function Main_OnRiseSignal(ChartEx,Signal)
{
//날자 및 시계계산
var d = new Date();
var HHMMSSTT = d.getHours()*10000000+d.getMinutes()*100000+d.getSeconds()*1000+d.getMilliseconds();
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 (ChartEx.GetCode(1) == CallOrderCode)
{
if (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
{
}
}
}
if (ChartEx.GetCode(1) == PutOrderCode)
{
if (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
{
}
}
}
}
즐거운 하루되세요
> 파문일기 님이 쓴 글입니다.
> 제목 : 확장챠트의 신호가...
> 확장챠틀를 두개이상 만들어서 신호의 조건에 따라 진입, 청산을 하는데
두챠트의 신호가 각각 구분되어 나오게 하는 것을 검토해 주세요...
참고로 아래의 수식은 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
{
}
}
}