커뮤니티

수식문의드립니다

프로필 이미지
jshwang2
2022-02-20 22:36:52
1183
글번호 156479
답변완료
안녕하세요~ 현재 사용중인 수식에서 시스템이 실행된 시점부터 이 시스템 내에서 수익, 손실을 모두 합쳐 시스템의 총 손익이 제가 설정한 목표수익 이상이면 거래종료시키고 싶습니다 예를들어 목표수익이 50만원인 상황에서 시스템이 -20, -20, -20, +120 수익으로 진입청산 되었다면 4번째 거래 청산시 총 손익이 +60으로 50만원을 넘었을 때 거래종료시키고자 합니다 총손익을 계산해주는 수식은 따로 없는것 같고 거래가 끝나 청산되었을때의 진입, 청산의 틱수를 통해 계산해야할것 같은데 피라미딩까지 되어있다보니 어떻게 계산해야할지 막막하네요 아래 시스템에서 어떻게 구현해야할지 가능하다면 가르쳐주시면 감사하겠습니다! 감사합니다 ----------------- input : TT(25400), TD(20220219), MDD(200000), goalBalance(500000) ; var : HB(14064.75), LB(13939), Hx(20000), Lx(1); var : netBalance(0), e60(0), Hcount(0), Lcount(0),B(0),S(0),cnt(0),T1(0), Hstate(true), Lstate(true), N(0), unitP(0), exitC(0), rHB(0), rLB(0); => 목표수익을 goalbalance, 총손익을 netbalance라 정의 N = Highest(ATr(14), 100); unitP = floor(MDD/(N*5*4*600)); exitC = (2-(MaxEntries-1)/2)*N; e60 = Ema(C,60); netbalance = ???? if netbalance >= goalbalance then { Hstate = false; Lstate = false; } => netbalance를 계산해 goalbalance 이상이 되면, Hstate, Lstate를 false로 바꿔 거래 정지 if Condition1 == False and sDate >= TD and sTime >= TT Then { Condition1 = true; Hcount = 0; Lcount = 0; T1 = TotalTrades; } if Condition1 == true Then { B = 0; S = 0; if TotalTrades-T1 > 0 Then { For cnt = 1 to TotalTrades-T1 { if MarketPosition(cnt) == 1 Then B = B+1; if MarketPosition(cnt) == -1 Then S = S+1; } } Hcount = B + IFf(MarketPosition == 1,1,0); Lcount = S + IFf(MarketPosition == -1,1,0); if B>0 && B == Hcount then HB = rHB; if S>0 && S == Lcount then LB = rLB; if MarketPosition <= 0 and Hstate == true then { Buy("b1",AtStop,HB,unitP); Buy("b2",AtStop,HB+0.5*N,unitP); Buy("b3",AtStop,HB+N,unitP); Buy("b4",AtStop,HB+1.5*N,unitP); } if MarketPosition >= 0 and Lstate == true then { Sell("s1",AtStop,LB,unitP); Sell("s2",AtStop,LB-0.5*N,unitP); Sell("s3",AtStop,LB-N,unitP); Sell("s4",AtStop,LB-1.5*N,unitP); } if marketposition ==1 Then { rHB = Highest(H, BarsSinceEntry+1) ; if rHB < HB+0.5*N Then Buy("b2.",AtStop,HB+0.5*N,unitP); if rHB < HB+N Then Buy("b3.",AtStop,HB+N,unitP); if rHB < HB+1.5*N Then Buy("b4.",AtStop,HB+1.5*N,unitP); if e60 < HB+2*N Then Exitlong("exitB1", atstop, HB-exitC); if e60 >= HB+2*N and CrossDown(close, e60) Then { ExitLong("exitB2") ; Hstate = false ; } Exitlong("exitB3", AtLimit, Hx); } if marketposition == -1 Then { rLB = Lowest(L, BarsSinceEntry+1); if rLB > LB-0.5*N Then Sell("s2.",AtStop,LB-0.5*N,unitP); if rLB > LB-N Then Sell("s3.",AtStop,LB-N,unitP); if rLB > LB-1.5*N Then Sell("s4.",AtStop,LB-1.5*N,unitP); if e60 > LB-2*N Then ExitShort("exitS1", atstop, LB+exitC); if e60 <= LB-2*N and CrossUp(close, e60) Then { ExitShort("exitS2"); Lstate = false ; } exitshort("exitS3", AtLimit, Lx); } if Hcount >= 3 Then Hstate = False; if Lcount >= 3 Then Lstate = False; if H >= Hx then Hstate = false; if L <= Lx then Lstate = false; }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2022-02-21 15:47:49

안녕하세요 예스스탁입니다. 1 시스템의 총손익은 netprofit으로 리턴받으실수 있습니다. 피라미딩일 경우에도 각 진입별로 손익 계산되어 제공되는 함수입니다. 실제 자동매매적용 이후만 파악해서 손익을 계산할수는 없습니다. netbalance = NetProfit; if netbalance >= goalbalance then { Hstate = false; Lstate = false; } 2 적용하시는 종목이 국내 혹은 해외선물이면 총손익이 포인트로 리턴됩니다. 시스템은 별도로 원화로 환산해서 리턴되는 값이 없습니다. 원화로 환산하고자 하시면 아래와 같이 총손익에 1포인트당 금액인 BigPointValue를 곱해서 계산하셔야 합니다. netbalance = NetProfit*BigPointValue; 해외선물은 원화로 환산이 불가능합니다. BigPointValue가 해당종목의 포인트당 금액으로 리턴되는데 CME종목의 경우 달러, 유렉스의 경우 유로화등 거래소별 통화로 리턴됩니다. 즐거운 하루되세요 > jshwang2 님이 쓴 글입니다. > 제목 : 수식문의드립니다 > 안녕하세요~ 현재 사용중인 수식에서 시스템이 실행된 시점부터 이 시스템 내에서 수익, 손실을 모두 합쳐 시스템의 총 손익이 제가 설정한 목표수익 이상이면 거래종료시키고 싶습니다 예를들어 목표수익이 50만원인 상황에서 시스템이 -20, -20, -20, +120 수익으로 진입청산 되었다면 4번째 거래 청산시 총 손익이 +60으로 50만원을 넘었을 때 거래종료시키고자 합니다 총손익을 계산해주는 수식은 따로 없는것 같고 거래가 끝나 청산되었을때의 진입, 청산의 틱수를 통해 계산해야할것 같은데 피라미딩까지 되어있다보니 어떻게 계산해야할지 막막하네요 아래 시스템에서 어떻게 구현해야할지 가능하다면 가르쳐주시면 감사하겠습니다! 감사합니다 ----------------- input : TT(25400), TD(20220219), MDD(200000), goalBalance(500000) ; var : HB(14064.75), LB(13939), Hx(20000), Lx(1); var : netBalance(0), e60(0), Hcount(0), Lcount(0),B(0),S(0),cnt(0),T1(0), Hstate(true), Lstate(true), N(0), unitP(0), exitC(0), rHB(0), rLB(0); => 목표수익을 goalbalance, 총손익을 netbalance라 정의 N = Highest(ATr(14), 100); unitP = floor(MDD/(N*5*4*600)); exitC = (2-(MaxEntries-1)/2)*N; e60 = Ema(C,60); netbalance = ???? if netbalance >= goalbalance then { Hstate = false; Lstate = false; } => netbalance를 계산해 goalbalance 이상이 되면, Hstate, Lstate를 false로 바꿔 거래 정지 if Condition1 == False and sDate >= TD and sTime >= TT Then { Condition1 = true; Hcount = 0; Lcount = 0; T1 = TotalTrades; } if Condition1 == true Then { B = 0; S = 0; if TotalTrades-T1 > 0 Then { For cnt = 1 to TotalTrades-T1 { if MarketPosition(cnt) == 1 Then B = B+1; if MarketPosition(cnt) == -1 Then S = S+1; } } Hcount = B + IFf(MarketPosition == 1,1,0); Lcount = S + IFf(MarketPosition == -1,1,0); if B>0 && B == Hcount then HB = rHB; if S>0 && S == Lcount then LB = rLB; if MarketPosition <= 0 and Hstate == true then { Buy("b1",AtStop,HB,unitP); Buy("b2",AtStop,HB+0.5*N,unitP); Buy("b3",AtStop,HB+N,unitP); Buy("b4",AtStop,HB+1.5*N,unitP); } if MarketPosition >= 0 and Lstate == true then { Sell("s1",AtStop,LB,unitP); Sell("s2",AtStop,LB-0.5*N,unitP); Sell("s3",AtStop,LB-N,unitP); Sell("s4",AtStop,LB-1.5*N,unitP); } if marketposition ==1 Then { rHB = Highest(H, BarsSinceEntry+1) ; if rHB < HB+0.5*N Then Buy("b2.",AtStop,HB+0.5*N,unitP); if rHB < HB+N Then Buy("b3.",AtStop,HB+N,unitP); if rHB < HB+1.5*N Then Buy("b4.",AtStop,HB+1.5*N,unitP); if e60 < HB+2*N Then Exitlong("exitB1", atstop, HB-exitC); if e60 >= HB+2*N and CrossDown(close, e60) Then { ExitLong("exitB2") ; Hstate = false ; } Exitlong("exitB3", AtLimit, Hx); } if marketposition == -1 Then { rLB = Lowest(L, BarsSinceEntry+1); if rLB > LB-0.5*N Then Sell("s2.",AtStop,LB-0.5*N,unitP); if rLB > LB-N Then Sell("s3.",AtStop,LB-N,unitP); if rLB > LB-1.5*N Then Sell("s4.",AtStop,LB-1.5*N,unitP); if e60 > LB-2*N Then ExitShort("exitS1", atstop, LB+exitC); if e60 <= LB-2*N and CrossUp(close, e60) Then { ExitShort("exitS2"); Lstate = false ; } exitshort("exitS3", AtLimit, Lx); } if Hcount >= 3 Then Hstate = False; if Lcount >= 3 Then Lstate = False; if H >= Hx then Hstate = false; if L <= Lx then Lstate = false; }