
MQL5 Algo Forge로 이동하기(1부): 메인 리포지토리 만들기
콘텐츠
- 소개
- 현재 사용 가능한 도구
- 전환 시작
- 리포지토리 관리 도구
- 메인 리포지토리 만들기
- 리포지토리 복제
- 무시된 파일 구성
- 변경 사항 커밋
- 아카이브 브랜치 만들기
- 프로젝트 브랜치 생성 준비
- 결론
소개
중대형 프로젝트에서 작업할 때는 필연적으로 코드의 변경 사항을 추적하고 의미별로 그룹화하고 이전 버전으로 롤백할 수 있어야 할 필요성이 생깁니다. 일반적으로 이러한 작업은 Git 또는 SVN(Subversion)과 같은 버전 관리 시스템에서 처리합니다.
대부분의 개발 환경은 일부 버전 관리 시스템의 리포지토리 작업을 위한 기본 제공 도구를 제공합니다. MetaEditor도 예외는 아닙니다. SVN 기반의 자체 저장소 MQL 저장소를 지원합니다. 문서에 명시된 대로
MQL5 저장소는 MQL4/MQL5 소스 코드를 위한 개인 온라인 리포지토리입니다. MetaEditor에 통합되어 편집기에서 직접 스토리지의 데이터를 저장하고 수신할 수 있습니다.
스토리지에는 버전 관리 시스템이 있습니다. 즉 파일이 언제 어떻게 변경되었는지 언제든지 확인할 수 있을 뿐만 아니라 변경 사항을 취소하고 이전 버전으로 돌아갈 수도 있습니다.
MQL5 스토리지를 사용하면 소스 코드가 항상 안전하게 유지됩니다. 데이터는 보호된 서버에 저장되며 회원님만이 데이터에 접근할 수 있습니다. 하드 드라이브에 문제가 발생해도 이전에 저장한 모든 코드를 쉽게 복원할 수 있습니다.
스토리지를 사용하면 차트 템플릿 및 프로필, MQL5 프로그램 테스트를 위한 매개변수 세트, 거래 상품 세트를 서로 다른 플랫폼 간에 쉽게 공유하고 동기화할 수 있으며
공유 프로젝트를 사용하는 팀에서 MQL5 애플리케이션을 원격으로 개발할 수 있습니다.
하지만 Git 버전 관리 시스템이 훨씬 더 많이 사용되고 있으며 저희는 당연히 그럴 것이라 생각합니다. 이러한 이유 때문인지 2024년 중반에 MetaQuotes는 GitHub를 대체하는 자체 버전 관리 시스템인 MQL5 Algo Forge의 출시와 함께 MetaEditor의 내장 버전 관리 시스템으로 Git을 채택할 계획을 발표했습니다.
이 글을 작성하는 시점에 새로운 리포지토리는 이미 사용할 수 있지만 MetaEditor 통합은 아직 완료되지 않았습니다. 따라서 MetaEditor는 여전히 주요 개발 환경으로 남아 있지만 개발자들은 여전히 SVN 기반의 MQL 스토리지로 제한됩니다.
우리는 다양한 프로젝트를 진행하면서 기존 버전 관리 시스템을 적극적으로 활용했습니다. 그러나 "다중 통화 EA 개발하기" 기사 시리즈를 작성하면서 브랜치에서 병렬 코드 개발과 그 이후의 병합에 대한 지원이 부족하다는 점이 특히 눈에 띄었습니다. SVN 자체는 브랜칭을 지원하지만 MetaEditor는 이를 위한 인터페이스를 제공하지 않습니다. 외부 SVN 클라이언트를 사용할 수도 있지만 그렇게 하기 위해서는 익숙한 워크플로우를 재구성해야 합니다.
이러한 이유로 MQL5 Algo Forge의 발표는 큰 호응을 얻었습니다. 저희는 MetaEditor가 마침내 브랜칭을 지원하기를 바랐습니다. 하지만 7개월이 지난 지금도 이러한 기대는 충족되지 않고 있습니다. 따라서 현재 사용 가능한 도구를 사용하여 개발 프로세스를 개선할 수 있는 방법을 살펴 보겠습니다.
이해를 돕기 위해 버전 관리 시스템에 대한 기본적인 지식이 필요합니다. 필요한 경우 MQL5 웹사이트 또는 다른 곳에서 자료 Git으로 시작하기를 검토해 보시기 바랍니다.
현재 사용 가능한 도구
MetaQuotes가 Algo Forge의 출시 소식을 발표한 후 현재 MQL 저장소의 모든 파일이 들어 있는 MQL Storage라는 저장소가 만들어졌습니다. 하지만 모두 super.admin 사용자 아래 단일 커밋으로 추가되었기 때문에 커밋 기록이 보존되지 않았습니다. 이는 예상된 일이었습니다. 서로 다른 버전 관리 시스템 간에 전체 기록을 마이그레이션하는 것은 거의 불가능합니다.
이후 MetaEditor의 일부 인터페이스 요소에 새로운 리포지토리 이름이 표시되기 시작했습니다. 예를 들어 버전 기록 대화 상자의 제목이 "MQL5 Algo Forge"로 변경되었습니다:
그러나 본질은 변하지 않았습니다. 모든 수정 사항은 여전히 Algo Forge가 아닌 MQL 저장소로 이동합니다. 따라서 7개월 전에 Algo Forge에 복사한 파일은 그 이후로 업데이트 되지 않았습니다.
하지만 달라진 점은 이제 우리는 여러 리포지토리로 작업할 수 있다는 점입니다. 이전에는 리포지토리가 하나만 있었습니다. 이전에는 항상 리포지토리 루트인 MQL5 데이터 폴더 내에 별도의 폴더에 다른 프로젝트를 만들어야 했습니다. 즉 새 프로젝트에 대한 새 터미널 인스턴스를 만들고 스토리지를 활성화하면 관련 없는 프로젝트까지 포함해 모든 프로젝트가 스토리지에서 다운로드 되었습니다. 그 수가 늘어나면서 불편함이 커졌습니다.
데이터 폴더에서 관련 없는 프로젝트를 단순히 삭제하는 것으로는 해결이 되지 않았습니다. 모든 커밋에서 삭제된 항목이 저장소로 보내지지 않도록 수동으로 제외해야 했기 때문입니다.
이제 적절한 Git 리포지토리를 통해 저장소를 구성하고 다양한 프로젝트를 관리할 수 있는 몇 가지 옵션이 생겼습니다:
- 각 프로젝트는 자체 리포지토리에 존재합니다.
- 각 프로젝트는 단일 리포지토리의 별도 브랜치에 존재합니다.
- 하이브리드 모델: 일부의 프로젝트는 별도의 리포지토리에 있고 다른 프로젝트는 하나의 리포지토리 내에 브랜치로 공존합니다.
각각의 접근 방식에는 장단점이 있습니다. 예를 들어 여러 프로젝트가 동일한 라이브러리를 공유하는 경우 라이브러리를 별도의 리포지토리에 보관하는 것은 불편합니다. 대신 필요에 따라 프로젝트 브랜치에 변경 사항을 병합하여 전용 브랜치에 유지 관리하는 것이 좋습니다. 반면에 독립된 프로젝트의 경우 별도의 리포지토리를 사용하는 것이 좋습니다. 그러면 다른 프로젝트의 관련 없는 코드를 저장하는 경우를 피할수 있습니다.
전환 시작
변경할 때는 이미 존재하는 것을 보존하는 것이 현명합니다. 자동으로 생성된 mql5 리포지토리를 사용하는 것이 최선의 방법이 아닐 수도 있습니다. 여기에 MetaQuotes가 super.admin으로 추가적인 작업을 더할 수 있기 때문입니다. 따라서 우리는 우선 현재 모든 프로젝트를 저장할 새로운 리포지토리를 만들 것입니다. 이를 위해 서로 다른 프로젝트를 서로 다른 브랜치에 저장하는 모델을 채택할 것입니다. 이러한 분기를 구현하기 위해 다음과 같은 규칙을 정의합니다:
- 메인 브랜치는 비워 두거나 모든 프로젝트에서 사용하는 최소한의 공통 코드만 포함합니다.
- 별도의 아카이브 브랜치에는 마이그레이션 시점에 사용 가능한 모든 코드가 저장됩니다. 여기에서 우리는 개별 프로젝트 브랜치에 코드를 복사할 수 있습니다.
- 다른 브랜치는 개별 프로젝트와 연관되어 있으며 그에 따라 이름이 지정됩니다.
- 선택한 브랜칭 전략에 따라 프로젝트에 여러 개의 활성 브랜치가 있을 수 있습니다(예: "https:성공적인 Git 브랜칭 모델"에 설명된 접근 방식).
터미널이 설치된 MetaTrader5 폴더와 연결된 MQL 스토리지가 있다고 가정해 보겠습니다. 즉, 터미널의 MetaTrader5/MQL5 데이터 폴더에는 표준 파일과 함께 프로젝트 코드가 들어 있습니다.
MetaTrader5.forge라는 새로운 폴더를 만들고 여기에 실행 파일 두 개를 복사합니다:
이 폴더에서 포터블 모드로 MetaTrader 터미널을 실행합니다. 우리의 시스템에서는 더블 클릭 시 이 모드에서 시작되었습니다. 그렇지 않으면 명령줄에서 실행할 때 /portable 키를 명시적으로 지정하거나 바로 가기를 만들어 애플리케이션 시작 명령에 이 키를 추가 할 수 있습니다. 이 단계에서는 거래 데모 계좌를 개설하거나 MQL5.community에 로그인할 필요가 없습니다.
새 폴더에 빈 MQL5 데이터 폴더를 포함한 초기 폴더 구조가 만들어집니다. 아직 파일이 포함되어 있지 않습니다.
터미널에서 F4 키를 눌러 MetaEditor를 시작합니다.
폴더 이름을 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴에서 MQL5 Algo Forge 저장소를 활성화하는 옵션이 제공됩니다(실제로는 MQL 저장소가 활성화됨). 새로운 리포지토리 유형으로 마이그레이션할 예정이므로 아직 활성화하지 마세요.
그런 다음 MetaTrader와 MetaEditor를 모두 닫습니다. 터미널 폴더에서 직접 몇 가지 작업을 수행해야 하기 때문입니다.
리포지토리 관리 도구
다음 단계는 향후 리포지토리 작업을 위한 도구를 선택하는 것입니다. 나중에 MetaEditor 자체에서 이 역할을 대신할 수도 있지만 지금 우리는 다른 것을 사용해야 합니다. Git 리포지토리로 작업할 수 있는 모든 도구(예: https: Visual Studio Code (VSCode)를 Git과 함께 사용할 수 있습니다. Windows 버전의 Git은 gitforwindows.org에서 다운로드할 수 있습니다.
따라서 Git과 VSCode를 설치하세요(또는 이미 설치되어 있는지 확인하세요). VSCode에서 MQL5 파일 작업을 위한 MQL 도구 확장 프로그램을 설치합니다:
확장 프로그램을 설치한 후 설정의 'Metaeditor5 Dir' 매개변수에 MetaEditor 실행 파일의 경로를 지정합니다. 터미널 인스턴스의 작업 폴더 외부에 있는 MQL5 소스 파일로 작업할 필요가 없습니다. 그러므로 여러분은 권장 사항을 따르고 VSCode에서 현재 열린 폴더를 기준으로 경로를 제공할 수 있습니다:
확장 설정에서 더 아래로 내려가서 "포터블 MT5" 옵션을 활성화하는 것이 좋습니다.
구문 강조 표시를 사용하려면 Visual Studio Code용 C/C++ 확장 프로그램을 설치해야 합니다.
안타깝게도 MQL5는 C++와 매우 유사하지만 표준 C++에서는 사용되지 않는 특정 언어 구조가 포함되어 있습니다. 그 결과 확장 프로그램에서 때때로 MQL5의 컨텍스트와 관련이 없는 구문 오류가 표시될 수 있습니다.
이제 VSCode에서 MetaTrader5.forge/MQL5 데이터 폴더를 엽니다:
Expert Advisor 파일을 열어보세요:
구문 강조 표시가 올바르게 작동하고 이제 편집기 창의 오른쪽 상단에 MetaEditor를 통한 MQL5 구문 검사 및 컴파일을 위한 추가 버튼이 표시됩니다. 그러나 모든 #include 지시문은 오류 메시지를 생성합니다. 이는 MQL5가 C++가 아니며 표준 라이브러리 포함 파일의 위치가 다르기 때문에 발생하는 것입니다. 이 문제를 해결하려면 제안된 해결 방법을 따르세요: VSCode용 C/C++ 확장 설정에서 MetaTrader5.forge/MQL5/Include 경로를 추가하세요.
이 작업이 완료되면 오류 메시지가 사라지고 Expert Advisor가 성공적으로 컴파일 됩니다:
이제 MQL5 Algo Forge 입니다. VSCode는 잠시 옆에 두겠습니다: MQL5 Algo Forge.
메인 리포지토리 만들기
https://forge.mql5.io/로 이동하여 새로운 계정을 등록하거나 기존 MQL5.community 자격 증명을 사용하여 로그인합니다:
오른쪽 상단 메뉴에서 '새 리포지토리'를 선택합니다.
리포지토리의 이름을 선택합니다(예: mql5-main). 리포지토리를 로컬로 복제할 때 루트 폴더의 이름을 지정할 수 있으므로 리포지토리 이름 자체는 중요하지 않습니다. 초기화하는 동안 .gitignore 및 README.md 파일을 모두 추가합니다.
이제 리포지토리가 생성되었습니다. 첫 번째 커밋은 자동으로 이루어집니다:
다음 단계에서 리포지토리 URL을 복사합니다. 우리의 경우: https://forge.mql5.io/antekov/mql5-main.git. 이제 브라우저에서 VSCode, MetaEditor, MetaTrader 5 터미널로 돌아갈 수 있습니다.
리포지토리 복제
리포지토리를 로컬에 복제하려면 터미널 디렉터리에 빈 MQL5 폴더가 필요합니다. 현재 이미 파일로 가득 차 있으므로 다음과 같이 진행해야 합니다:
- VSCode, MetaEditor, MetaTrader 5를 닫습니다.
- 기존 MQL5 폴더의 이름을 변경합니다(예: MQL6으로).
이제 MetaTrader5.forge 디렉토리에 MQL5 폴더가 없습니다:
VSCode에서 이 폴더를 열고 [Ctrl + `]를 눌러 VSCode 터미널을 실행합니다.
리포지토리 URL을 복사하고 복제 명령을 실행하여 URL 뒤에 로컬 리포지토리의 루트 폴더 이름을 지정합니다(MQL5와 일치해야 함):
git clone https://forge.mql5.io/antekov/mql5-main.git MQL5
리포지토리가 비공개이고 처음 복제하는 경우 자격 증명을 입력하라는 메시지가 표시됩니다. 결과적으로 터미널 디렉터리에 새 MQL5 하위 폴더가 나타나며 여기에는 .gitignore 및 README.md가 포함됩니다.
이제 모든 파일과 폴더를 MetaTrader5.forge/MQL6에서 MetaTrader5.forge/MQL5로 이동한 다음 이전 MetaTrader5.forge/MQL6 폴더를 삭제합니다.
VSCode에서 MetaTrader5.forge/MQL5 폴더를 엽니다. 왼쪽 소스 제어 패널에서 리포지토리 폴더에 많은 수의 새 파일(이 경우 581개)이 있는 것을 볼 수 있습니다:
그러나 이러한 파일은 대부분 표준 MetaTrader 5 설치에 속하므로 우리의 리포지토리에 있으면 안 됩니다. 새 버전에서는 이러한 표준 라이브러리 및 예제 프로젝트의 내용과 구조가 변경될 수 있습니다. MetaTrader 터미널의 업데이트 또는 새로운 작업 폴더로 전환할 때 충돌이 발생할 수도 있습니다. 따라서 이들을 리포지토리에 포함할 이유가 없습니다.
무시된 파일 구성
바로 이 지점에서 .gitignore 파일이 유용해집니다. 여기에서 Git이 무시할 파일과 디렉터리를 지정할 수 있습니다. 이렇게 하면 수백 개의 관련 없는 변경 사항 대신 우리의 파일에 대한 수정 사항만 확인할 수 있습니다. 우리는 아직 리포지토리에 사용자 지정 파일을 추가하지 않았으므로 현재 나열된 모든 파일은 무시해야 합니다.
따라서 .gitignore를 열고 기본 콘텐츠를 다음과 같이 바꿉니다:
# ---> MQL5 # VSCode Preferences .vscode/* # Executables *.ex5 # MQL5 Standard Files /Experts/Advisors/ /Experts/Examples/ /Experts/Free Robots/ /Experts/Market/ /Files/ /Images/ /Include/Arrays/ /Include/Canvas/ /Include/ChartObjects/ /Include/Charts/ /Include/Controls/ /Include/Expert/ /Include/Files/ /Include/Generic/ /Include/Graphics/ /Include/Indicators/ /Include/Math/ /Include/OpenCL/ /Include/Strings/ /Include/Tools/ /Include/Trade/ /Include/WinAPI/ /Include/MovingAverages.mqh /Include/Object.mqh /Include/StdLibErr.mqh /Include/VirtualKeys.mqh /Indicators/Examples/ /Indicators/Free Indicators/ /Libraries/ /Logs/ /Profiles/ /Scripts/Examples/ /Scripts/UnitTests/ /Services/ /Shared Projects/ /experts.dat /mql5.*
이렇게 하면 VSCode 설정 파일, 컴파일 된 Expert Advisor 및 지표 파일(일반적으로 저장소에는 소스 코드만 저장), 나열된 폴더에 있는 표준 MetaTrader 5 파일을 버전 관리 시스템이 제외하도록 지시할 수 있습니다. 여러분 자신의 소스 코드만 추적됩니다.
변경 사항 커밋
.gitignore를 저장하면 VSCode는 수정된 단일 파일, 즉 .gitignore 자체만 표시합니다. 이제 mal5-main 리포지토리의 루트 폴더인 MQL5 폴더에 있는 다른 모든 파일은 물리적으로 존재하지만 무시됩니다:
다음과 같은 메시지를 추가하여 로컬 리포지토리에서 커밋을 수행합니다: "Add standard files to .gitignore(.gitignore에 표준 파일 추가)"를 클릭하고 "커밋"을 클릭합니다.
이 시점에서 변경 사항은 로컬 리포지토리에만 존재합니다. 원격 리포지토리로 푸시하려면 "Push" 명령을 실행합니다. 예를 들어 VSCode에서 '동기화 변경 사항'을 클릭하거나, 변경 사항 옆의 오버플로 메뉴(...)에서 '푸시'를 선택하거나, 수동으로 'git push' 명령을 실행하는 등 다양한 방법으로 이 작업을 수행할 수 있습니다.
하지만 마지막 커밋을 업스트림으로 푸시하기 전에 그래프에서 커밋 기록을 확인하세요. 두 개의 커밋이 표시되어야 합니다: "초기 커밋" 및 ".gitignore에 표준 파일 추가". 브랜치 이름은 커밋 옆의 오른쪽에 색상으로 표시됩니다. 첫 번째 커밋은 다음과 같이 레이블이 지정됩니다. origin/main, 두 번째 커밋은 main. 사실 같은 main 브랜치입니다. 여기서 origin은 원격 리포지토리의 별칭이므로 origin 접두사는 이 커밋이 업스트림 리포지토리의 main 브랜치에 있는 마지막 커밋임을 의미합니다. 두 번째 커밋은 이 접두사 없이 나타나므로 로컬 리포지토리에만 존재하며 마지막 커밋입니다.
'변경 사항 동기화'를 누릅니다:
이제 변경 사항이 원격 리포지토리에 성공적으로 푸시되었으며 보라색 'origin' 레이블이 두 번째 커밋으로 이동했습니다. 웹 인터페이스에서 리포지토리를 확인하여 이를 확인할 수 있습니다:
이 단계에서는 작업을 위해 거의 비어 있는 리포지토리를 준비했습니다. main이란 이름의 유일한 브랜치에는 우리가 추가한 두 개의 파일이 포함되어 있습니다. 이 터미널 인스턴스의 데이터 폴더에 있는 다른 모든 파일은 버전 관리 시스템에서 무시됩니다.
아카이브 브랜치 만들기
앞서 언급했듯이 첫 번째 단계는 모든 기존 파일을 하나의 브랜치에 배치하여 버전 관리 대상에 포함시키고 원격 리포지토리로 푸시할 수 있도록 하는 것입니다. 이렇게 하면 나중에 필요한 경우 다른 컴퓨터에서 검색할 수 있습니다.
버전 관리 시스템의 다른 작업과 마찬가지로 브랜치도 다양한 방법으로 만들 수 있습니다. VSCode에서 리포지토리 메뉴(...)를 엽니다. 그런 다음 "Checkout to..."을 선택합니다.
다음으로 작업 목록에서 "새 브랜치 만들기..."를 선택합니다.
웹 인터페이스에서 원격 리포지토리에서 브랜치 탭으로 이동하여 새 브랜치 만들기 버튼(아래 녹색 사각형으로 강조 표시됨)을 클릭합니다:
이 두 가지 방법에는 한 가지 차이점이 있습니다. 첫 번째 방법은 로컬 컴퓨터에 새 브랜치를 만들고 변경 사항을 푸시할 때까지 원격 리포지토리는 이 브랜치에 대해 아무것도 알지 못합니다. 두 번째 방법은 원격 리포지토리에 새 브랜치를 만들므로 로컬 리포지토리는 pull 명령으로 변경 내용을 검색할 때까지 이 브랜치의 존재를 알지 못합니다. 어느 쪽이든 풀 또는 푸시 명령을 실행하여 동기화하기만 하면 됩니다.)
세 번째 방법은 명령줄을 사용하는 것입니다. 예를 들어 로컬 리포지토리에 "archive"라는 이름의 새 브랜치를 만들려면 리포지토리 폴더에서 다음 명령을 실행하면 됩니다:
git checkout -b archive
VSCode 통합 터미널에서 이 작업을 수행하면 다음과 같이 표시됩니다:
이 터미널은 리포지토리가 새로 생성된 "archive" 브랜치로 전환되었음을 알려줍니다. 커밋 목록에서 브랜치 이름 main이 archive로 변경되었습니다. 변경 로그에 새 브랜치를 원격 리포지토리에 푸시하라는 메시지가 표시됩니다. 하지만 우리는 먼저 이 브랜치에 파일을 추가하겠습니다.
MetaTrader 터미널의 초기 폴더에는 모든 파일이 들어 있는 MQL5 폴더가 있었습니다. 리포지토리는 다른 터미널 폴더 안에 만들어졌습니다. 이제 이전 원본 MetaTrader5/MQL5 폴더의 모든 파일을 새 저장소의 폴더로 복사합니다:
버전 관리 시스템은 리포지토리 폴더에서 새 파일을 즉시 감지하고 특정 작업을 할 수 있게 되었습니다. 모든 새 파일을 색인에 추가해야 합니다(버전 관리를 사용하려면). 변경 목록 헤더에서 "+"(Stage All Changes)를 선택하거나 다음 명령을 실행하여 VSCode 인터페이스를 통해 이 작업을 수행할 수 있습니다.
git add .
이제 변경 사항 목록의 각 파일에 U 대신 인덱싱 되었음을 의미하는 A 레이블이 표시됩니다. 이후 원격 리포지토리에 변경 사항을 커밋하고 푸시합니다:
보시다시피 main 브랜치의 마지막 커밋은 이제 두 번째 커밋이고 세 번째 커밋은 archive 브랜치에서 이루어졌습니다. 새 브랜치가 원격 리포지토리에 푸시되었는지 확인해 보겠습니다:
최신 커밋은 원격 리포지토리에 표시되며 새 아카이브 브랜치에 속합니다. 이 커밋에 포함된 구체적인 변경 사항을 보려면 클릭하세요.
이 시점에서 모든 파일이 아카이브 브랜치에 성공적으로 추가되었습니다. 이제 로컬 리포지토리의 main 브랜치로 다시 전환해 보겠습니다.
프로젝트 브랜치 생성 준비
main 브랜치로 전환하려면 콘솔에서 다음 명령을 실행합니다.
git checkout main
로컬 리포지토리는 우리가 모든 파일을 복사했던 전의 상태로 돌아가야 합니다. 그러나 전환 후 MQL5 폴더의 내용을 살펴보면 많은 Expert Advisor 폴더가 남아 있는 것을 확인할 수 있습니다.
이러한 폴더에는 여전히 컴파일된 .ex5 파일이 포함되어 있습니다. 이는 버전 관리에서 이러한 파일을 제외하면 Git이 아카이브 브랜치에서 메인 브랜치로 전환할 때 이러한 파일을 제거하지 않기 때문에 발생합니다. 스테이징되고 리포지토리에 커밋된 소스 파일만 폴더에서 제거되었습니다.
이는 편리하지 않으므로 컴파일된 파일과 삭제 후 남아있는 빈 디렉터리를 제거해야 합니다. 이 작업을 수동으로 수행하면 시간이 많이 걸리며 특히 나중에 반복해야 할 수도 있습니다. 따라서 이 작업을 자동으로 처리하는 간단한 스크립트를 작성하는 것이 더 실용적입니다.
스크립트를 개발하는 과정에서 브랜치 전환 후 루트 폴더를 원래의 상태로 복원하는 것은 파일 삭제만으로는 충분하지 않습니다. 또한 .ex5 파일을 삭제한 후 비어 있는 디렉터리를 제거해야 합니다. 일부 폴더는 의도적으로 비워둘 수 있으므로 제거해서는 안 됩니다. 이러한 항목은 제외 목록에 추가됩니다. 이 목록에는 버전 관리 메타데이터가 포함된 .gitignore 폴더뿐만 아니라 이전에 .gitignore에 나열된 모든 폴더가 포함됩니다.
다음은 이러한 스크립트의 예입니다:
import os def delete_ex5_files_and_empty_dirs(path, excluded=['.git', '.vscode']): # Exceptions excluded = {os.path.join(path, dir) for dir in excluded} # Check all folders and files in the directory tree for root, dirs, files in os.walk(path, topdown=False): is_excluded = False for ex in excluded: if root.startswith(ex): is_excluded = True break if is_excluded: continue # Delete all files with extension .ex5 for file in files: if file.endswith('.ex5'): file_path = os.path.join(root, file) os.remove(file_path) print(f'File removed: {file_path}') # Delete all folders that have become empty after deleting files for dir in dirs: dir_path = os.path.join(root, dir) # IF the directory is empty after deleting files if dir_path not in excluded and not os.listdir(dir_path): try: os.rmdir(dir_path) print(f'Empty folder removed: {dir_path}') except OSError: pass # If error occurred, ignore excluded = [ '.git', '.vscode', 'Experts\\Advisors', 'Experts\\Examples', 'Experts\\Free Robots', 'Experts\\Market' 'Files', 'Images', 'Include\\Arrays', 'Include\\Canvas', 'Include\\ChartObjects', 'Include\\Charts', 'Include\\Controls', 'Include\\Expert', 'Include\\Files', 'Include\\Generic', 'Include\\Graphics', 'Include\\Indicators', 'Include\\Math', 'Include\\OpenCL', 'Include\\Strings', 'Include\\Tools', 'Include\\Trade', 'Include\\WinAPI', 'Indicators\\Examples', 'Indicators\\Free Indicators', 'Libraries', 'Logs', 'Presets', 'Profiles', 'Scripts\\Examples', 'Scripts\\UnitTests', 'Services', 'Shared Projects', ] if __name__ == '__main__': current_dir = os.getcwd() # Current working directory delete_ex5_files_and_empty_dirs(current_dir, excluded)
이 스크립트를 리포지토리 루트에 clean.py로 저장하고 메인 브랜치의 버전 관리에 추가하세요. 이제부터는 archive에서 main으로 전환한 후 이 스크립트를 실행하기만 하면 컴파일된 파일과 빈 폴더가 자동으로 정리됩니다.
결론
이상 새로운 리포지토리 시스템에 대한 기본 내용을 마무리합니다. 모든 파일이 성공적으로 전송되었고 새로운 프로젝트를 위한 새로운 프로젝트 브랜치를 만들 수 있는 토대를 마련했습니다. 코드가 아카이브 브랜치에 안전하게 저장되므로 필요에 따라 프로젝트를 점진적으로 별도의 브랜치로 마이그레이션할 수 있습니다.
흥미로운 다음 단계는 "다중 통화 EA 개발하기" 문서 시리즈의 소스 코드를 위한 공개 리포지토리를 만드는 것입니다. 시리즈의 여러 부분에 걸쳐 코드를 어떻게 구성할지는 아직 명확하지 않지만 가까운 시일 내에 이 문제를 해결할 예정입니다.
관심을 가져 주셔서 감사합니다! 곧 다시 뵙겠습니다!
콘텐츠 아카이브
# | 이름 | 버전 | 설명 |
---|---|---|---|
MQL5 | 리포지토리 루트 폴더(터미널 데이터 폴더) | ||
1 | .gitignore | 1.00 | Git 버전 관리 시스템에서 무시할 파일 목록 폴더 및 파일 |
2 | clean.py | 1.00 | 리포지토리의 메인 브랜치로 전환할 때 컴파일된 파일과 빈 디렉터리를 삭제하는 스크립트 |
MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/17646
경고: 이 자료들에 대한 모든 권한은 MetaQuotes(MetaQuotes Ltd.)에 있습니다. 이 자료들의 전부 또는 일부에 대한 복제 및 재출력은 금지됩니다.
이 글은 사이트 사용자가 작성했으며 개인의 견해를 반영합니다. Metaquotes Ltd는 제시된 정보의 정확성 또는 설명 된 솔루션, 전략 또는 권장 사항의 사용으로 인한 결과에 대해 책임을 지지 않습니다.




솔직히 말해서 이 시나리오는 실제로 고려되지 않았습니다. 포럼에서 사용자를 금지하면 현재 MQL 저장소 리포지토리에 대한 액세스가 제한되는지 여부와 새 리포지토리에 대한 액세스도 제한되는지 여부는 알 수 없습니다. 그렇다면 이 위험 요소는 확실히 고려할 가치가 있습니다.
이를 확인하기는 어렵기 때문에 위험 평가는 이론적이지만 다음과 같은 위험이 있습니다.
MQLStorage를 사용하려면 커뮤니티에 로그인해야 합니다. 로그인의 기술적 가능성은 관리자의 손에 달려 있습니다. 이론상으로는 규칙을 심각하게 위반하는 경우(또는 누군가가 심각하게 생각하는 경우) 강제 금지 조치를 받을 수 있습니다. 일시적인 금지 조치는 "권리의 패배"로만 간주되며, 이는 단순히 사이트의 구성 요소와 개별 서비스가 금지되는 것입니다.
그러나 가상, 서버, 데이터 센터, 네트워크도 금지-포-IP 를 받은 적이 있습니다. MQLStorage를 사용할 수 없을 가능성이 높습니다. 개인적인 노력 없이도 동적 IP만으로 얻을 수 있습니다 :-)
이러한 위험을 최소화하려면 전체 백업과 리포지토리의 독립적인 미러를 유지하세요. 그것도 또 다른 즐거움입니다...
첫째, https://forge.mql5.io/ 에는 두 가지 인증 옵션이 있습니다. MQL5.com과 완전히 독립적인 계정을 만들 수 있습니다.
둘째, 포럼에 대한 금지는 게시 금지만을 의미하며 다른 서비스에는 영향을 미치지 않습니다.
셋째, 금지와 무슨 관련이 있나요? 포럼이 아닌 로봇 개발에 참여하세요.
첫째, https://forge.mql5.io/ 에는 두 가지 인증 옵션이 있습니다. MQL5.com과 완전히 독립적인 계정을 만들 수 있습니다.
하지만 mql5.com에 의존하지 않는 경우 ME 프로젝트에 액세스하는 방법은 무엇인가요? 거기에서 커뮤니티에 로그인하는 것이 필수인 것 같습니다.
그리고 mql5.com에 의존하지 않는 경우 ME에서 프로젝트에 액세스하는 방법은 무엇입니까? 거기에서 커뮤니티에 로그인해야하는 것 같습니다.
아, 맞습니다. 어쨌든 계정은 MQL5.com에서 생성됩니다.
그리고 mql5.com에 의존하지 않는 경우 ME에서 프로젝트에 액세스하는 방법은 무엇입니까? 거기에서 커뮤니티에 로그인해야하는 것 같습니다.
아직 커뮤니티에 로그인할 필요는 없습니다. Algo Forge 또는 GitHub와 같은 리포지토리에서 MQL5 데이터 폴더 내의 폴더로 리포지토리를 복제하면 파일이있는 폴더로 표시됩니다. 이 정도면 편집, 실행 및 디버깅에는 충분하지만 리포지토리에 대한 모든 작업은 타사 도구를 사용하여 수행해야 합니다. 저는이 옵션을 한동안 사용했지만 ME는 아직 Algo Forge로 작업 할 수 없었습니다. 그러나 일반적으로 mql5.com 계정을 사용하면 더 쉽습니다.