커뮤니티

83515 답변 주신 것에 추가 문의. 진입, 청산 조건 질문입니다.

프로필 이미지
예스쟁이
2023-08-30 22:06:13
811
글번호 172000
답변완료

첨부 이미지

도움을 주신것에 항상 감사드립니다. 첨부된 이미지에서 각각의 빨강, 검정, 파랑 구간에서 매매 진입하는 코드를 지난번에 알려주셨는데요. 코드는 아래와 같습니다. ======================================================= input : ntime(100000), xtime(230000); var : Tcond(False), oo(0), k(0), j(0); array : flag[3](0); array : up[2](0), middle[2](0), down[2](0); array : up_TL[2](0), middle_TL[2](0), down_TL[2](0); array : up_cnt[2](0), middle_cnt[2](0), down_cnt[2](0); array : up_text[2](0), middle_text[2](0), down_text[2](0); // 중간 수식 생략... var : t(0); if (sdate != sdate[1] and stime >= ntime) or (sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then { T = 0; } if Tcond == true Then { if T == 0 Then { if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then T = 1; if middle_cnt[1] >= 6 or middle_cnt[2] >= 6 Then T = 2; if down_cnt[1] >= 6 or down_cnt[2] >= 6 Then T = 3; } if T == 1 Then { if MarketPosition <= 0 and CrossUp(C,up[2]) Then Buy("b1"); if MarketPosition >= 0 and CrossDown(C,up[1]) Then Sell("s1"); if MarketPosition == 1 Then ExitLong("Bp1",AtLimit,up[2]+(up[2]-up[1])*3); if MarketPosition == -1 Then ExitShort("sp1",AtLimit,up[1]-(up[2]-up[1])*3); } if T == 2 Then { if MarketPosition <= 0 and CrossUp(C,middle[2]) Then Buy("b2"); if MarketPosition >= 0 and CrossDown(C,middle[1]) Then Sell("s2"); if MarketPosition == 1 Then ExitLong("Bp2",AtLimit,middle[2]+(middle[2]-middle[1])*3); if MarketPosition == -1 Then ExitShort("sp2",AtLimit,middle[1]-(middle[2]-middle[1])*3); } if T == 3 Then { if MarketPosition <= 0 and CrossUp(C,down[2]) Then Buy("b3"); if MarketPosition >= 0 and CrossDown(C,down[1]) Then Sell("s3"); if MarketPosition == 1 Then ExitLong("Bp3",AtLimit,down[2]+(down[2]-down[1])*3); if MarketPosition == -1 Then ExitShort("sp3",AtLimit,down[1]-(down[2]-down[1])*3); } } ========================================================================= T = 1,2,3 중에서 먼저 6번 이상 터치한 곳에서 진입을 시작하는데요. 진입한 이후에 손절될 경우 다시 가격을 터치하면 재진입을 하는데, 그때마다 손실 금액에 따라 진입 수량을 변형하는 수식을 짜고 싶습니다. 예를 들면) 현재는 빨강 박스에서 먼저 6번 이상 터치되면 빨간선 상단 터치시 매수 빨간선 하단 터치시 매수 청산 후 매도. 다시 빨간선 상단 터치시 매도 청산 후 매수.... 이런식으로 반복하다가 빨간선 상단과 하단 폭의 3배 구간에서 익절로 거래가 마무리 되는 수식인데요. 이것을 빨간선 상단 , 하단 폭이 10틱이면(익절은 30틱이됨) 빨간선 상단 터치시 매수 진입 1계약 (이후에 만약 익절되면 거래종료) 빨간선 하단 터치시 매수 청산 후 매도 1계약.(누적손실 : -10틱)(이후에 만약 익절되면 거래종료) 빨간선 상단 터치시 매도 청산 후 매수 1계약.(누적손실 : -20틱)(이후에 만약 익절되면 거래종료) 빨간선 하단 터치시 매수 청산 후 매도는 2계약.(누적손실 : -30틱)(이후에 만약 익절되면 거래종료) 빨간선 상단 터치시 매도 청산 후 매수 2계약.(누적손실 : -50틱)(이후에 만약 익절되면 거래종료) ......... 위와 같이 빨간 박스 구간 안에서 생긴 누적된 손실을 익절 한번으로 수익 청산하고 거래 종료하는 수식을 작성하고 싶습니다. 거래시마다 수수료 포함하여 누적되는 손실을 체크해 단 한번의 익절로 수익으로 거래가 마감되도록 수량을 조절하는 수식입니다. 제 머리로는 어떻게 해야할지 감이 안오네요ㅠ 부탁드립니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2023-08-31 14:52:19

안녕하세요 예스스탁입니다. 아래 내용 참고하시기 바랍니다. 당일수익을 계산해서 손실일때 손실값을 목표수익값으로 나누어 배수로 수량계산하시면 됩니다. 해당 부분 일괄 처리해야 함으로 라인마다 진입과 청산을 별도로 지정한 것을 하나로 처리되게 변경했습니다. 수수료와 슬리피지는 설정창에서 지정하시면 됩니다. 설정창에서 지정하면 랭귀지 손익함수에서 자동으로 반영됩니다. input : ntime(100000), xtime(230000); var : Tcond(False), oo(0), k(0), j(0); array : flag[3](0); array : up[2](0), middle[2](0), down[2](0); array : up_TL[2](0), middle_TL[2](0), down_TL[2](0); array : up_cnt[2](0), middle_cnt[2](0), down_cnt[2](0); array : up_text[2](0), middle_text[2](0), down_text[2](0); var : 상단(0),하단(0),n1(0),daypl(0),vol(0),xcond(False); // 중간 수식 생략... var : t(0); if (sdate != sdate[1] and stime >= ntime) or (sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then { T = 0; n1 = NetProfit; xcond = False; } if TotalTrades > TotalTrades[1] and (IsExitName("Bp",1) or IsExitName("sp",1)) Then xcond = true; if Tcond == true and xcond == False Then { if T == 0 Then { if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then { T = 1; 상단 = up[2]; 하단 = up[1]; } if middle_cnt[1] >= 6 or middle_cnt[2] >= 6 Then { T = 2; 상단 = middle[2]; 하단 = middle[1]; } if down_cnt[1] >= 6 or down_cnt[2] >= 6 Then { T = 3; 상단 = down[2]; 하단 = down[1]; } } if T != 0 Then { dayPL = (NetProfit-n1)+PositionProfit(0); if daypl >= 0 Then vol = 1; Else vol = max(Ceiling(abs(daypl)/((상단-하단)*3)),1); if MarketPosition <= 0 and CrossUp(C,상단) Then Buy("b1",OnClose,Def,vol); if MarketPosition >= 0 and CrossDown(C,하단) Then Sell("s1",OnClose,Def,vol); if MarketPosition == 1 Then ExitLong("Bp",AtLimit,상단+(상단-하단)*3); if MarketPosition == -1 Then ExitShort("sp",AtLimit,하단-(상단-하단)*3); } } 즐거운 하루되세요 > 예스쟁이 님이 쓴 글입니다. > 제목 : 83515 답변 주신 것에 추가 문의. 진입, 청산 조건 질문입니다. > 도움을 주신것에 항상 감사드립니다. 첨부된 이미지에서 각각의 빨강, 검정, 파랑 구간에서 매매 진입하는 코드를 지난번에 알려주셨는데요. 코드는 아래와 같습니다. ======================================================= input : ntime(100000), xtime(230000); var : Tcond(False), oo(0), k(0), j(0); array : flag[3](0); array : up[2](0), middle[2](0), down[2](0); array : up_TL[2](0), middle_TL[2](0), down_TL[2](0); array : up_cnt[2](0), middle_cnt[2](0), down_cnt[2](0); array : up_text[2](0), middle_text[2](0), down_text[2](0); // 중간 수식 생략... var : t(0); if (sdate != sdate[1] and stime >= ntime) or (sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then { T = 0; } if Tcond == true Then { if T == 0 Then { if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then T = 1; if middle_cnt[1] >= 6 or middle_cnt[2] >= 6 Then T = 2; if down_cnt[1] >= 6 or down_cnt[2] >= 6 Then T = 3; } if T == 1 Then { if MarketPosition <= 0 and CrossUp(C,up[2]) Then Buy("b1"); if MarketPosition >= 0 and CrossDown(C,up[1]) Then Sell("s1"); if MarketPosition == 1 Then ExitLong("Bp1",AtLimit,up[2]+(up[2]-up[1])*3); if MarketPosition == -1 Then ExitShort("sp1",AtLimit,up[1]-(up[2]-up[1])*3); } if T == 2 Then { if MarketPosition <= 0 and CrossUp(C,middle[2]) Then Buy("b2"); if MarketPosition >= 0 and CrossDown(C,middle[1]) Then Sell("s2"); if MarketPosition == 1 Then ExitLong("Bp2",AtLimit,middle[2]+(middle[2]-middle[1])*3); if MarketPosition == -1 Then ExitShort("sp2",AtLimit,middle[1]-(middle[2]-middle[1])*3); } if T == 3 Then { if MarketPosition <= 0 and CrossUp(C,down[2]) Then Buy("b3"); if MarketPosition >= 0 and CrossDown(C,down[1]) Then Sell("s3"); if MarketPosition == 1 Then ExitLong("Bp3",AtLimit,down[2]+(down[2]-down[1])*3); if MarketPosition == -1 Then ExitShort("sp3",AtLimit,down[1]-(down[2]-down[1])*3); } } ========================================================================= T = 1,2,3 중에서 먼저 6번 이상 터치한 곳에서 진입을 시작하는데요. 진입한 이후에 손절될 경우 다시 가격을 터치하면 재진입을 하는데, 그때마다 손실 금액에 따라 진입 수량을 변형하는 수식을 짜고 싶습니다. 예를 들면) 현재는 빨강 박스에서 먼저 6번 이상 터치되면 빨간선 상단 터치시 매수 빨간선 하단 터치시 매수 청산 후 매도. 다시 빨간선 상단 터치시 매도 청산 후 매수.... 이런식으로 반복하다가 빨간선 상단과 하단 폭의 3배 구간에서 익절로 거래가 마무리 되는 수식인데요. 이것을 빨간선 상단 , 하단 폭이 10틱이면(익절은 30틱이됨) 빨간선 상단 터치시 매수 진입 1계약 (이후에 만약 익절되면 거래종료) 빨간선 하단 터치시 매수 청산 후 매도 1계약.(누적손실 : -10틱)(이후에 만약 익절되면 거래종료) 빨간선 상단 터치시 매도 청산 후 매수 1계약.(누적손실 : -20틱)(이후에 만약 익절되면 거래종료) 빨간선 하단 터치시 매수 청산 후 매도는 2계약.(누적손실 : -30틱)(이후에 만약 익절되면 거래종료) 빨간선 상단 터치시 매도 청산 후 매수 2계약.(누적손실 : -50틱)(이후에 만약 익절되면 거래종료) ......... 위와 같이 빨간 박스 구간 안에서 생긴 누적된 손실을 익절 한번으로 수익 청산하고 거래 종료하는 수식을 작성하고 싶습니다. 거래시마다 수수료 포함하여 누적되는 손실을 체크해 단 한번의 익절로 수익으로 거래가 마감되도록 수량을 조절하는 수식입니다. 제 머리로는 어떻게 해야할지 감이 안오네요ㅠ 부탁드립니다.