예스스탁
예스스탁 답변
2019-07-08 16:02:55
안녕하세요
예스스탁입니다.
1
잔고에는 진입이후의 최고가나 최저가에 대한 정보가 없습니다.
진입이후의 최고가는 자체 계산을 해야 하는데
올려주신 내용에서는 진입시점을 알수 없습니다.
진입이 차트에서 매수신호 발생한것으로 간주해 작성해 드립니다.
해당식 응용해서 식 완성하시기 바랍니다.
요점은 스팟수식에서 매수진입 할때 변수에 초기값을 할당하고 이후 시세를 받아 최고가를 찾는 내용입니다.
var buy = false;
var HH = 0;
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Signal.code, 10,0,1);
//초기값
HH = Signal.price;
//매수신호 발생하면 true
Buy = true;
}
//매수청산신호 발생하면
if (Signal.signalKind == 1)
{
//false
buy = false;
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//매수신호 발생이후 최고가 계산
if (buy == true && sItemCode == Chart1.GetCode(1) && MarketData1.current > hh && lUp*dateID == 20001)
{
hh = MarketData1.current;
}
Account1.SetBalance(MarketData1.code,0);
if (Account1.Balance.position == 2 )
{
//현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가)
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
}
if (HH >= Account1.Balance.avgUnitCost+MarketData1.GetTickSize(MarketData1.current)*25 &&
MarketData1.current <= HH-MarketData1.GetTickSize(MarketData1.current)*5)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
}
}
}
2
function 매매가 발생하는 이벤트
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//오전10시~오후21시 또는 오후 23시이후 또는 오전 04시 이전
if ((HHMMSS >= 100000 && HHMMSS < 210000) || (HHMMSS >= 230000) || (HHMMSS < 040000) )
{
매매로직
}
}
3
3-1
var buy = false,timecount;
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Signal.code, 10,0,1);
//true
Buy = true;
Main.SetTimer(1, 1800000);//30분 18000초, 1000이 1초
timecount = 0;
Main.SetTimer(2, 3000);//3초, 1000이 1초
}
//매수청산신호 발생하면
if (Signal.signalKind == 1)
{
//false
buy = false;
Main.KillTimer(1);
Main.KillTimer(2);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
timecount = timecount+1;
}
if (nEventID == 2)
{
Account1.SetBalance(MarketData1.code,0);
if (timecount == 0)
{
if (Account1.Balance.position == 2 && timecount == 0 )
{
//현재가가 잔고평단가 대비 +25
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*25) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
buy = false;
Main.KillTimer(1);
Main.KillTimer(2);
}
if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*25) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
buy = false;
Main.KillTimer(1);
Main.KillTimer(2);
}
}
}
if (timecount == 1)
{
if (Account1.Balance.position == 2 && timecount == 0 )
{
//현재가가 잔고평단가 대비 +25
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*20) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
buy = false;
Main.KillTimer(1);
Main.KillTimer(2);
}
if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*10) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
buy = false;
Main.KillTimer(1);
Main.KillTimer(2);
}
}
}
if (timecount == 3)
{
Main.KillTimer(1);
Main.KillTimer(2);
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
buy = false;
}
}
}
3-2
var buy = false,barcount;
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Signal.code, 10,0,1);
//true
Buy = true;
barcount = 0;
Main.SetTimer(1, 3000);
}
//매수청산신호 발생하면
if (Signal.signalKind == 1)
{
//false
buy = false;
}
}
function Chart1_OnBarAppended(nData)
{
if (nData == 1 && Buy == true)
{
barcount = barcount+1;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Account1.SetBalance(MarketData1.code,0);
if (barcount < 20)
{
if (Account1.Balance.position == 2 && timecount == 0 )
{
//현재가가 잔고평단가 대비 +25
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*25) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
Main.KillTimer(1);
buy = false;
}
if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*25) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
Main.KillTimer(1);
buy = false;
}
}
}
if (barcount >= 20 && barcount < 40)
{
if (Account1.Balance.position == 2 && timecount == 0 )
{
//현재가가 잔고평단가 대비 +25
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*20) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
Main.KillTimer(1);
buy = false;
}
if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*10) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
Main.KillTimer(1);
buy = false;
}
}
}
if (barcount == 40)
{
Main.KillTimer(1);
buy = false;
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
}
}
}
즐거운 하루되세요
> 워싱턴 님이 쓴 글입니다.
> 제목 : 수식 작성 부탁드립니다.
> 안녕하세요
많은 도움에 항상 감사드립니다.
아래 예시의 스팟 수식을 부탁드립니다.
1. 아래의 스팟 샘플은 매수 포지션 일때, 익절과 손절 설정입니다.
아래의 조건문에 추가하거나 아니면 새롭게 트레일링 조건을 하나 더 추가하고 싶습니다.
( 예시 : 수익 최고치가 진입가의 + 25틱 이되면 트레일링 발동하여 (최고치에서) -5틱 아래로 내려오면 전량 청산.
예로는 +25틱에서 -5틱 이상 떨어지지 않으면 계속 증가하여 최종 +50틱에서 전량 청산한다.)
// ----------------------------------------------------------
//잔고가 매수포지션이고 매수잔고 수량이 있을떄
if (Account1.Balance.position == 2 )
{
//현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가)
if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) )
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1);
}
}
// ----------------------------------------------------------
2. 스팟에서 매매시간 설정이 가능하다면, 스팟에서 아래와 같이 설정하고 싶습니다.
(1) 거래시간 #1 : 당일 오전 10시 ~ 저녁 9시
#2 : 당일 저녁 11시 ~ 저녁 12시
#3 : 다음날 오전 00시 ~ 오전 4시
( 오전 10시~ 다음날 오전4시 (당일 저녁 9시~11시 제외) )
3. 손절 익절 초기 설정은 손절(25틱)/익절(25틱) 입니다.
(1) 진입후에 30분이 지나도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 30분이 지나도 청산이 되지 않으면 현재가에 청산한다.
(2) 진입후에 20봉이 경과해도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 또 20봉이 경과해도 청산이 되지 않으면 현재가에 청산한다.
감사합니다.