커뮤니티

수식 확인 좀 부탁 드립니다.

프로필 이미지
산수유
2025-06-08 19:02:48
167
글번호 191495
답변완료
구글 제미나이에 문의를 해봤습니다. 손절시 시장가로 청산주문을 내도 선물이 급변동하였을 경우 주문가와 차이가 많을경우 cme규정상 주문이 없는 걸로 간주해서 청산이 안되는 바람에 손실이 너무 클 경우가 있고 청산이 안된 상태에서 다음 진입주문이 들어가 버려 매매가 완전히 꼬일 수가 있다고 했더니 아래의 일일최대허용 손실율로 제한식을 추가하면 손실을 어느정도 제한할수 있다고 합니다. 그런데 예스랭귀지에서 사용하는 언어가 아니라서 적용을 못 해보았습니다. 아래의 식을 예스랭귀지로 구현 좀 부탁드립니다. 그리고 아래식을 적용하면 손실을 제한할 수 있는가요? Inputs: DailyLossLimit( 0.03 ), // 일일 최대 허용 손실율 (예: 0.03 = 3%) EmergencyExitAttempts( 3 ), // 비상 청산 시도 횟수 EmergencyExitDelaySeconds( 5 ); // 비상 청산 재시도 간격 (초 단위) // Variables (내부 사용 변수) Variables: V_StartingDailyBalance(0), // 하루 시작 시 계좌 잔고 V_EmergencyMode(False), // 비상 모드 플래그 V_ExitAttemptCount(0), // 비상 청산 시도 횟수 카운터 V_LastExitAttemptTime(0); // 마지막 비상 청산 시도 시간 (TicksFromMidnight) // 매일 장 시작 시 초기화 If Date <> Date[1] Then Begin V_StartingDailyBalance = AccountNetLiquidValue(Account); V_EmergencyMode = False; // 새로운 날 시작 시 비상 모드 초기화 V_ExitAttemptCount = 0; // 시도 횟수 초기화 End; // 일일 최대 손실 초과 시 비상 모드 활성화 If V_StartingDailyBalance <> 0 And (AccountNetLiquidValue(Account) - V_StartingDailyBalance) / V_StartingDailyBalance < -DailyLossLimit Then Begin Print(Date, Time, " !!! CRITICAL: Daily Loss Limit Exceeded! Current Loss: ", (AccountNetLiquidValue(Account) - V_StartingDailyBalance) / V_StartingDailyBalance * 100:2:Float, "% !!!"); V_EmergencyMode = True; End; // --- 비상 모드 실행 로직 (이 부분이 매 틱마다 또는 매 바마다 실행됨) --- If V_EmergencyMode Then Begin Print(Date, Time, "EMERGENCY MODE ACTIVATED. All new entries and exits are suspended."); // 현재 포지션이 남아있고, 비상 청산 시도 횟수가 남았으며, 재시도 시간이 되었을 때 If MarketPosition <> 0 And V_ExitAttemptCount < EmergencyExitAttempts And (TicksFromMidnight - V_LastExitAttemptTime) >= EmergencyExitDelaySeconds Then Begin Print(Date, Time, "Attempting Emergency Exit (", V_ExitAttemptCount + 1, " of ", EmergencyExitAttempts, ")."); ExitAllPositions; // 모든 포지션 강제 청산 시도 V_ExitAttemptCount = V_ExitAttemptCount + 1; V_LastExitAttemptTime = TicksFromMidnight; End; SetExitOnClose; // 혹시라도 남아있는 포지션은 바 마감 시 강제 청산 명령 Return; // 이 코드가 실행되면, 이 뒤에 있는 모든 정상적인 매매 로직은 실행되지 않고 현재 바의 스크립트 실행이 종료됨. End;
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-06-09 19:52:22

안녕하세요 예스스탁입니다. 올려주신 내용은 예스랭귀지로 제어가 되는 내용이 아닙니다. 시스템은 봉데이터로 조건판단해 신호를 발생시키고 자동매매일경우 신호에 따라 주문만 집행합니다. 해당 내용은 계좌 손익으로 처리하는 내용인데 랭귀지에서 주문이 미체결된 것을 수식에서 알지 못하므로 해당 내용으로 시스템에 처리할 수 없습니다. 즐거운 하루되세요 > 산수유 님이 쓴 글입니다. > 제목 : 수식 확인 좀 부탁 드립니다. > 구글 제미나이에 문의를 해봤습니다. 손절시 시장가로 청산주문을 내도 선물이 급변동하였을 경우 주문가와 차이가 많을경우 cme규정상 주문이 없는 걸로 간주해서 청산이 안되는 바람에 손실이 너무 클 경우가 있고 청산이 안된 상태에서 다음 진입주문이 들어가 버려 매매가 완전히 꼬일 수가 있다고 했더니 아래의 일일최대허용 손실율로 제한식을 추가하면 손실을 어느정도 제한할수 있다고 합니다. 그런데 예스랭귀지에서 사용하는 언어가 아니라서 적용을 못 해보았습니다. 아래의 식을 예스랭귀지로 구현 좀 부탁드립니다. 그리고 아래식을 적용하면 손실을 제한할 수 있는가요? Inputs: DailyLossLimit( 0.03 ), // 일일 최대 허용 손실율 (예: 0.03 = 3%) EmergencyExitAttempts( 3 ), // 비상 청산 시도 횟수 EmergencyExitDelaySeconds( 5 ); // 비상 청산 재시도 간격 (초 단위) // Variables (내부 사용 변수) Variables: V_StartingDailyBalance(0), // 하루 시작 시 계좌 잔고 V_EmergencyMode(False), // 비상 모드 플래그 V_ExitAttemptCount(0), // 비상 청산 시도 횟수 카운터 V_LastExitAttemptTime(0); // 마지막 비상 청산 시도 시간 (TicksFromMidnight) // 매일 장 시작 시 초기화 If Date <> Date[1] Then Begin V_StartingDailyBalance = AccountNetLiquidValue(Account); V_EmergencyMode = False; // 새로운 날 시작 시 비상 모드 초기화 V_ExitAttemptCount = 0; // 시도 횟수 초기화 End; // 일일 최대 손실 초과 시 비상 모드 활성화 If V_StartingDailyBalance <> 0 And (AccountNetLiquidValue(Account) - V_StartingDailyBalance) / V_StartingDailyBalance < -DailyLossLimit Then Begin Print(Date, Time, " !!! CRITICAL: Daily Loss Limit Exceeded! Current Loss: ", (AccountNetLiquidValue(Account) - V_StartingDailyBalance) / V_StartingDailyBalance * 100:2:Float, "% !!!"); V_EmergencyMode = True; End; // --- 비상 모드 실행 로직 (이 부분이 매 틱마다 또는 매 바마다 실행됨) --- If V_EmergencyMode Then Begin Print(Date, Time, "EMERGENCY MODE ACTIVATED. All new entries and exits are suspended."); // 현재 포지션이 남아있고, 비상 청산 시도 횟수가 남았으며, 재시도 시간이 되었을 때 If MarketPosition <> 0 And V_ExitAttemptCount < EmergencyExitAttempts And (TicksFromMidnight - V_LastExitAttemptTime) >= EmergencyExitDelaySeconds Then Begin Print(Date, Time, "Attempting Emergency Exit (", V_ExitAttemptCount + 1, " of ", EmergencyExitAttempts, ")."); ExitAllPositions; // 모든 포지션 강제 청산 시도 V_ExitAttemptCount = V_ExitAttemptCount + 1; V_LastExitAttemptTime = TicksFromMidnight; End; SetExitOnClose; // 혹시라도 남아있는 포지션은 바 마감 시 강제 청산 명령 Return; // 이 코드가 실행되면, 이 뒤에 있는 모든 정상적인 매매 로직은 실행되지 않고 현재 바의 스크립트 실행이 종료됨. End;