예스스탁
예스스탁 답변
2025-06-05 09:51:33.0
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
차트에 적용된 지표에서 값을 가져오기 위해서는
차트객체의 GetIndicatorData함수로 이름과 plot번호 지정해 값을 가져 옵니다.
각차트에 적용된 지표명과 plot번호를 정확히 지정하셔야 합니다.
각 차트가 모두 동일종목이면 종목객체는 MarketData1 하나만 필요합니다.
하나만 추가하시고 수식내 MarketData2부터는 모두 MarketData1로 변경하시면 됩니다.
1
스크립트 객체설정
차트객체 추가 --> 속성에서 객체명 Chart1, 차트1과 동일 아이디 부여
차트객체 추가 --> 속성에서 객체명 Chart2, 차트2와 동일 아이디 부여
종목객체 추가 --> 속성에서 객체명 MarketData1, Chart1과 동일종목으로 지정
종목객체 추가 --> 속성에서 객체명 MarketData2, Chart2와 동일종목으로 지정
계좌객체 추가 --> 속성에서 객체명 Account1, 주문낼 계좌번호 지정
var CH;
function Main_OnStart()
{
Main.MessageList("Start");
CH = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count == 0 && Chart1.GetIndicatorData("차트1지표명",1,0) > Chart2.GetIndicatorData("차트2지표명",1,0))
{
CH = 1;
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(1), 0);
}
}
if (CH == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(1), 0);
}
if (Signal.signalKind == 3)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count == 0 && Chart1.GetIndicatorData("차트1지표명",1,0) > Chart2.GetIndicatorData("차트2지표명",1,0))
{
CH = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(1), 0);
}
}
if (CH == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(1), 0);
}
}
function Chart2_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count == 0 && Chart1.GetIndicatorData("차트1지표명",1,0) < Chart2.GetIndicatorData("차트2지표명",1,0))
{
CH = 2;
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Ask(1), 0);
}
}
if (CH == 2 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Bid(1), 0);
CH = 0;
}
if (Signal.signalKind == 3)
{
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count == 0 && Chart1.GetIndicatorData("차트1지표명",1,0) < Chart2.GetIndicatorData("차트2지표명",1,0))
{
CH = -2;
Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Bid(1), 0);
}
}
if (CH == -2 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Ask(1), 0);
CH = 0;
}
}
2
스크립트 객체설정
차트객체 추가 --> 속성에서 객체명 Chart1, 차트1과 동일 아이디 부여
차트객체 추가 --> 속성에서 객체명 Chart2, 차트2와 동일 아이디 부여
차트객체 추가 --> 속성에서 객체명 Chart3, 차트3와 동일 아이디 부여
차트객체 추가 --> 속성에서 객체명 Chart4, 차트4와 동일 아이디 부여
종목객체 추가 --> 속성에서 객체명 MarketData1, Chart1과 동일종목으로 지정
종목객체 추가 --> 속성에서 객체명 MarketData2, Chart2와 동일종목으로 지정
종목객체 추가 --> 속성에서 객체명 MarketData3, Chart3과 동일종목으로 지정
종목객체 추가 --> 속성에서 객체명 MarketData4, Chart4와 동일종목으로 지정
계좌객체 추가 --> 속성에서 객체명 Account1, 주문낼 계좌번호 지정
var CH;
function Main_OnStart()
{
Main.MessageList("Start");
CH = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count == 0 &&
Chart1.GetIndicatorData("차트1지표명",1,0) >
Math.max(Chart2.GetIndicatorData("차트2지표명",1,0), Chart3.GetIndicatorData("차트3지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = 1;
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(1), 0);
}
}
if (CH == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(1), 0);
CH = 0;
}
if (Signal.signalKind == 3)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count == 0 &&
Chart1.GetIndicatorData("차트1지표명",1,0) >
Math.max(Chart2.GetIndicatorData("차트2지표명",1,0), Chart3.GetIndicatorData("차트3지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(1), 0);
}
}
if (CH == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(1), 0);
CH = 0;
}
}
function Chart2_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count == 0 &&
Chart2.GetIndicatorData("차트2지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart3.GetIndicatorData("차트3지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = 2;
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Ask(1), 0);
}
}
if (CH == 2 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Bid(1), 0);
CH = 0;
}
if (Signal.signalKind == 3)
{
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count == 0 &&
Chart2.GetIndicatorData("차트2지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart3.GetIndicatorData("차트3지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = -2;
Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Bid(1), 0);
}
}
if (CH == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Signal.count,MarketData2.Ask(1), 0);
CH = 0;
}
}
function Chart3_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData3.code), 0);
if (Account1.Balance.count == 0 &&
Chart3.GetIndicatorData("차트3지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart2.GetIndicatorData("차트2지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = 3;
Account1.OrderBuy(Main.GetOrderCode(MarketData3.code), Signal.count,MarketData3.Ask(1), 0);
}
}
if (CH == 3 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData3.code), Signal.count,MarketData3.Bid(1), 0);
CH = 0;
}
if (Signal.signalKind == 3)
{
Account1.SetBalance(Main.GetOrderCode(MarketData3.code), 0);
if (Account1.Balance.count == 0 &&
Chart3.GetIndicatorData("차트3지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart2.GetIndicatorData("차트2지표명",1,0),Chart4.GetIndicatorData("차트4지표명",1,0)) )
{
CH = -3;
Account1.OrderSell(Main.GetOrderCode(MarketData3.code), Signal.count,MarketData3.Bid(1), 0);
}
}
if (CH == -3 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData3.code), Signal.count,MarketData3.Ask(1), 0);
CH = 0;
}
}
function Chart4_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData4.code), 0);
if (Account1.Balance.count == 0 &&
Chart4.GetIndicatorData("차트4지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart2.GetIndicatorData("차트2지표명",1,0),Chart3.GetIndicatorData("차트3지표명",1,0)) )
{
CH = 4;
Account1.OrderBuy(Main.GetOrderCode(MarketData4.code), Signal.count,MarketData4.Ask(1), 0);
}
}
if (CH == 4 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData4.code), Signal.count,MarketData4.Bid(1), 0);
CH = 0;
}
if (Signal.signalKind == 4)
{
Account1.SetBalance(Main.GetOrderCode(MarketData4.code), 0);
if (Account1.Balance.count == 0 &&
Chart4.GetIndicatorData("차트4지표명",1,0) >
Math.max(Chart1.GetIndicatorData("차트1지표명",1,0), Chart2.GetIndicatorData("차트2지표명",1,0),Chart3.GetIndicatorData("차트3지표명",1,0)) )
{
CH = -4;
Account1.OrderSell(Main.GetOrderCode(MarketData4.code), Signal.count,MarketData4.Bid(1), 0);
}
}
if (CH == -4 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData4.code), Signal.count,MarketData4.Ask(1), 0);
CH = 0;
}
}
즐거운 하루되세요
> 율담 님이 쓴 글입니다.
> 제목 : 수식 문의드립니다.
> 안녕하세요. 항상 감사드립니다.
--------------------------------------------------------------
차트 두개를 참조하는 수식을 만들고 싶습니다.
차트1에 적용된 지표의 특정값을 A로 놓고,
차트2에 적용된 지표의 특정값을 B로 놓았을때.
A > B 조건에서는 A에 적용된 시스템의 진입과 청산 신호를 따르고,
A < B 조건에서는 B에 적용된 시스템의 진입과 청산 신호를 따르고 싶습니다.
진입은 무포지션일때만 가능합니다.
------------------------------------------------------------------
같은 맥락으로...
차트1, 차트2, 차트3, 차트4 중.. 지표값이 가장 높은 진입신호를 실매매하고 싶습니다.
진입신호가 나온 차트의 전략의 청산신호로 청산이 되구요.
진입신호로 인해 포지션을 잡게되면.. 추가 진입은 없게 하고 싶습니다.
혹시 가장 높은 지표값이 차트 두개가 같다면, 진입은 없게 하고 싶습니다.
즉, 지표값이 가장 높은 차트의 시스템 신호만 활성화하는 전략입니다.