커뮤니티

수정부탁드립니다

프로필 이미지
사이버
2025-11-09 11:30:52
80
글번호 227791
답변완료

수고 많으십니다. 1계약으로 시작해서 수익나면 2계약으로 늘리고 또수익나면 3계으로 늘리고, 4번재 수익나면 다시 1계약으로 돌아오고 5번쨰 수익나면 2계약으로 느릴고 6번쨰 수익나면 3계약으로 늘리고..이렇게 반복하고 손실나면 바로 1계약으로 돌아오고.. 이런 전략을 쓰려고 하는데 코딩에 오류가 많네요.. 올바로 수정부탁드립니다. 감사드립니다.
//------------------------------------------------------------------------- // [1] 입력 변수 (INPUTS) //------------------------------------------------------------------------- Input : Period(5), Period1(3), Period2(3); Input : InitialContracts(1); // 최초 베팅 계약 수 (1) //------------------------------------------------------------------------- // **[2] 초기화 로직 (오류 방지 필수)** //------------------------------------------------------------------------- If InitialEntry Then Begin G_Contracts = InitialContracts; // **Global Variable 창에 등록 필수** G_WinStreak = 0; // **Global Variable 창에 등록 필수** End; //------------------------------------------------------------------------- // [3] 배열 및 변수 선언 //------------------------------------------------------------------------- Array : MonthO[99](0), MonthC[99](0); // 월봉 추적용 Var : Cnt(0), StoK(0), StoD(0); Var : TicksToPoints(0); //------------------------------------------------------------------------- // [4] 지표 계산 (Stochastics) //------------------------------------------------------------------------- StoK = StochasticsK(Period, Period1); StoD = StochasticsD(Period, Period1, Period2); // TicksToPoints = 1 / MinTick; // MinTick 오류 방지를 위해 계산 줄 주석 처리 //------------------------------------------------------------------------- // [5] 월간 캔들 추적 로직 (추세 필터) - **Begin/End 및 Month() 함수 사용으로 오류 해결** //------------------------------------------------------------------------- // 월이 바뀌었을 때 (정확한 월 변경 감지) if Month() <> Month()[1] Then Begin // Begin 블록 시작 For cnt = 99 DownTo 1 Begin MonthO[cnt] = MonthO[cnt-1]; MonthC[cnt] = MonthC[cnt-1]; End; MonthO[0] = O; // 새로운 월봉 시가 저장 End; // End 블록 끝 MonthC[0] = C; // 현재 월봉 종가 업데이트 //------------------------------------------------------------------------- // [6] 계약 수 결정 함수 정의 (자금 관리) - **Begin/End 사용으로 오류 해결** //------------------------------------------------------------------------- Function GetContractSize() Begin // Begin 블록 시작 // 전역 변수에 저장된 현재 계약 수를 반환 return G_Contracts; End; // End 블록 끝 //------------------------------------------------------------------------- // [7] 자금 관리 로직 (역마틴게일 업데이트) - **Begin/End 사용으로 오류 해결** //------------------------------------------------------------------------- If (MarketPosition == 0) Then // 포지션이 청산된 상태에서만 작동 Begin // Begin 블록 시작 // 1. 승리 시 (직전 손익이 0 초과) if (MP_LossProfit(1) > 0) Then Begin G_WinStreak = G_WinStreak + 1; // 연속 승리 횟수 증가 // 3단계 역마틴게일 로직 if (G_WinStreak == 1) Then G_Contracts = 2; // 1단계 승리 후 2계약 else if (G_WinStreak == 2) Then G_Contracts = 3; // 2단계 승리 후 3계약 else if (G_WinStreak >= 3) Then // 3단계 승리 도달 시 초기화 Begin G_Contracts = InitialContracts; G_WinStreak = 0; End; End // 2. 패배 시 (직전 손익이 0 이하) else if (MP_LossProfit(1) <= 0) Then Begin G_Contracts = InitialContracts; G_WinStreak = 0; End; End; // End 블록 끝 //------------------------------------------------------------------------- // [8] 진입 및 청산 신호 (수량 적용) - **Begin/End 사용으로 오류 해결** //------------------------------------------------------------------------- If (MarketPosition == 0) Then Begin // 진입 로직 시작 // 매수 진입 조건 (월봉 양봉 & StoK > StoD 상향 돌파) If (MonthC[0] > MonthO[0] and CrossUp(StoK, StoD)) Then Begin Buy("LE", NextBar, Market, GetContractSize()); End; // 매도 진입 조건 (월봉 음봉 & StoK < StoD 하향 돌파) If (MonthC[0] < MonthO[0] and CrossDown(StoK, StoD)) Then Begin Sell("SE", NextBar, Market, GetContractSize()); End; End; // 진입 로직 끝 // 청산 로직 (익절/손절) - **MinTick 오류 우회를 위해 포인트 값 그대로 사용** If (MarketPosition <> 0) Then Begin // 청산 로직 시작 // 익절 청산 (Profit Target: 15포인트로 가정) SetProfitTarget(15); // 손절 청산 (Stop Loss: 10포인트로 가정) SetStopLoss(10); End; // 청산 로직 끝

시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-11-10 12:30:19

안녕하세요 예스스탁입니다. 올리신 수식은 예스랭귀지과 맞지 않는 내용이 많고 확인할수 없는 값들이 있습니다. 아래 수식 참고하시기 바랍니다. //------------------------------------------------------------------------- // [1] 입력 변수 (INPUTS) //------------------------------------------------------------------------- Input : Period(5), Period1(3), Period2(3); Input : InitialContracts(1); // 최초 베팅 계약 수 (1) Array : MonthO[99](0), MonthC[99](0); // 월봉 추적용 Var : Cnt(0), StoK(0), StoD(0),EntryVol(0); StoK = StochasticsK(Period, Period1); StoD = StochasticsD(Period, Period1, Period2); if Bdate > Bdate[1]+30 Then Begin // Begin 블록 시작 For cnt = 99 DownTo 1 Begin MonthO[cnt] = MonthO[cnt-1]; MonthC[cnt] = MonthC[cnt-1]; End; MonthO[0] = O; // 새로운 월봉 시가 저장 End; // End 블록 끝 MonthC[0] = C; // 현재 월봉 종가 업데이트 If (MarketPosition == 0) Then { // 진입 로직 시작 // 매수 진입 조건 (월봉 양봉 & StoK > StoD 상향 돌파) If (MonthC[0] > MonthO[0] and CrossUp(StoK, StoD)) Then { //현재 무포지션 if MarketPosition == 0 Then { //전체 첫진입이면 수량은 기본수량 if TotalTrades == 0 Then EntryVol = InitialContracts; Else //첫진입이 아니면 { if PositionProfit(1) > 0 Then { EntryVol = MaxContracts(1)+1; //직전거래가 수익이면 직전거래수량의 +1 if EntryVol == 4 Then //수량이 4이상이면 기본수량으로 EntryVol = 1; } Else EntryVol = InitialContracts; //직전거래가 수익이 아니면 기본수량 } } Else //무포지션이 아니고(매도포지션) { if MarketPosition == -1 Then { //진입이 atmarket인데 PositionProfit이 종가로만 리턴되므로 //완성봉종가와 다음봉시가의 차이를 손익에 추가 if PositionProfit+(C-NextBarOpen)*CurrentContracts > 0 Then { EntryVol = MaxContracts+1; //현재거래가 수익이면 현재진입수량의 +1 if EntryVol == 4 Then //수량이 4이상이면 기본수량으로 EntryVol = 1; } Else EntryVol = InitialContracts; //현재거래가 수익이 아니면 기본수량 } } Buy("LE", AtMarket,Def, EntryVol); } // 매도 진입 조건 (월봉 음봉 & StoK < StoD 하향 돌파) If (MonthC[0] < MonthO[0] and CrossDown(StoK, StoD)) Then { //현재 무포지션 if MarketPosition == 0 Then { //전체 첫진입이면 수량은 기본수량 if TotalTrades == 0 Then EntryVol = InitialContracts; Else //첫진입이 아니면 { if PositionProfit(1) > 0 Then { EntryVol = MaxContracts(1)+1; //직전거래가 수익이면 직전거래수량의 +1 if EntryVol == 4 Then //수량이 4이상이면 기본수량으로 EntryVol = 1; } Else EntryVol = InitialContracts; //직전거래가 수익이 아니면 기본수량 } } Else //무포지션이 아니고(매수포지션) { if MarketPosition == 1 Then { //진입이 atmarket인데 PositionProfit이 종가로만 리턴되므로 //완성봉종가와 다음봉시가의 차이를 손익에 추가 if PositionProfit+(NextBarOpen-C)*CurrentContracts > 0 Then { EntryVol = MaxContracts+1; //현재거래가 수익이면 현재진입수량의 +1 if EntryVol == 4 Then //수량이 4이상이면 기본수량으로 EntryVol = 1; } Else EntryVol = InitialContracts; //현재거래가 수익이 아니면 기본수량 } } Sell("SE", AtMarket, Def, EntryVol); } } // 진입 로직 끝 // 익절 청산 (Profit Target: 15포인트로 가정) SetStopProfittarget(15); // 손절 청산 (Stop Loss: 10포인트로 가정) SetStopLoss(10); 즐거운 하루되세요