English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
MQL5 Algo Forge로 이동하기(3부): 내 프로젝트에서 외부 리포지토리 사용하기

MQL5 Algo Forge로 이동하기(3부): 내 프로젝트에서 외부 리포지토리 사용하기

MetaTrader 5 |
149 0
Yuriy Bykov
Yuriy Bykov

소개

MQL5 Algo Forge로 전환의 두 번째 부분에서는 중요한 과제 중 하나인 여러 리포지토리와의 작업을 해결하는 데 중점을 두었습니다. 우리는 Adwizard 라이브러리 프로젝트와 Simple Candles Expert Advisor를 함께 사용하여 주로 파일 포함 경로 및 브랜치 병합과 관련된 문제를 발견하고 성공적으로 해결했습니다. 또한 수정을 위한 별도의 브랜치 생성부터 풀 리퀘스트를 통한 병합에 이르기까지 전체 과정에서 MetaEditor 도구를 (가능한 경우) 사용했습니다. 하지만 MetaEditor의 기능만으로 충분하지 않은 경우에는 MQL5 Algo Forge 웹 인터페이스, Visual Studio Code의 외부 Git 클라이언트 또는 Git 콘솔 명령으로 전환했습니다. 이는 개별 개발에서도 Git 모범 사례를 적용하여 프로젝트 내에서 질서를 유지하고 변경 이력을 명확하게 유지할 수 있는 방법을 명확하게 보여주었습니다.

하지만 이는 개발자가 모든 리포지토리를 소유하는 '폐쇄형' 에코시스템으로 스토리지 사용의 한 예에 불과했습니다. Git으로 이전하는 주된 이유 중 하나는 다른 커뮤니티 회원의 공개 리포지토리를 완전히 활용할 수 있기 때문입니다. 여기서 분산 개발의 진정한 잠재력이 드러나는데 타사의 코드를 쉽게 연결 및 업데이트하고 개선에 기여하고 이미 잘 테스트된 기성의 구성 요소로 복잡한 프로젝트를 조립할 수 있다는 점입니다. 

이 글에서는 유용하면서도 더 복잡한 작업, 즉 MQL5 Algo Forge 내에서 타사 저장소의 라이브러리를 실제로 연결하고 사용하는 방법에 대해 살펴봅니다. 그리고 MetaEditor 리포지토리 도구의 추가적인 개발을 기다리지 않아도 됩니다. 


경로 매핑

이 글에서 우리는 실험을 위한 훌륭한 시험대가 될 Simple Candles 프로젝트 리포지토리와 함께 계속 작업할 것입니다. 기존 트레이딩 전략에는 이미 표준 ATR(평균 실제 범위) 지표와 기능적으로 유사한 사용자 지정 변동성 계산이 포함되어 있습니다. 그러나 자체적으로 구현하는 대신 우리는 커뮤니티에서 바로 사용할 수 있는 전문화된 솔루션을 포함시켜 코드를 개선하는 방법을 모색할 것입니다.

이를 위해 공개적으로 사용 가능한 SmartATR 리포지토리에 보다 발전되고 최적화된 버전의 지표가 포함되어 있다고 가정합니다. 우리의 장기적 실질적인 목표는 EA를 수정하여 내부의 계산을 계속 사용하거나 외부 SmartATR 라이브러리 알고리즘으로 전환하는 것 중 하나를 선택할 수 있도록 하는 것입니다. 하지만 이 글에서 우리는 완전한 기능을 갖춘 EA를 구축하는 것에 초점을 맞추지 않고 외부 리포지토리로 작업하는 것에 대해 주로 살펴볼 것입니다.

이를 위해 다음을 수행해야 합니다. SmartATR 라이브러리 코드를 로컬 머신에 다운로드하고 프로젝트에 포함되도록 설정합니다. 나중에 새로운 버전이 출시될 때 쉽게 업데이트할 수 있도록 외부 리포지토리를 작업 환경에 추가하는 방법에 대해서 알아볼 것입니다. 그 후 Simple Candles 프로젝트와 (필요에 따라) SmartATR 라이브러리 코드 자체에 수정 사항을 적용합니다. 이상적으로는 마지막 단계를 생략할 수 있지만 우리의 경우에는 이 단계가 필요하므로 다른 사람의 리포지토리에 변경 사항을 도입하는 방법에 대한 실제적인 예로 사용하겠습니다. 마지막으로 SmartATR 라이브러리가 프로젝트의 일부로 성공적으로 포함되고 컴파일 될 수 있는지 테스트하여 통합을 검증합니다.

이 접근 방식을 통해 외부 코드를 통합하는 전체 프로세스를 신중하게 살펴볼 수 있습니다. 이 방식은 어디서나 통합니다: 일단 하나의 라이브러리를 성공적으로 추가한 후에는 동일한 접근 방식을 사용하여 MQL5 Algo Forge의 다른 공용 리포지토리를 프로젝트에 포함할 수 있습니다.


외부 코드 가져오기

언뜻 보기에는 문제가 되지 않을 것 같습니다. 표준 콘솔 명령을 사용하여 모든 Git 리포지토리를 로컬 컴퓨터로 복제할 수 있습니다:

GIT CLONE ...

그러나 우리는 특정 순서를 따르기로 했습니다. 먼저 MetaEditor 인터페이스를 통해 작업한 다음 MQL5 Algo Forge 웹 인터페이스를 통해 작업하는 것입니다. 그리고 이러한 접근 방식이 실패할 경우에만 Visual Studio Code 또는 Git 콘솔 명령과 같은 외부 도구를 사용하기로 했습니다.

첫 번째 질문은: 복제를 위해 다른 사람의 리포지토리를 선택하기 위해 MetaEditor에서 어떻게 볼 수 있는가 하는 것입니다. 부분적인 답변은 문서에서 찾을 수 있지만 어디를 찾아야 할지 바로 알 수 있는 사용자는 거의 없습니다. 저희도 이 페이지를 나중에야 알게 되었습니다. 그 전에는 MetaEditor의 Shared Projects 폴더에 자체 저장소만 표시되는 것만을 알고 있었습니다. 자세한 알아보기 위해 MetaEditor의 탐색기에서 이 폴더에 사용할 수 있는 컨텍스트 메뉴 옵션을 사용해 보았습니다. 

새 프로젝트 옵션은 당사가 소유한 새 리포지토리만 생성하므로 여기서는 적합하지 않습니다. 새로 고침이 외부 리포지토리를 추가하지도 않습니다. '모든 파일 표시' 옵션이 이상하게 작동합니다. 이 옵션을 실행한 후 아직 로컬로 복제되지 않은 리포지토리에 중복된 이름이 나타났습니다. 다행히 새로 고침을 누르면 이러한 중복 이름이 제거됩니다. 마지막 희망은 '모든 공개 프로젝트 표시' 옵션이었지만 이 역시 눈에 띄는 변화를 가져오지 못했습니다.

안타깝게도 현재로서는 외부 리포지토리를 복제할 때 MetaEditor에만 의존할 수는 없다는 뜻입니다. 그럼 우리의 목표를 달성하기 위한 몇 가지 대안적인 접근 방식을 살펴보겠습니다.


접근 방식 1: 직접 복제

시험을 시작해 보겠습니다. Shared Projects 내에 임의의 이름(예: TestRepo)으로 빈 폴더를 만들면 MetaEditor에 해당 폴더가 표시됩니다. 여기에서 우리는 우클릭 메뉴에서 복제 명령을 실행할 수도 있습니다. 그러나 로그에 따르면 MetaEditor는 개인 저장소에서 같은 이름의 저장소(TestRepo)를 복제하려고 시도하는데 이 저장소는 당연히 존재하지 않는 저장소입니다:

이렇게 우리는 다른 사람의 리포지토리를 복제하는 데는 이 방법이 작동하지 않는다는 것을 확인할 수 있습니다. 대신 'git clone ...' 콘솔 명령을 사용해서 SmartATR 리포지토리를 Shared Projects에 직접 복제해 보고 어떤 일이 발생하는지 확인해 보겠습니다.

복제 후 Shared Projects에 새 SmartATR 폴더가 나타나고 MetaEditor의 내비게이터에 표시됩니다. 더 중요한 것은 우리가 이 리포지토리를 볼 수 있을 뿐만 아니라 리포지토리로 작업할 수 있다는 점입니다. MetaEditor에서 직접 Pull을 수행하고 변경 내역(로그)을 볼 수 있습니다.

따라서 MetaEditor에는 현재 '...에서 복제'와 같은 컨텍스트 메뉴 옵션이 없어 사용자가 저장소에서 리포지토리의 URL을 지정하거나 대화 상자를 열어 MQL5 Algo Forge의 모든 공개 리포지토리에서 검색 및 선택할 수 있습니다(웹 인터페이스의 Explore 섹션과 유사). 또 다른 가능한 개선 사항은 Shared Projects 아래에 개인 리포지토리뿐만 아니라 사용자가 웹 인터페이스 Starred Repositories)에서 별표를 표시한 공개 리포지토리도 표시 여부를 전환할 수 있는 기능을 추가하는 것입니다. 하지만 MetaEditor에 최종적으로 어떤 변화가 도입될지 너무 멀리 추측하지는 맙시다.

이제 성공적으로 복제된 SmartATR 리포지토리로 돌아가면 우리는 당면한 목표를 달성했다고 말할 수 있을 것입니다. 이제 프로젝트의 소스 코드가 로컬에서 사용할 수 있습니다. 그리고 이것은 우리가 이 코드를 우리의 자체 프로젝트에서 사용할 수 있다는 것입니다. 하지만 주의할 점이 있습니다. SmartATR 코드를 수정할 필요가 없는 경우, 즉 새로운 버전이 출시될 때만 업데이트하여 '즉시' 사용할 수 있는 경우에만 직접 사용할 수 있습니다. 우리가 해낼 수 있는지 봅시다.


기능 확인

SmartATR 프로젝트에서 MetaTrader 5 지표의 소스 코드가 포함된 파일을 받았는데 설명에 따르면 이 지표는 고급 접근법을 사용하여 평균 실제 범위(ATR)를 계산합니다. 컴파일을 시도해 보았는데... 바로 오류가 발생했습니다. 

오류가 얼마나 심각한지에 관계없이 중요한 점은 무언가 변경하지 않고는 프로젝트를 사용할 수 없다는 것입니다. 이 단계에서는 수정 사항을 로컬에만 적용할지 아니면 공유하여 원본 리포지토리에 기여할지를 결정해야 합니다. 다른 개발자도 이 프로젝트의 코드를 사용하려고 할 때 같은 문제가 발생할 수 있습니다. 따라서 오픈소스 개발의 철학에 부합하는 두 번째 옵션이 더 바람직합니다.

하지만 지금은 당분간 수정 사항을 게시하지 않는다고 가정해 보겠습니다. 오류를 해결해야만 의미 있는 게시물을 만들 수 있습니다. 이 경우 SmartATR 프로젝트에 로컬 변경 사항만 적용하려는 경우에는 로컬 브랜치를 새로 만들면 됩니다. 

이렇게 해보겠습니다. 원래 SmartATR 저장소에는 main 브랜치만 포함되어 있으므로 MetaEditor에서 프로젝트 폴더의 컨텍스트 메뉴를 통해 새 개발 브랜치를 생성합니다. MetaEditor에 표시되는 브랜치 목록에 브랜치가 나타납니다. 푸시를 누르면 로그에서 작업이 성공했음을 확인할 수 있습니다. 이 시점에서 우리는 새 브랜치가 원본 리포지토리에 만들어졌을 것으로 예상할 수 있습니다. 하지만 MQL5 Algo Forge 웹 인터페이스를 확인해보면 달라진 것이 없습니다.

이제 MetaEditor에서 코드를 편집하고 변경 사항을 커밋해 보겠습니다. 오류를 일으킨 각 줄 앞에 수정이 필요하다는 주석을 추가하고 이러한 변경 사항을 커밋합니다. MetaEditor 로그는 커밋과 푸시가 모두 성공했음을 나타냅니다.

하지만 다시 한번 MQL5 Algo Forge 웹 인터페이스에서 원본 리포지토리를 확인하면 변경된 사항이 없음을 알 수 있습니다. 이는 매우 이례적인 일입니다. Visual Studio Code에서 프로젝트를 확인하고 무슨 일이 일어나고 있는지 이해해 보겠습니다. SmartATR 프로젝트 복제본이 있는 폴더를 열면 다음이 표시됩니다:

최신 커밋이 존재하지만 VS Code는 개발 브랜치를 게시할 것을 제안합니다. 즉 브랜치가 아직 원격 리포지토리에 존재하지 않으며 커밋도 존재하지 않습니다. 브랜치를 게시하려고 하는데 오류가 발생합니다:

로그를 확인하여 이유를 알아보세요:

사용자 계정에는 원본 리포지토리에 대한 쓰기 권한이 없습니다. 이것은 말이 됩니다. 그렇지 않으면 프로젝트가 누군가의 통제되지 않은 편집으로 쉽게 혼란에 빠질 수 있습니다. 즉 우리는 로컬 복사본에서만 수정할 수 있습니다. 그러나 이러한 변경 사항은 외부와 동기화될 수 없으며 로컬 복제본에만 존재합니다. 이는 이상적인 상황과는 거리가 멉니다. 외부 리포지토리는 협업 옵션 외에도 프로젝트 백업을 저장하는 매우 중요한 역할을 수행합니다. 이러한 안전망을 포기하는 것은 현명하지 못합니다.

MetaEditor에서만 작업할 때는 문제가 있다는 징후가 없었다는 점도 주목할 만합니다. MetaEditor 로그에 따르면 모든게 정상이었습니다: 오류도 없고 모든 변경 사항이 존재하지 않는 리포지토리에 "성공적으로" 푸시되었습니다. 이 문제는 향후 빌드에서 수정되기를 바랍니다.


접근 방식 2: 포크 복제

이제 다른 경로를 시도해 보겠습니다. 여기에서도 우리는 MetaEditor의 현재의 기능에서 벗어나 이번에는 MQL5 Algo Forge 웹 인터페이스를 추가로 사용해야 합니다. 명령줄 기반 Git 작업에 어려움을 느끼는 개발자에게는 이 방법이 절충안을 제공합니다. MQL5 Algo Forge의 웹 인터페이스에서 원하는 원본 리포지토리를 포크할 수 있습니다. 

포크는 버전 관리 시스템 및 협업 개발 플랫폼(MQL5 Algo Forge 포함)의 기본 개념입니다. 이는 플랫폼 내에서 원본 리포지토리의 완전하고 독립적인 사본을 만드는 과정을 의미합니다.

사용자가 다른 사람의 리포지토리를 포크하면 플랫폼은 해당 사용자의 계정 아래에 정확한 사본을 만듭니다. 이 복사본은 포크 당시 소스 프로젝트의 모든 변경 내역, 브랜치 및 파일을 상속하지만 그 순간부터는 뱔도의 리포지토리가 됩니다. 새 소유자는 원본에 영향을 주지 않고 자유롭게 수정할 수 있습니다.

따라서 포크를 사용하면 모든 사용자가 기존 프로젝트를 기반으로 자신만의 방법으로 개발하여 코드의 새로운 진화를 효과적으로 만들 수 있습니다. 이 개념을 통해 오픈소스 생태계 내에서 파생 프로젝트와 대체품을 만들 수 있습니다.

포크는 사용자가 직접 쓰기 권한이 없는 프로젝트에 변경 사항을 기여하는 주요 수단이기도 합니다. 표준적인 절차는 다음과 같습니다. 포크를 만들고 필요한 변경 사항을 구현 및 테스트한 다음 2부에서 이미 다룬 풀 리퀘스트를 통해 제안된 개선 사항을 원본 리포지토리의 관리자에게 알립니다. 이것이 바로 분산형 협업 개발 모델의 기본입니다.

포크는 독립적이지만 소스 리포지토리에 대한 기술적 관련성을 유지합니다. 이렇게 하면 원본의 변경 사항을 추적하고 여러분에 포크에 동기화하고 업스트림 프로젝트의 새 커밋을 자신의 프로젝트에 병합할 수 있습니다.

포크와 단순 복제를 구분할줄 알아야 합니다. 복제는 특정한 컴퓨터에 리포지토리의 로컬 복사본을 만드는 것을 말하며 포크는 플랫폼 자체에 완전한 복사본을 만들어 다른 사용자의 소유 하에 새로운 원격 리포지토리를 설정하는 것입니다.

따라서 우리가 리포지토리를 포크 한다는 것은 우리의 자체 리포지토리를 가진다는 것입니다. 또한 이 포크는 MetaEditor의 Shared Projects 목록에 표시되며 MetaEditor를 통해 직접 복제될 수 있습니다.


포크 작업 테스트

페르난도 카레이로의 친절한 도움 덕분에 이 메커니즘을 실제로 테스트할 수 있었습니다. 우리는 그의 리포지토리( )를 포크 하는 동시에 원본 리포지토리를 MQL5 Algo Forge 웹 인터페이스의 알림 및 스타 목록에 추가했습니다.

예상대로 MetaEditor의 Shared Projects 아래에 표시된 리포지토리 목록에 포크가 나타났습니다:

이를 통해 새로 만든 FMIC 리포지토리의 fork를 로컬 컴퓨터에 성공적으로 복제할 수 있었습니다.

다음으로 업데이트가 포크에 어떻게 반영되는지 테스트할 수 있도록 Fernando에게 몇 가지 변경 사항을 커밋해 달라고 요청했습니다. 그는 헤이킨 아시 글을 설명하는 샘플 README.md 파일을 추가하고 리포지토리에 커밋했습니다.

그 후 웹 인터페이스에서 실제로 새로운 변경 사항에 대한 알림을 볼 수 있었습니다:

그러나 이러한 알림은 아직 MQL5 Algo Forge에 저장된 포크나 컴퓨터의 로컬 복제본에는 영향을 미치지 않았습니다. Fernando의 변경 사항을 리포지토리로 가져와 보겠습니다. 먼저 로컬 복제본에 최신 변경 사항이 실제로 누락이 되었는지 확인합니다:

로컬 기록의 마지막 커밋은 2025년 8월 27일로 Fernando의 변경은 그 이후에 이루어졌습니다.

이제 웹 인터페이스의 포크를 방문하면 main 브랜치가 원래 리포지토리보다 세개의 커밋 뒤에 있다는 메시지가 표시됩니다:

또한 싱크 버튼이 표시되는데 우리의 main 폴더를 업스트림 브랜치와 동기화해야 한다는 것입니다. 그런 다음 커밋 기록을 확인하면 이전에는 없던 2025년 9월 5일 날짜의 새로운 커밋 세 개를 확인할 수 있습니다:

즉 원본 리포지토리에서 이루어진 모든 커밋은 먼저 MQL5 Algo Forge의 포크로 성공적으로 전파된 다음 해당 포크의 로컬 클론으로 전파된 것입니다.

이 메커니즘에 대해 더 자세히 알아보려면 다음 GitHub 문서 섹션을 참조하는 것이 좋습니다: 

이 문서는 MQL5 Algo Forge를 위해 별도로 작성된 것은 아니지만 대부분의 웹 인터페이스는 유사하게 작동하며 콘솔 Git 명령은 호스팅 플랫폼에 관계없이 보편적으로 적용할 수 있습니다. 물론 플랫폼이 Git을 기반으로 한다는 전제하에 말입니다.

예를 들어 upsteam configuration 가이드라인에 따라 모든 풀/푸시 작업이 원본 리포지토리에 대해 포크 클론도 업데이트하도록 동기화를 설정할 수 있습니다:

하지만 MetaEditor와 MQL5 Algo Forge 웹 인터페이스를 통해서만 작업하는 경우에는 이 추가 구성 단계가 꼭 필요한 것은 아닙니다.


SmartATR 포크

이제 원래 사용하려고 했던 리포지토리로 돌아가 보겠습니다. SmartATR 리포지토리에 대해 동일한 단계 즉 MQL5 Algo Forge 웹 인터페이스를 통해 포크를 생성하고 로컬로 복제하는 단계를 해 보겠습니다.

탐색 섹션에서 리포지토리 이름을 입력하여 원본 리포지토리를 검색하는 것으로 시작합니다:

리포지토리에는 이미 다른 사용자가 만든 여러 개의 포크가 있으므로 검색 결과에도 해당 포크가 표시됩니다. 실제 원본을 포크하려면 결과를 더 아래로 스크롤하여 steverosenstock/SmartATR 페이지를 엽니다.

거기서 포크 버튼을 클릭합니다:

클릭하면 포크 생성 설정 페이지로 넘어갑니다. 여기에서 포크된 리포지토리의 이름을 변경하고(리포지토리 목록에 표시됨) 원본에서 어떤 브랜치를 포함할지 지정하고 원하는 경우 리포지토리 설명을 편집할 수 있습니다:

기본 설정은 포크는 원본 리포지토리의 정확한 복사본으로 만들어집니다. 우리에게는 완벽하게 작동하므로 "Fork repository"를 클릭하기만 하면 됩니다.

포크가 성공적으로 생성되었습니다:

다음으로 이 리포지토리를 우리의 로컬 컴퓨터에 복제합니다. 이 작업을 수행하기 전에 이전에 복제된 원본 SmartATR 폴더를 로컬 컴퓨터에서 삭제합니다. MetaEditor가 이미 열려 있는 경우 Shared Projects 컨텍스트 메뉴에서 새로 고침을 선택하여 폴더 목록을 새로 고쳐야 합니다. 그 후 SmartATR 폴더가 나타나면 해당 폴더의 컨텍스트 메뉴에서 'Git Clone'을 선택합니다: 

SmartATR 프로젝트가 성공적으로 복제되었습니다:

이제 변화를 시작할 준비가 되었습니다.


변경하기

우리의 목표는 특정 오류를 해결하거나 최소한 무력화시키는 수정 사항을 소개하는 것입니다. 그러므로 이 목적을 명확하게 반영하는 이름(예: fixes/news-impact)을 가진 새로운 브랜치를 만드는 것부터 시작합니다:

그런 다음 프로젝트의 컨텍스트 메뉴에서 "Git Branches → fixes/news-impact"을 선택하여 이 브랜치로 전환합니다.

원래 브랜치 이름에 슬래시("/")를 포함했지만 실제로는 해당 문자가 하이픈("-")으로 자동 대체된 상태로 브랜치가 생성되었습니다. 이는 분기 이름에 라틴 문자와 하이픈만 허용하는 MetaEditor에서 부과한 제한입니다. 기술적으로 Git 자체는 슬래시를 허용하며 웹 인터페이스를 통해 슬래시를 포함하는 브랜치를 자유롭게 만들 수 있습니다. 

이 제한이 얼마나 중요한지 테스트해 보겠습니다. 이번에는 이름에 슬래시를 명시적으로 포함하는 또 다른 브랜치를 MQL5 Algo Forge 웹 인터페이스에 직접 만들겠습니다. Branches 페이지에서 main 브랜치를 기본으로 사용하여 New branch를 선택합니다:

브랜치가 성공적으로 생성되었습니다:

그러나 MetaEditor에서 Pull을 실행하려고 하면 오류 메시지가 표시됩니다:

그럼에도 불구하고 이름에 슬래시가 있는 새 브랜치는 MetaEditor 내의 브랜치 목록에 나타나며 해당 브랜치로 전환하면 더 이상 문제 없이 작동합니다:

특이한 형상입니다. 이제 fixes-news-impact로 다시 전환하고 컴파일 오류의 원인을 제거하는 임시 수정 사항을 소개합니다:

지표가 오류 없이 컴파일되면 컨텍스트 메뉴 옵션 'Git Commit'을 통해 변경 사항을 커밋합니다: 

커밋 대화 상자에서 수정된 파일 목록을 확인합니다. 이 경우 파일 하나만 변경했기 때문에 확인은 간단합니다. 수정 사항의 성격을 설명하는 설명 주석을 추가하는 것이 좋습니다. 모든 것이 올바른지 확인한 후 확인을 누릅니다.

이제 변경 사항이 커밋되고 MQL5 Algo Forge의 SmartATR 리포지토리 포크에 푸시되었습니다. 이 단계에서 수정된 버전의 지표는 이미 로컬에서 사용될 수 있으며 안전한 사본도 리포지토리에 저장됩니다. 선택적으로 리포지토리의 웹 인터페이스에서 'New pull request'를 눌러 원래 프로젝트 작성자에게 풀 리퀘스트를 제출할 수도 있습니다:

하지만 이는 코드를 개선하는 것이 아니라 단순히 일부 기능을 비활성화하는 수정이기 때문에 아직은 시기상조입니다. 현재로서는 풀 리퀘스트를 만들지 않습니다.

SmartATR 지표를 Simple Candles 프로젝트에 통합할 준비가 되었습니다.


지표 통합하기

모범 사례에 따라 develop 브랜치를 기반으로 Simple Candles 프로젝트 리포지토리에 새 브랜치( article-19436-forge3 )를 생성합니다. 이의 접근 방식을 다양화하기 위해 MQL5 Algo Forge 웹 인터페이스를 사용하여 이 브랜치를 생성합니다.

브랜치를 로컬에 표시하려면 MetaEditor에서 'Git Pull'을 실행한 다음 새 브랜치 article-19436-forge3로 전환합니다.

우리는 트레이딩 전략에 지표를 적용하려는 것이므로 SimpleCandlesStrategy.mqh의 전략 클래스 구현에 직접 지표를 추가하고 지표 핸들을 저장하는 클래스 필드를 만듭니다:

//+------------------------------------------------------------------+
//| Trading strategy using unidirectional candlesticks               |
//+------------------------------------------------------------------+
class CSimpleCandlesStrategy : public CVirtualStrategy {
protected:
   //...

   int               m_iATRHandle;        // SmartATR indicator handle

   //...
};

다음으로 클래스 생성자에서 iCustom()을 호출하여 필요한 심볼, 기간, 지표 파일 경로 및 해당 매개 변수를 전달합니다:

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CSimpleCandlesStrategy::CSimpleCandlesStrategy(string p_params) {
// Read the parameters from the initialization string
   // ...

   if(IsValid()) {
      // Load the SmartATR indicator
      m_iATRHandle = iCustom(
                        m_symbol, m_timeframe,
                        "Shared Projects/SmartATR/SmartATR.ex5",
                        // Indicator parameters
                        m_periodATR,   // Initial ATR period (used for first calculation, adaptively changes)
                        false,         // Enable adaptive period (dynamic lookback)
                        7,             // Minimum ATR period (adaptive mode)
                        28,            // Maximum ATR period (adaptive mode)
                        false,         // Weight True Range by volume
                        false,         // Weight True Range by economic news events (MT5 Calendar)
                        2.0,           // Multiplier: alert if ATR exceeds this factor of average
                        false          // Enable pop-up & sound alerts on high volatility
                     );

      // ...
   }
}

지표에 지정된 경로에 유의하세요. 경로는 Shared Projects로 시작하여 프로젝트 폴더 이름 SmartATR, 지표 파일 이름 SmartATR.ex5로 이어집니다. .ex5 확장자를 포함하는 것은 선택 사항이지만 이 확장자를 유지하면 혼란을 피할 수 있습니다.

Shared Projects 폴더에서 작업할 때 주의해야 할 중요한 뉘앙스가 한 가지 있습니다. 여러분 자신의 프로젝트와 포크된 프로젝트 모두를 나타냅니다. 컴파일된 모든 실행 파일이 리포지토리 폴더에 직접 저장되는 것이 아닙니다. 이는 Shared Projects 폴더가 터미널 데이터 루트 폴더에 있기 때문입니다: MQL5/Shared Projects. 한편으로는 이는 버전 관리 시스템이 인덱싱 실행 파일을 제안하지 않기 때문에 좋은 점입니다. 반면에 처음에는 다소 혼란스러울 수 있습니다: 컴파일된 Expert Advisor 및 지표 파일은 어디에서 찾을 수 있나요?

실제로는 EA의 경우 MQL5/Experts, 지표의 경우 MQL5/Indicators와 같은 각각의 표준 폴더에 만들어집니다. 그 안에 Shared Projects 하위 디렉터리가 자동으로 생성됩니다. 따라서 컴파일된 파일은 해당 하위 폴더에 바로 생성됩니다. 즉, MQL5/Shared Projects/SmartATR.mq5 에서 파일을 컴파일하면 MQL5/Indicators/Shared Projects/SmartATR/SmartATR.ex5.애 실행 파일을 생성합니다.

따라서 iCustom() 호출은 MQL5/Indicators와 관련한 지표 경로를 참조해야 합니다.

마지막으로 EA 파일 SimpleCandles.mq5를 컴파일하고 전략 테스터에서 실행합니다. 로그에는 다음과 같은 내용이 표시됩니다:

이제 SmartATR 지표가 성공적으로 로드되고 초기화되었으며 사용할 준비가 되었습니다. 현재로서는 통합을 시연하는 단계에 불과합니다. 나중에 전략적 로직에 실제 사용을 위한 것들을 추가할 수 있습니다. 이러한 변경 사항을 커밋하고 MQL5 Algo Forge 리포지토리에 푸시합니다.


결론

이 글에 우리는 MQL5 Algo Forge가 개발자에게 어떻게 더 유연한 워크플로우를 제공하는지에 대해 살펴보았습니다. 이전에는 우리의 자체 리포지토리만 검토했지만 여기서는 타사 리포지토리의 외부 라이브러리를 프로젝트에 성공적으로 통합했습니다.

주요 내용은 포크를 기반으로 한 올바른 워크플로, 즉 업스트림 프로젝트와 동기화 상태를 유지하면서 전체 수정이 가능한 외부 저장소의 개인 복사본을 만드는 것이었습니다. SmartATR을 심플 캔들에 성공적으로 통합하면 저장소를 찾고 포크 하는 것부터 라이브 트레이딩 전략에 코드를 수정하고 적용하는 것까지 이러한 접근 방식을 지원합니다.

중요한 점은 이 프로세스가 향후 업데이트를 기다릴 필요 없이 현재의 MetaEditor만으로 이루어졌다는 점입니다. MetaEditor의 한계(타사 리포지토리에 직접 액세스할 수 없고 브랜치 이름 지정이 제한되는 등)는 MQL5 Algo Forge 웹 인터페이스와 필요한 경우 표준 Git 콘솔 명령으로 보완하여 쉽게 극복할 수 있습니다. 이 시스템은 이미 실용적으로 사용할 수 있으며 나머지 인터페이스의 단점은 장애물이 아니라 불편함에 지나지 않습니다.

하지만 여기서 멈추지 마세요. 앞으로도 리포지토리를 사용하여 프로젝트를 분리하고 그 과정에서 얻은 경험을 공유할 것입니다.

관심을 가져 주셔서 감사합니다! 곧 다시 뵙겠습니다!

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/19436

트레이딩에서 카오스 이론(1부): 소개, 금융 시장에서의 적용 및 리아푸노프 지수 트레이딩에서 카오스 이론(1부): 소개, 금융 시장에서의 적용 및 리아푸노프 지수
카오스 이론이 금융 시장에도 적용될 수 있을까요? 이 글에서 우리는 기존의 카오스 이론과 카오스 시스템이 빌 윌리엄스가 제안한 개념과 어떻게 다른지 살펴볼 것입니다.
MQL5의 주문에 대한 이해 MQL5의 주문에 대한 이해
트레이딩 시스템을 만들 때 효과적으로 처리해야 하는 작업이 있습니다. 이 작업은 주문 접수 또는 생성된 트레이딩 시스템이 자동으로 주문을 처리하도록 하는 작업으로 모든 트레이딩 시스템에서 매우 중요합니다. 따라서 이 기사에서는 주문 접수의 측면에서 거래 시스템을 효과적으로 만들기 위해 여러분이 이해해야 하는 대부분의 주제를 찾을 수 있습니다.
트레이딩에서 카오스 이론(2부): 더 깊이 알아보기 트레이딩에서 카오스 이론(2부): 더 깊이 알아보기
금융 시장에서의 카오스 이론에 대해 계속 알아보겠습니다. 이번에는 통화 및 기타 자산 분석에서 카오스 이론의 적용 가능성에 대해 살펴보겠습니다.
MQL5 Algo Forge로 이동하기(2부): 여러 리포지토리로 작업하기 MQL5 Algo Forge로 이동하기(2부): 여러 리포지토리로 작업하기
이 글에서 우리는 프로젝트의 소스 코드를 공용 리포지토리에 저장하는 방법 중 하나에 대해 알아볼 것입니다. 프로젝트 개발을 위한 명확하고 편리한 규칙을 수립하기 위해 여러 브랜치에 코드를 배포할 예정입니다.