예스스탁
예스스탁 답변
2017-07-28 16:49:45
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
1.
var T,daycount,YYYYMMDD,HH,LL;
var BEID,SEID,BENUM,SENUM;
//스팟시작시
function Main_OnStart()
{
T = 0;
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();//오늘날짜
//오늘날짜를 당일진입횟수를 저장하는 변수로 이용
//내부변수에서 변수(오늘날짜)에 저장된 값을 불러와
//값이 없으면 daycount에 0, 있으면 해당 값을 저장
if (Main.GetUserValue(YYYYMMDD) == "")
daycount = 0;
else
daycount = Main.GetUserValue(YYYYMMDD);
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호가 발생하고 당일 진입횟수가 3회이내일때
if (Signal.signalKind == 1 && daycount < 3)
{
T = 1;
BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
//매수청산 신호 발생하면 1번 타이머 종료
Main.KillTimer(1);
}
if (Signal.signalKind == 3 && daycount < 3)
{
T = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
//매도청산 신호 발생하면 2번 타이머 종료
Main.KillTimer(2);
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//매수진입주문 주문번호 저장
if (OrderResponse.orderID == BEID)
{
BENUM = OrderResponse.orderNum;
}
//매도진입주문 주문번호 저장
if (OrderResponse.orderID == SEID)
{
SENUM = OrderResponse.orderNum;
}
}
//체결응답수신
function Main_OnNotifyFill(NotifyFill)
{
//매수진입주문 체결
if (NotifyFill.orderNum == BENUM)
{
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0);
//체결이후 최고가 저장변수의 초기값은 평단가
HH = Account1.Balance.avgUnitCost;
//1초 타이머 셋팅(타이머 이이디는 1)
Main.SetTimer(1, 1000);
}
//매도진입주문 체결
if (NotifyFill.orderNum == SENUM)
{
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0);
//체결이후 최저가 저장변수의 초기값은 평단가
LL = Account1.Balance.avgUnitCost;
//타이머 셋팅(타이머 아이디는 2)
Main.SetTimer(1, 1000);
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작
if (nEventID == 1)
{
//최고가 갱신
if ( MarketData1.current > HH)
{
HH = MarketData1.current;
}
//잔고가 매수포지션이고 수량이 있을떄만
if (Account1.Balance.position == 2 && Account1.Balance.count > 0)
{
//현재가가 잔고평단가 대비 +2.5 이상이면 청산
if (MarketData1.current >= Account1.Balance.avgUnitCost + 2.5)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0);
Main.KillTimer(1);
}
//현재가가 잔고평단가 대비 -0.8 이하이면 청산
if (MarketData1.current <= Account1.Balance.avgUnitCost - 0.8)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0);
Main.KillTimer(1);
}
//진입이후 최고가가 잔고평단가대비 +1.5 이상이고 현재가가 최고가 대비 0.5 이상 하락했으면 청산
if (HH >= Account1.Balance.avgUnitCost + 1.5 && MarketData1.current <= HH - 0.5)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0);
Main.KillTimer(1);
}
}
}
//2번 타이머 동작
if (nEventID == 1)
{
//최저가 갱신
if ( MarketData1.current < LL)
{
LL = MarketData1.current;
}
//잔고가 매도포지션이고 수량이 있을떄만
if (Account1.Balance.position == 1 && Account1.Balance.count > 0)
{
//현재가가 잔고평단가 대비 -2.5 이하이면 청산
if (MarketData1.current <= Account1.Balance.avgUnitCost - 2.5)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0);
Main.KillTimer(2);
}
//현재가가 잔고평단가 대비 +0.8 이상이면 청산
if (MarketData1.current >= Account1.Balance.avgUnitCost + 0.8)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0);
Main.KillTimer(2);
}
//진입이후 최저가가 잔고평단가대비 -1.5 이하이고 현재가가 최저가 대비 0.5 이상 상승했으면 청산
if (LL <= Account1.Balance.avgUnitCost - 1.5 && MarketData1.current >= LL + 0.5)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0);
Main.KillTimer(2);
}
}
}
}
2
//------------------------------------------------------------------------------------------------------
var T;
var Entry;
var BPrice;
var Bars = 0,Bong;
function Main_OnStart()
{
Main.MessageList("시작");
T = 0;
Entry = false;
BPrice = 0;
bars = 0;
}
function Chart1_OnBarAppended(nData)
{
if( nData == 1)
{
Bars = Bars+1;
}
}
function Chart1_OnRiseSignal(Signal)
{
if(Signal.signalKind == 1 && T == 0 && Entry == false)
{
T = 1;
BPrice = Math.round(MarketData1.current*100)/100;
Bong = bars;
Main.MessageList("매수신호 발생");
Main.SetTimer(1,500);
}
if(Signal.signalKind == 2 && T == 1)
{
Main.KillTimer(1);
T = 0;
Main.MessageList("진입조건 미발생", "매도신호로 리셋");
if(Entry == true)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Bid(5), 0);
Main.MessageList("선물매수청산");
T = 0;
Entry = false;
}
}
}
function Main_OnTimer(nEventID)
{
if(nEventID == 1 && MarketData1.current <= BPrice - 0.15 && Bars < Bong+3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Ask(5), 0);
Main.MessageList("선물매수진입");
Entry = true;
Main.KillTimer(1);
}
}
//---------------------------------------------------------------------------------------------------------
즐거운 하루되세요
> 탄젠트80 님이 쓴 글입니다.
> 제목 : 스팟수식 작성 문의
> 안녕하세요~ 답변 늘 감사히 사용하고 있습니다.
워낙 코딩실력이 부족하다 보니 게시판 보면서 하나하나 해보고 있는데 잘되지 않아 문의드립니다.
바쁘시더라도 답변 꼭 부탁드립니다.
문의사항은 두개입니다.
질문1)
아래수식은 예트에서 선물신호 받아서 선물거래하는 당일 거래횟수 제한 수식인데요
여기에 다음과 같은 내용을 포함하고 싶습니다.
ㅁ진입 후 2.5P 이익시 익절
ㅁ진입 후 0.8P 손실시 손절
ㅁ진입 후 1.5P 이상 최대수익에서 0.5P 이상 수익반납시 청산(최대수익대비 하락청산)
//-------------------------------------------------------------------------------------
var T,daycount,YYYYMMDD;
//스팟시작시
function Main_OnStart()
{
T = 0;
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();//오늘날짜
//오늘날짜를 당일진입횟수를 저장하는 변수로 이용
//내부변수에서 변수(오늘날짜)에 저장된 값을 불러와
//값이 없으면 daycount에 0, 있으면 해당 값을 저장
if (Main.GetUserValue(YYYYMMDD) == "")
daycount = 0;
else
daycount = Main.GetUserValue(YYYYMMDD);
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호가 발생하고 당일 진입횟수가 3회이내일때
if (Signal.signalKind == 1 && daycount < 3)
{
T = 1;
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
}
if (Signal.signalKind == 3 && daycount < 3)
{
T = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
}
}
//------------------------------------------------------------------------------------------------
질문2)
아래 수식에서 다음 부분을 추가해 주시면 감사하겠습니다.
if(nEventID == 1 && MarketData1.current <= BPrice - 0.15) 에서
현재 : 예트 진입신호 발생시 MarketData1.code의 가격에서 0.15P 낮을때 진입
변경 : 예트 진입신호 발생시 MarketData1.code가 3봉 이내이면서 0.15P 낮을때 진입
예스랭귀지의 "BarsSinceEntry <= 3 and"표현하고 싶은데 안되서 그렇습니다.
//------------------------------------------------------------------------------------------------------
var T;
var Entry;
var BPrice;
function Main_OnStart()
{
Main.MessageList("시작");
T = 0;
Entry = false;
BPrice = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if(Signal.signalKind == 1 && T == 0 && Entry == false)
{
T = 1;
BPrice = Math.round(MarketData1.current*100)/100;
Main.MessageList("매수신호 발생");
Main.SetTimer(1,500);
}
if(Signal.signalKind == 2 && T == 1)
{
Main.KillTimer(1);
T = 0;
Main.MessageList("진입조건 미발생", "매도신호로 리셋");
if(Entry == true)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Bid(5), 0);
Main.MessageList("선물매수청산");
T = 0;
Entry = false;
}
}
}
function Main_OnTimer(nEventID)
{
if(nEventID == 1 && MarketData1.current <= BPrice - 0.15)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Ask(5), 0);
Main.MessageList("선물매수진입");
Entry = true;
Main.KillTimer(1);
}
}
//---------------------------------------------------------------------------------------------------------
답변에 대해 미리 진심으로 감사드립니다.