예스스탁
예스스탁 답변
2014-06-19 13:57:55
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
계좌객체 --> Account1
종목객체 --> MarketData1, 차트와 같은 종목
차트객체 --> Chart1
Up*date 영문업데이트에 *제거하시기 바랍니다.
var SK,PreSK
var ST,PreST;
var BarCnt;
var EntryCode,EntryBarCnt,EntryPrice,EntryVol,EntryFillPrc;
var BuyID, SellID, BuyNum, SellNum;
var BPID, SPID, BPNum, SPNum;
var AccurLoss, DayEnd;
//스팟시작
function Main_OnStart()
{
BarCnt = 0;
EntryBarCnt = -1;
EntryStep = 0;
AccurLoss = false;
DayEnd = false;
Main.MessageList("진입스텝",EntryStep);
}
//봉완성 카운트
function Chart1_OnBarAppended(nData)
{
BarCnt = BarCnt+1;
//매수주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == 2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(BuyNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
EntryStep = 0;
}
}
//매도주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == -2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(SellNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
EntryStep = 0;
}
}
}
function Chart1_OnRiseSignal(Signal)
{
//직전 발생 신호의 종류와 시간
PreSK = SK;
PreST = ST;
//현재 발생 신호의 종류와 시간
SK = Signal.signalKind;
ST = Signal.time;
//매수신호 발생하고 매도청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 1 && PreSK == 4 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
BuyID = Account1.OrderBuy(EntryCode,EntryVol,MarketData1.Ask(3),0);
EntryStep = 1
Main.MessageList("매수진입주문",EntryStep);
}
//매도신호 발생하고 매수청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 3 && PreSK == 2 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
SellID = Account1.OrderSell(EntryCode,EntryVol,MarketData1.Bid(3),0);
EntryStep = -1;
Main.MessageList("매도진입주문",EntryStep);
}
}
function Main_OnOrderResponse(OrderResponse)
{
//매수진입 주문응답
if (EntryStep == 1 && BuyID == OrderResponse.orderID )
{
BuyNum = OrderResponse.orderNum;
EntryStep = 2;
Main.MessageList("매수진입주문 응답",EntryStep);
}
//매도진입 주문응답
if (EntryStep == -1 && SellID == OrderResponse.orderID )
{
SellNum = OrderResponse.orderNum;
EntryStep = -2;
Main.MessageList("매도진입주문 응답",EntryStep);
}
//매수 목표수익 주문응답
if (EntryStep == 3 && BPID == OrderResponse.orderID )
{
BPNum = OrderResponse.orderNum;
Main.MessageList("매수목표수익주문 응답",EntryStep);
}
//매도 목표수익 주문응답
if (EntryStep == -3 && SPID == OrderResponse.orderID )
{
SPNum = OrderResponse.orderNum;
Main.MessageList("매목표수익주문 응답",EntryStep);
}
}
function Main_OnNotifyFill(NotifyFill)
{
//매수 진입주문 체결
if (EntryStep == 2 && BuyNum == NotifyFill.orderNum )
{
EntryStep = 3;
EntryFillPrc = NotifyFill.fillPrice;
//신호가격 +0.5로 매도주문
Main.MessageList("매수진입주문 체결",EntryStep);
BPID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice+0.5,0);
Main.MessageList("매수목표수익주문");
}
//매도 진입주문 체결
if (EntryStep == -2 && SellNum == NotifyFill.orderNum )
{
EntryStep = -3;
EntryFillPrc = NotifyFill.fillPrice;
Main.MessageList("매도진입주문 체결",EntryStep);
//신호가격-0.5로 매수주
SPID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice-0.5,0);
Main.MessageList("매도목표수익주문");
}
//매수 목표수익 체결
if (EntryStep == 3 && BPNum == NotifyFill.orderNum )
{
EntryStep = 0;
Main.MessageList("매수목표수익주문 체결",EntryStep);
}
//매도 목표수익 체결
if (EntryStep == -3 && SPNum == NotifyFill.orderNum )
{
EntryStep = 0
Main.MessageList("매목표수익주문 체결",EntryStep);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
if (MarketData1.code == sItemCode && lUp*dateID == 20001) //*제거
{
if (EntryStep == 3 && MarketData1.current <= EntryFillPrc-1)//*제거
{
//기존 매수목표수익 주문 취소
Account1.SetUnfillOrderNumber(BPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(BPNum);
}
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
AccurLoss = true;
}
if (EntryStep == -3 && MarketData1.current >= EntryFillPrc+1)
{
//기존 매도목표수익 주문 취소
Account1.SetUnfillOrderNumber(SPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(SPNum);
}
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
AccurLoss = true;
}
//시간청산
if (MarketData1.time >= 1430000000 && AccurLoss == false && DayEnd == false)
{
DayEnd = true;
if (EntryStep == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
}
if (EntryStep == -3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
}
}
}
}
즐거운 하루되세요
> 새로운세상 님이 쓴 글입니다.
> 제목 : 진입체결 확인 즉시 청산주문
> 안녕하세요.
다음 수식 부탁드립니다.
연결선물 분봉, YT 리버스신호에 의한 YesSpot주문, 데이트레이딩
--------------------------
1) 장개시후 YT에서 조건 충족시 신호 발생 (리버스 신호)
2) YesSpot에서 YT신호 발생 종가로 주문
- YT신호가 발생한 후 5봉이 경과하기 전에 체결이 안되면 주문 취소
- 5봉 경과전 새로운 YT신호는 모두 무시
3) YT기준 5봉이내 2)의 주문 체결시
- 체결확인 즉시, Spot에서
매수진입신호발생 종가 +0.50 매수청산주문
매도진입신호발생 종가 -0.50 매도청산주문
(YT의 Atlimit의 주문방식이 아니고, 종가 + - 0.50 주문대기 방식임)
- 주문체결시, Spot에서 3) 4)에 의한 청산이 발생하기 전까지
YT의 새로운 신호는 모두 무시
- 3) 4)에 의한 청산이후, YT의 새로운 리버스 신호발생하면 Spot 진입
4) 실제 진입체결가 기준으로 1pt 손절 ---> YT와 진입기준이 다르므로 Spot으로 제어
- Atstop 개념
- 손절 발생시 당일 추가적인 매매 없음 (Spot으로 제어)
5) 14:30 포지션 청산 (Spot으로 제어)
- 계좌에 다른 시스템들이 혼합되어 있으므로,
계좌 진고포지션 기준이 아닌 시스템 기준으로 요망
참고로 위의 방식을 사용할 경우
YT의 리버스 신호와 다르게 주문이 진행됩니다.
(예를들어, YT의 신호발생후 Spot에서 5봉이내에 체결이 되었을 경우,
이후에도 YT는 리버스신호가 계속 발생할 수 있으나,
위의 경우 Spot에서는 0.5pt 익절 또는 1pt 손절이 발생할 때까지 YT의 모든 신호가 무시됨)
이상입니다.
그럼 오늘도 즐거운 하루되시기를 바라겠습니다.
감사합니다.
새로운세상
2014-07-10 09:36:47
안녕하세요~
우선 복잡한 수식 작성해주신데 대하여 감사드립니다.
제가 내용중 빠트린 부분이 있습니다.
죄송합니다.
다른 내용은 동일하므로 누락된 부분만 말씀드리겠습니다.
------------------------
1) YT의 수식에는 dayindex >= 0 입니다.
2) Spot에서는 YT봉기준으로 10개봉이 경과한 후부터 진입을 원합니다.
3) YT의 첫신호는 10개봉 이전에 발생할 수도 있고, 10개봉 이후에 발생할 수도 있습니다.
4) 데이트레이딩이므로 YT의 첫신호는 Buy 또는 Sell로 시작하고, 이후 리버스 신호입니다.
5) YT의 당일종료청산은 14:40 으로 설정되어 있습니다.
현재 Spot에서 14:30 당일종료를 원하므로, 14:30 이후에는 Spot에서 진입하지 않습니다.
이상입니다.
그럼 즐거운 주말되시기 바랍니다.
감사합니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 진입체결 확인 즉시 청산주문
> 안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
계좌객체 --> Account1
종목객체 --> MarketData1, 차트와 같은 종목
차트객체 --> Chart1
Up*date 영문업데이트에 *제거하시기 바랍니다.
var SK,PreSK
var ST,PreST;
var BarCnt;
var EntryCode,EntryBarCnt,EntryPrice,EntryVol,EntryFillPrc;
var BuyID, SellID, BuyNum, SellNum;
var BPID, SPID, BPNum, SPNum;
var AccurLoss, DayEnd;
//스팟시작
function Main_OnStart()
{
BarCnt = 0;
EntryBarCnt = -1;
EntryStep = 0;
AccurLoss = false;
DayEnd = false;
Main.MessageList("진입스텝",EntryStep);
}
//봉완성 카운트
function Chart1_OnBarAppended(nData)
{
BarCnt = BarCnt+1;
//매수주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == 2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(BuyNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
EntryStep = 0;
}
}
//매도주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == -2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(SellNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
EntryStep = 0;
}
}
}
function Chart1_OnRiseSignal(Signal)
{
//직전 발생 신호의 종류와 시간
PreSK = SK;
PreST = ST;
//현재 발생 신호의 종류와 시간
SK = Signal.signalKind;
ST = Signal.time;
//매수신호 발생하고 매도청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 1 && PreSK == 4 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
BuyID = Account1.OrderBuy(EntryCode,EntryVol,MarketData1.Ask(3),0);
EntryStep = 1
Main.MessageList("매수진입주문",EntryStep);
}
//매도신호 발생하고 매수청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 3 && PreSK == 2 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
SellID = Account1.OrderSell(EntryCode,EntryVol,MarketData1.Bid(3),0);
EntryStep = -1;
Main.MessageList("매도진입주문",EntryStep);
}
}
function Main_OnOrderResponse(OrderResponse)
{
//매수진입 주문응답
if (EntryStep == 1 && BuyID == OrderResponse.orderID )
{
BuyNum = OrderResponse.orderNum;
EntryStep = 2;
Main.MessageList("매수진입주문 응답",EntryStep);
}
//매도진입 주문응답
if (EntryStep == -1 && SellID == OrderResponse.orderID )
{
SellNum = OrderResponse.orderNum;
EntryStep = -2;
Main.MessageList("매도진입주문 응답",EntryStep);
}
//매수 목표수익 주문응답
if (EntryStep == 3 && BPID == OrderResponse.orderID )
{
BPNum = OrderResponse.orderNum;
Main.MessageList("매수목표수익주문 응답",EntryStep);
}
//매도 목표수익 주문응답
if (EntryStep == -3 && SPID == OrderResponse.orderID )
{
SPNum = OrderResponse.orderNum;
Main.MessageList("매목표수익주문 응답",EntryStep);
}
}
function Main_OnNotifyFill(NotifyFill)
{
//매수 진입주문 체결
if (EntryStep == 2 && BuyNum == NotifyFill.orderNum )
{
EntryStep = 3;
EntryFillPrc = NotifyFill.fillPrice;
//신호가격 +0.5로 매도주문
Main.MessageList("매수진입주문 체결",EntryStep);
BPID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice+0.5,0);
Main.MessageList("매수목표수익주문");
}
//매도 진입주문 체결
if (EntryStep == -2 && SellNum == NotifyFill.orderNum )
{
EntryStep = -3;
EntryFillPrc = NotifyFill.fillPrice;
Main.MessageList("매도진입주문 체결",EntryStep);
//신호가격-0.5로 매수주
SPID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice-0.5,0);
Main.MessageList("매도목표수익주문");
}
//매수 목표수익 체결
if (EntryStep == 3 && BPNum == NotifyFill.orderNum )
{
EntryStep = 0;
Main.MessageList("매수목표수익주문 체결",EntryStep);
}
//매도 목표수익 체결
if (EntryStep == -3 && SPNum == NotifyFill.orderNum )
{
EntryStep = 0
Main.MessageList("매목표수익주문 체결",EntryStep);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
if (MarketData1.code == sItemCode && lUp*dateID == 20001) //*제거
{
if (EntryStep == 3 && MarketData1.current <= EntryFillPrc-1)//*제거
{
//기존 매수목표수익 주문 취소
Account1.SetUnfillOrderNumber(BPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(BPNum);
}
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
AccurLoss = true;
}
if (EntryStep == -3 && MarketData1.current >= EntryFillPrc+1)
{
//기존 매도목표수익 주문 취소
Account1.SetUnfillOrderNumber(SPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(SPNum);
}
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
AccurLoss = true;
}
//시간청산
if (MarketData1.time >= 1430000000 && AccurLoss == false && DayEnd == false)
{
DayEnd = true;
if (EntryStep == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
}
if (EntryStep == -3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
}
}
}
}
즐거운 하루되세요
> 새로운세상 님이 쓴 글입니다.
> 제목 : 진입체결 확인 즉시 청산주문
> 안녕하세요.
다음 수식 부탁드립니다.
연결선물 분봉, YT 리버스신호에 의한 YesSpot주문, 데이트레이딩
--------------------------
1) 장개시후 YT에서 조건 충족시 신호 발생 (리버스 신호)
2) YesSpot에서 YT신호 발생 종가로 주문
- YT신호가 발생한 후 5봉이 경과하기 전에 체결이 안되면 주문 취소
- 5봉 경과전 새로운 YT신호는 모두 무시
3) YT기준 5봉이내 2)의 주문 체결시
- 체결확인 즉시, Spot에서
매수진입신호발생 종가 +0.50 매수청산주문
매도진입신호발생 종가 -0.50 매도청산주문
(YT의 Atlimit의 주문방식이 아니고, 종가 + - 0.50 주문대기 방식임)
- 주문체결시, Spot에서 3) 4)에 의한 청산이 발생하기 전까지
YT의 새로운 신호는 모두 무시
- 3) 4)에 의한 청산이후, YT의 새로운 리버스 신호발생하면 Spot 진입
4) 실제 진입체결가 기준으로 1pt 손절 ---> YT와 진입기준이 다르므로 Spot으로 제어
- Atstop 개념
- 손절 발생시 당일 추가적인 매매 없음 (Spot으로 제어)
5) 14:30 포지션 청산 (Spot으로 제어)
- 계좌에 다른 시스템들이 혼합되어 있으므로,
계좌 진고포지션 기준이 아닌 시스템 기준으로 요망
참고로 위의 방식을 사용할 경우
YT의 리버스 신호와 다르게 주문이 진행됩니다.
(예를들어, YT의 신호발생후 Spot에서 5봉이내에 체결이 되었을 경우,
이후에도 YT는 리버스신호가 계속 발생할 수 있으나,
위의 경우 Spot에서는 0.5pt 익절 또는 1pt 손절이 발생할 때까지 YT의 모든 신호가 무시됨)
이상입니다.
그럼 오늘도 즐거운 하루되시기를 바라겠습니다.
감사합니다.
예스스탁
예스스탁 답변
2014-07-17 09:29:06
안녕하세요
예스스탁입니다.
답변이 늦어 죄송합니다.
차트봉을 기준으로 10개봉 이후 발생한 신호만
스팟으로 주문내기 위해서는 차트의 봉수를 지표값으로 받아야 합니다.
스팟에서 봉완성시(function Chart1_OnBarAppended(nData)) 카운트를 해서 사용해도 되지만
중간에 인터넷접속이 종료되어 다시접속하면 다시 0부터 카운트 하므로
아래 지표를 차트에 적용한후 지표값을 받아 처리하는 것이 가장 정확합니다.
plot1(dayindex);
지표의 이름은 #dayindex로 하시고
신호받는 차트에 적용하시기 바랍니다.
차트의 신호에 따라 14시 30분 이전에만 주문하게 시간조건 추가했습니다.
var SK,PreSK
var ST,PreST;
var BarCnt;
var EntryCode,EntryBarCnt,EntryPrice,EntryVol,EntryFillPrc;
var BuyID, SellID, BuyNum, SellNum;
var BPID, SPID, BPNum, SPNum;
var AccurLoss, DayEnd;
//스팟시작
function Main_OnStart()
{
BarCnt = 0;
EntryBarCnt = -1;
EntryStep = 0;
AccurLoss = false;
DayEnd = false;
}
//봉완성 카운트
function Chart1_OnBarAppended(nData)
{
BarCnt = BarCnt+1;
//매수주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == 2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(BuyNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
EntryStep = 0;
}
}
//매도주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == -2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(SellNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
EntryStep = 0;
}
}
}
function Chart1_OnRiseSignal(Signal)
{
//직전 발생 신호의 종류와 시간
PreSK = SK;
PreST = ST;
//현재 발생 신호의 종류와 시간
SK = Signal.signalKind;
ST = Signal.time;
//매수신호 발생하고 매도청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 1 && PreSK == 4 && ST == PreST && AccurLoss == false && DayEnd == false
&& MarketData1.time < 1430000000
&& Chart1.GetIndicatorData("#dayindex",1,0) >= 10)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
BuyID = Account1.OrderBuy(EntryCode,EntryVol,MarketData1.Ask(3),0);
EntryStep = 1
Main.MessageList("매수진입주문",EntryStep);
}
//매도신호 발생하고 매수청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 3 && PreSK == 2 && ST == PreST && AccurLoss == false && DayEnd == false
&& MarketData1.time < 1430000000
&& Chart1.GetIndicatorData("#dayindex",1,0) >= 10)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
SellID = Account1.OrderSell(EntryCode,EntryVol,MarketData1.Bid(3),0);
EntryStep = -1;
Main.MessageList("매도진입주문",EntryStep);
}
}
function Main_OnOrderResponse(OrderResponse)
{
//매수진입 주문응답
if (EntryStep == 1 && BuyID == OrderResponse.orderID )
{
BuyNum = OrderResponse.orderNum;
EntryStep = 2;
Main.MessageList("매수진입주문 응답",EntryStep);
}
//매도진입 주문응답
if (EntryStep == -1 && SellID == OrderResponse.orderID )
{
SellNum = OrderResponse.orderNum;
EntryStep = -2;
Main.MessageList("매도진입주문 응답",EntryStep);
}
//매수 목표수익 주문응답
if (EntryStep == 3 && BPID == OrderResponse.orderID )
{
BPNum = OrderResponse.orderNum;
Main.MessageList("매수목표수익주문 응답",EntryStep);
}
//매도 목표수익 주문응답
if (EntryStep == -3 && SPID == OrderResponse.orderID )
{
SPNum = OrderResponse.orderNum;
Main.MessageList("매목표수익주문 응답",EntryStep);
}
}
function Main_OnNotifyFill(NotifyFill)
{
//매수 진입주문 체결
if (EntryStep == 2 && BuyNum == NotifyFill.orderNum )
{
EntryStep = 3;
EntryFillPrc = NotifyFill.fillPrice;
//신호가격 +0.5로 매도주문
Main.MessageList("매수진입주문 체결",EntryStep);
BPID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice+0.5,0);
Main.MessageList("매수목표수익주문");
}
//매도 진입주문 체결
if (EntryStep == -2 && SellNum == NotifyFill.orderNum )
{
EntryStep = -3;
EntryFillPrc = NotifyFill.fillPrice;
Main.MessageList("매도진입주문 체결",EntryStep);
//신호가격-0.5로 매수주
SPID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice-0.5,0);
Main.MessageList("매도목표수익주문");
}
//매수 목표수익 체결
if (EntryStep == 3 && BPNum == NotifyFill.orderNum )
{
EntryStep = 0;
Main.MessageList("매수목표수익주문 체결",EntryStep);
}
//매도 목표수익 체결
if (EntryStep == -3 && SPNum == NotifyFill.orderNum )
{
EntryStep = 0
Main.MessageList("매목표수익주문 체결",EntryStep);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
if (MarketData1.code == sItemCode && lUp*dateID == 20001) //*제거
{
if (EntryStep == 3 && MarketData1.current <= EntryFillPrc-1 && MarketData1.time < 1430000000)
{
//기존 매수목표수익 주문 취소
Account1.SetUnfillOrderNumber(BPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(BPNum);
}
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
AccurLoss = true;
}
if (EntryStep == -3 && MarketData1.current >= EntryFillPrc+1 && MarketData1.time < 1430000000)
{
//기존 매도목표수익 주문 취소
Account1.SetUnfillOrderNumber(SPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(SPNum);
}
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
AccurLoss = true;
}
//시간청산
if (MarketData1.time >= 1430000000 && AccurLoss == false && DayEnd == false)
{
DayEnd = true;
if (EntryStep == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
}
if (EntryStep == -3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
}
}
}
}
즐거운 하루되세요
> 새로운세상 님이 쓴 글입니다.
> 제목 : Re : Re : 진입체결 확인 즉시 청산주문
> 안녕하세요~
우선 복잡한 수식 작성해주신데 대하여 감사드립니다.
제가 내용중 빠트린 부분이 있습니다.
죄송합니다.
다른 내용은 동일하므로 누락된 부분만 말씀드리겠습니다.
------------------------
1) YT의 수식에는 dayindex >= 0 입니다.
2) Spot에서는 YT봉기준으로 10개봉이 경과한 후부터 진입을 원합니다.
3) YT의 첫신호는 10개봉 이전에 발생할 수도 있고, 10개봉 이후에 발생할 수도 있습니다.
4) 데이트레이딩이므로 YT의 첫신호는 Buy 또는 Sell로 시작하고, 이후 리버스 신호입니다.
5) YT의 당일종료청산은 14:40 으로 설정되어 있습니다.
현재 Spot에서 14:30 당일종료를 원하므로, 14:30 이후에는 Spot에서 진입하지 않습니다.
이상입니다.
그럼 즐거운 주말되시기 바랍니다.
감사합니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 진입체결 확인 즉시 청산주문
> 안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
계좌객체 --> Account1
종목객체 --> MarketData1, 차트와 같은 종목
차트객체 --> Chart1
Up*date 영문업데이트에 *제거하시기 바랍니다.
var SK,PreSK
var ST,PreST;
var BarCnt;
var EntryCode,EntryBarCnt,EntryPrice,EntryVol,EntryFillPrc;
var BuyID, SellID, BuyNum, SellNum;
var BPID, SPID, BPNum, SPNum;
var AccurLoss, DayEnd;
//스팟시작
function Main_OnStart()
{
BarCnt = 0;
EntryBarCnt = -1;
EntryStep = 0;
AccurLoss = false;
DayEnd = false;
Main.MessageList("진입스텝",EntryStep);
}
//봉완성 카운트
function Chart1_OnBarAppended(nData)
{
BarCnt = BarCnt+1;
//매수주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == 2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(BuyNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
EntryStep = 0;
}
}
//매도주문 후 미체결 상태에서 5봉 완성되면 취소주문 후 EntryStep은 0으로 초기화
if (EntryStep == -2 && BarCnt == EntryBarCnt+5 )
{
Account1.SetUnfillOrderNumber(SellNum)
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
EntryStep = 0;
}
}
}
function Chart1_OnRiseSignal(Signal)
{
//직전 발생 신호의 종류와 시간
PreSK = SK;
PreST = ST;
//현재 발생 신호의 종류와 시간
SK = Signal.signalKind;
ST = Signal.time;
//매수신호 발생하고 매도청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 1 && PreSK == 4 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
BuyID = Account1.OrderBuy(EntryCode,EntryVol,MarketData1.Ask(3),0);
EntryStep = 1
Main.MessageList("매수진입주문",EntryStep);
}
//매도신호 발생하고 매수청산신호와 시간이 같음(리버스)
if (EntryStep == 0 && SK == 3 && PreSK == 2 && ST == PreST && AccurLoss == false && DayEnd == false)
{
//봉카운트,주문종목코드,신호가격, 신호수량 저장
EntryBarCnt = BarCnt;
EntryCode = Main.GetOrderCode(MarketData1.code);
EntryPrice = Signal.price;
EntryVol = Signal.count;
SellID = Account1.OrderSell(EntryCode,EntryVol,MarketData1.Bid(3),0);
EntryStep = -1;
Main.MessageList("매도진입주문",EntryStep);
}
}
function Main_OnOrderResponse(OrderResponse)
{
//매수진입 주문응답
if (EntryStep == 1 && BuyID == OrderResponse.orderID )
{
BuyNum = OrderResponse.orderNum;
EntryStep = 2;
Main.MessageList("매수진입주문 응답",EntryStep);
}
//매도진입 주문응답
if (EntryStep == -1 && SellID == OrderResponse.orderID )
{
SellNum = OrderResponse.orderNum;
EntryStep = -2;
Main.MessageList("매도진입주문 응답",EntryStep);
}
//매수 목표수익 주문응답
if (EntryStep == 3 && BPID == OrderResponse.orderID )
{
BPNum = OrderResponse.orderNum;
Main.MessageList("매수목표수익주문 응답",EntryStep);
}
//매도 목표수익 주문응답
if (EntryStep == -3 && SPID == OrderResponse.orderID )
{
SPNum = OrderResponse.orderNum;
Main.MessageList("매목표수익주문 응답",EntryStep);
}
}
function Main_OnNotifyFill(NotifyFill)
{
//매수 진입주문 체결
if (EntryStep == 2 && BuyNum == NotifyFill.orderNum )
{
EntryStep = 3;
EntryFillPrc = NotifyFill.fillPrice;
//신호가격 +0.5로 매도주문
Main.MessageList("매수진입주문 체결",EntryStep);
BPID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice+0.5,0);
Main.MessageList("매수목표수익주문");
}
//매도 진입주문 체결
if (EntryStep == -2 && SellNum == NotifyFill.orderNum )
{
EntryStep = -3;
EntryFillPrc = NotifyFill.fillPrice;
Main.MessageList("매도진입주문 체결",EntryStep);
//신호가격-0.5로 매수주
SPID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), EntryVol,EntryPrice-0.5,0);
Main.MessageList("매도목표수익주문");
}
//매수 목표수익 체결
if (EntryStep == 3 && BPNum == NotifyFill.orderNum )
{
EntryStep = 0;
Main.MessageList("매수목표수익주문 체결",EntryStep);
}
//매도 목표수익 체결
if (EntryStep == -3 && SPNum == NotifyFill.orderNum )
{
EntryStep = 0
Main.MessageList("매목표수익주문 체결",EntryStep);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
if (MarketData1.code == sItemCode && lUp*dateID == 20001) //*제거
{
if (EntryStep == 3 && MarketData1.current <= EntryFillPrc-1)//*제거
{
//기존 매수목표수익 주문 취소
Account1.SetUnfillOrderNumber(BPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(BPNum);
}
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
AccurLoss = true;
}
if (EntryStep == -3 && MarketData1.current >= EntryFillPrc+1)
{
//기존 매도목표수익 주문 취소
Account1.SetUnfillOrderNumber(SPNum);
if (Account1.Unfill.count > 1)
{
Account1.OrderCancel(SPNum);
}
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
AccurLoss = true;
}
//시간청산
if (MarketData1.time >= 1430000000 && AccurLoss == false && DayEnd == false)
{
DayEnd = true;
if (EntryStep == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), EntryVol,MarketData1.Bid(5),0);
EntryStep = 0;
}
if (EntryStep == -3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(5),0);
EntryStep = 0;
}
}
}
}
즐거운 하루되세요
> 새로운세상 님이 쓴 글입니다.
> 제목 : 진입체결 확인 즉시 청산주문
> 안녕하세요.
다음 수식 부탁드립니다.
연결선물 분봉, YT 리버스신호에 의한 YesSpot주문, 데이트레이딩
--------------------------
1) 장개시후 YT에서 조건 충족시 신호 발생 (리버스 신호)
2) YesSpot에서 YT신호 발생 종가로 주문
- YT신호가 발생한 후 5봉이 경과하기 전에 체결이 안되면 주문 취소
- 5봉 경과전 새로운 YT신호는 모두 무시
3) YT기준 5봉이내 2)의 주문 체결시
- 체결확인 즉시, Spot에서
매수진입신호발생 종가 +0.50 매수청산주문
매도진입신호발생 종가 -0.50 매도청산주문
(YT의 Atlimit의 주문방식이 아니고, 종가 + - 0.50 주문대기 방식임)
- 주문체결시, Spot에서 3) 4)에 의한 청산이 발생하기 전까지
YT의 새로운 신호는 모두 무시
- 3) 4)에 의한 청산이후, YT의 새로운 리버스 신호발생하면 Spot 진입
4) 실제 진입체결가 기준으로 1pt 손절 ---> YT와 진입기준이 다르므로 Spot으로 제어
- Atstop 개념
- 손절 발생시 당일 추가적인 매매 없음 (Spot으로 제어)
5) 14:30 포지션 청산 (Spot으로 제어)
- 계좌에 다른 시스템들이 혼합되어 있으므로,
계좌 진고포지션 기준이 아닌 시스템 기준으로 요망
참고로 위의 방식을 사용할 경우
YT의 리버스 신호와 다르게 주문이 진행됩니다.
(예를들어, YT의 신호발생후 Spot에서 5봉이내에 체결이 되었을 경우,
이후에도 YT는 리버스신호가 계속 발생할 수 있으나,
위의 경우 Spot에서는 0.5pt 익절 또는 1pt 손절이 발생할 때까지 YT의 모든 신호가 무시됨)
이상입니다.
그럼 오늘도 즐거운 하루되시기를 바라겠습니다.
감사합니다.