English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
MQL4 및 MQL5 개발 프레임워크 내 OpenAI의 ChatGPT 기능

MQL4 및 MQL5 개발 프레임워크 내 OpenAI의 ChatGPT 기능

MetaTrader 5트레이딩 | 1 7월 2024, 11:04
427 0
Evgeniy Ilin
Evgeniy Ilin

콘텐츠



소개

이제 기본부터 시작하겠습니다. 이 기술은 사람들이 다양한 작업을 해결하는 데 도움이 되도록 설계된 OpenAI의 인공 지능에서의 변형 기술 중 하나입니다. 이 도구는 일반 메신저 채팅처럼 보입니다. 그러나 다른 쪽 끝에는 텍스트 형식으로 여러분의 질문에 답변을 하는 소위 인공 지능이 있습니다.

물론 커뮤니케이션 텍스트로만 가능하도록 제한되어 있지만 다양한 문제를 해결하거나 새로운 것을 배우기에는 충분합니다. 이 텍스트 채널은 숙련된 번역 및 기타 능력은 말할 것도 없고 프로그래밍, 수학, 물리학, 화학 등 여러가지 완전히 다른 문제를 해결하는 데 적합합니다.

우리는 수익성 있는 트레이딩 시스템 개발 측면에서만 이 모델을 살펴볼 것입니다. 저는 트레이딩 시스템을 더 빠르고 쉽게 개발하기 위해 이 기술을 최적으로 올바르게 사용하는 방법에 관심이 생겼습니다. 궁극적으로 기술을 의도한 목적에 맞게 올바르게 적용하기 시작하는 사람이 개발 비용과 인건비를 모두 절감할 수 있으므로 경쟁 우위를 확보할 수 있습니다.


MQL5에서 ChatGPT 사용

기술의 전망에 대해 좀 더 자세히 살펴보겠습니다. 제가 제 자신의 작업을 자세히 연구한 결과 이러한 기술은 정말 위대한 것의 시작에 불과하다는 것을 깨달었습니다. 이 기술의 다음과 같은 기능을 높이 평가 할 수 있습니다:

  • 모든 MQL4 및 MQL5 코드 생성
  • 작업 코드 리팩토링 및 최적화
  • 코드 정리
  • 코드에 코멘트 추가하기
  • 오류 수정
  • 수학적 모델 구현
  • 수학적 모델에 기반한 후속 코드 구축
  • 알려진 모든 알고리즘 및 수학적 모델의 현대화
  • EA 개발 프로세스 속도 향상
  • 방대한 양의 정보

이 목록은 결코 최종적인 것이 아니며 여기에 여러분만의 것을 추가할 수 있습니다. 저는 사람들이 이런 종류의 기술에 대해 배우게 되면 대략 세 가지 하위 그룹으로 나뉘기 시작한다고 생각합니다:

  1. "이제 우리는 슈퍼 알고리즘을 만들 것입니다"
  2. AI를 경계하고 그 유용성에 의문을 제기하는 사람들
  3. 기계가 사람보다 나을 수는 없습니다. 이것은 또 다른 과대 광고일 뿐입니다.

저는 오래 전에 이 기술에 대해 알았고 처음에는 세 번째 범주에 속했습니다. 이 AI를 다룬 처음 이틀 동안 저는 갑자기 세 번째 범주에서 첫 번째 범주로 이동한 후 제 자신의 신념을 조정하는 더 흥미롭고 다소 불쾌한 과정이 시작되었으며 이는 이미 이 기술에 대한 보다 현실적인 평가 인 "1.5"범주로 롤백하는 것과 같았습니다.
이 기술은 유용합니다. 그러나 여러분이 처음에 생각했던 것만큼 유용하지는 않습니다. 이와 관련하여 이 기술의 개발자와 마케팅 담당자에게 경의를 표할만 합니다. 처음 며칠 동안 이 기술의 사용을 통해 "와우" 효과가 발생하고 여러분 스스로 이 기술을 홍보하게 되는 연쇄 반응이 충분히 일어난다는 사실만으로도 이 기술의 개발자와 마케팅 담당자에게 경의를 표할 가치가 있습니다.

이를 이해하려면 여러분은 이 인공지능을 다루는 데 많은 연습이 필요합니다. 저는 개인적으로 다양한 주제에 대해 이 인공지능과 약 100가지의 다양한 대화를 나눴습니다. 저는 제가 이 기술을 MQL5에 사용하기 시작할 만큼 충분한 연습이 되었다고 말할 수 있습니다. 이제 실제 애플리케이션으로 넘어가기 전에 저는 몇 가지 중요한 정보를 여러분께 알려드리고자 합니다. 이를 위해 이 기술의 내부를 더 자세히 살펴볼 필요가 있습니다.


ChatGPT와 관련한 잠재적 위험

이 기술을 사용하는 초기에 경험하게 될 소위 "와우" 효과는 주로 질문을 답변으로 바꾸도록 설계된 텍스트 모델이라는 사실 때문입니다. 그 대답이 마음에 드는 이유는 제작자가 이 모델이 아름답게 거짓말하도록 가르쳤기 때문입니다. 네, 농담이 아닙니다! 너무 아름답게 거짓말을 해서 여러분 스스로 믿고 싶을 정도이며 여러 번 이러한 과정을 거친 후에도 모델은 종종 다음과 같은 내용을 말합니다:

  • 죄송합니다! 네, 맞습니다. 제가 작은 실수를 저질렀습니다. 앞으로 이 점을 고려하겠습니다. (실제로는 그렇지 않습니다. 이것은 의미 없는 약속일 뿐입니다)
  • 잘못 이해해서 죄송합니다. 제가 실수를 저질렀습니다. 수정된 버전은 다음과 같습니다. (더 많은 오류 포함)
  • 귀하는 모델이 계산 중 실수를 한 것을 발견할 수 있을 것입니다. (사실 이 모델은 계산을 전혀 하지 않았고 어디선가 대략적인 숫자를 찾았을 뿐입니다.)
  • 귀하가 코드에서 오류를 감지했습니다. (모델이 다시 변명하고 사용자를 속이려고 하는 것입니다.)
  • 이 모델은 작업을 실행한 것을 모방하여 사용자가 요청한 작업을 수행한 것처럼 보이려고 합니다. (실제로는 인공지능이 어딘가 에서 비슷한 것을 찾아서 제공하는 것일 뿐입니다.)
  • 죄송합니다! 도와드릴 수 없습니다. (이 답변은 모델이 자신의 거짓말이나 실수를 감지한 경우 발생합니다.)
  • 이 모델은 조화롭고 일관된 답변이라는 인상을 여러분에게 주기 위해 답변에 과도한 단어를 많이 추가합니다. (제 생각으로 이는 리소스 비용의 최적화와도 관련이 있다고 생각합니다.)

요컨대 모델은 여러분의 '프롬프트'의 불완전성을 이용하면서 가능한 모든 방법으로 제공된 작업을 건너뛰려고 시도합니다. 실수가 있는 경우 인공지능은 그 작업에 대해 여러분이 인공지능 실수를 알아차리지 못하는 방식으로 자신을 정당화하려고 시도하고 여러분이 이러한 인공 지능의 수작을 알아차리게 된 것을 알게 되면 인공지능은 특정 답변과 심리적 속임수로 여러분의 부정적인 태도를 부드럽게 하려고 노력할 것입니다. 일반적으로 제가 생각하기로는 알고리즘은 사용자 만족도가 높은 최적의 리소스 소비에 맞춰져 있다고 생각합니다. 즉 이 경우의 목표는 여러분에게 문제에 대한 가장 높은 품질의 솔루션을 제공하는 것이 아니라 다른 가능한 이유를 사용해 여러분이 고려하는 솔루션을 제공하는 것입니다. 목표는 사용자의 긍정적인 반응입니다. 작업이 올바르게 해결되었는지 여부는 그다지 중요하지 않다는 것입니다. 이것이 바로 이 인공 지능이 추구하는 목표입니다. 마케팅 관점에서 볼 때 이는 맞는 길이며 이러한 점에서 AI는 설득력이 있을 수 있습니다.

이 모든 것을 고려할 때 저는 이러한 측면에서 인공지능이 마음대로 할 수 있는 자유를 최소화하기 위해서는 우선 인공지능과 우리가 의사 소통을 하는 경험을 쌓고 어떤 유형의 작업이 이러한 식으로 인공 지능의 이러한 능력, 다시 말해 우리를 설득하는 능력을 사용하지 않을 수 있을지 그 결론을 도출해야 한다는 것을 깨달았습니다. 왜냐하면 이러한 인공 지능의 작동 방식을 고려할 때 우리가 인공 지능에 대해 잘못 알고는 인공 지능이 우리의 요청을 쉽게 이행하는 것처럼 느끼게 되거나 현실에 맞지도 않는 상상력을 우리에게 불러 일으키게 하는 것보다는 직접적인 답변을 우리에게 제공하도록 하는 것이 훨씬 쉬울 것이기 때문입니다. 인공지능의 이러한 트릭은 리소스 비용 측면에서 효율적이지 않습니다. 사용자를 속이는 것은 수익성이 없지만 진정한 답변을 제공하는 것이 훨씬 쉬울 것입니다.

인공지능에게 질문을 하는 방법을 이해하려면 우리는 다음 사항을 이해해야 합니다:

  1. '프롬프트'의 구조와 유형은 그다지 중요하지 않으며 질문의 세부 사항과 품질이 더 중요합니다. (모델은 모든 것을 이해하므로 프롬프트 작성 방법에 대한 인터넷 가이드를 읽을 필요가 없습니다. 여러분이 원하는 대로 작성하되 속어는 사용하지 마세요.)
  2. 복잡한 질문이나 요청은 하위 단락으로 나누세요. (질문을 단순화하고 나누면 더 정확하고 간단하며 명확한 답변을 얻을 수 있습니다.)
  3. 질문이 더 스마트하고 정확할수록 더 유용한 답변을 얻을 수 있습니다.
  4. 인공지능은 대단한 아이디어나 알고리즘을 제공하지는 않습니다. (이 모델은 사고력, 계획력, 지적 창의력의 폭이 넓지 않습니다. 그러나 처음에는 제가 말씀드렸듯이 인공 지능은 거짓말을 매우 잘 하기 때문에 무언가를 만들 수있는 것처럼 보일 것입니다).
  5. 우리는 업무 속도를 높이고 인건비를 절감한다는 맥락에서만 이 기술의 활용을 생각해야 합니다.
  6. 여러분의 각각의 새로운 요청은 대화의 전체와는 연관성이 최소화되어야 합니다. (모델은 전체 대화 내용을 기억하지 못하며 오래된 메시지는 답장에 반영되지 않는 경우가 많습니다. 시도해 보시면 제 말이 무슨 말인지 이해하실 수 있을 겁니다.)
  7. 질문이 복잡하고 세부 사항이 많을수록 완전히 엉뚱한 답변이 나올 확률이 높아집니다. (두 번째 하위 내용에 대한 설명입니다.)
  8. 이 모델은 인터넷에 액세스할 수 없으며 지식창고를 기반으로만 모든 답변을 생성합니다. (인터넷에서 하나의 데이터를 가져오라고 하면 자신의 데이터베이스에 있는 오래된 데이터를 제공하거나 사용자의 상황에 따라 답변을 조정하여 새로운 데이터인 것처럼 전달합니다. 이 점을 명심하세요. 모델은 귀하와 논쟁하고 싶어지 않고 여러분으로 하여금 이 모델이 모든 것을 수행했다고 느끼게 하는 것이 더 낫다는 것을 알고 있습니다.
  9. ChatGPT 3.5는 2019년까지 훈련되었습니다. (즉, 2019년 이후에는 개발자가 승인한 다음 교육 세션까지 이벤트에 대한 정보가 없습니다.)
  10. ChatGPT 4.0은 2021년까지 훈련되었습니다. (이 모델은 거짓말을 거의 하지 않고 항상 정확하게 대답하려고 노력하기 때문에 더 좋습니다. 질문하고 비교해 보면 3.5가 노골적으로 거짓말을 하고 있다는 것을 알 수 있습니다.)

사실 이 기술에 대한 인상을 망치는 다른 작은 불쾌한 경험들이 많이 있습니다. 하지만 그럼에도 불구하고 이 기술이 유용하지 않다면 저는 이 글을 쓰지 않았을 것입니다. 이 모든 것은 이것이 결코 인공 지능이 아니라는 사실로 귀결됩니다. 그러나 우리가 실용적 이려고 하고 모든 것이 그렇게 나쁘기만 한 것인지를 생각해보고 이 기술의 도움으로 반복적인 작업을 더 빠르고 더 잘 수행할 수 있는지 생각해 본다면 우리의 판단이 너무 가혹하지 않을 것이라고 확신합니다. 우리는 이 모든 것을 트레이딩 시스템 개발에 어떻게 활용할지 고민하기만 하면 됩니다.

이 섹션을 마무리하면서 저는 여러분이 항상 기억해야 할 가장 중요하고 기본적인 사항에 대해 말씀드리고자 합니다:

  • 항상 ChatGPT 답변, 특히 숫자, 수식 및 생성된 코드를 다시 확인하세요.

저는 수학과 프로그래밍에 대한 해박한 지식이 있고 그 덕분에 이 모델의 실수와 단점과 관련한 많은 사례를 보았고, 꽤 흔하다고 말할 수 있습니다. 생성된 텍스트의 관점에서 보면 사소해 보일 수 있습니다. 그러나 수학이나 코드를 다룰 때는 아주 사소한 실수라도 전체 솔루션을 쓸모없게 만들 수 있습니다. 따라서 항상 답을 다시 확인하고 실수를 수정하고 모델의 주의를 환기시키세요 때로는 한동안 올바르게 응답할 때도 있습니다. 앞으로 이 글에서 다룰 내용은 무엇보다도 EA를 개발할 때 매우 유용합니다.


ChatGPT를 사용하여 코드에 사용할 수학적 문제를 해결하고 개발할 수 있는 기회

이 모델은 텍스트 형식입니다. 그러므로 여러분은 만약 여러분이 올바른 형식으로 방정식을 작성하면 이 인공 지능이 이 방정식을 이해하고 수학적 변환을 수행하여 문제를 해결할 것이라고 생각하기 쉽습니다. 많은 트레이딩 시스템을 개발할 때는 수학적인 방정식과 표현식을 만드는 데 도움이 필요합니다. 이후 이러한 식을 코드에서 구현하여 수학적 문제를 해결할 수 있습니다. 수학 방정식을 작성하는 데는 다음과 같은 형식이 있으며 ChatGPT는 이를 이해하고 답을 제공하는 데 사용합니다:

  • LaTeX

방정식 작성에 라텍스 형식을 사용하는 예시입니다:

코드:

E &=& mc^2\\
m &=& \frac{m_0}{\sqrt{1-\frac{v^2}{c^2}}}

이를 라텍스 변환기에 붙여 넣으면 익숙한 모든 표현식의 데이터적인 시각화를 얻을 수 있습니다:

아인슈타인의 에너지 및 상대론적 질량 팽창 방정식

이제 모델의 라텍스 형식의 모범 답안을 시각적으로 해석하는 방법이 명확 해졌다고 생각합니다. 가장 중요한 것은 답변에 수학식이 포함된 경우 모델에 이 형식의 방정식을 생성하도록 요청하는 것을 잊지 마세요. 그림이나 다른 형식의 방정식을 우리가 필요한 형식의 그림 등으로 다시 변환할 수 있는 신경망도 있습니다. 필요한 경우 여러분은 이러한 도구를 찾을 수 있을 것입니다. 여기서의 제 임무는 여러분께 그러한 가능성이 존재한다는 것을 보여드리는 것입니다.

ChatGPT 이외에도 신경망과 이미지를 라텍스 형식으로 다시 변환하는 기능을 결합한 텔레그램 봇이 있습니다. 원하신다면 제 프로필에서 그 중 하나를 찾아보실 수 있습니다. 이 봇은 제 친구가 만들고 제가 직접 테스트한 것입니다.

예를 들어 여러분은 ChatGPT가 부등식이나 방정식을 수치와 명시적으로 모두 풀도록 요청할 수 있습니다. 방정식이나 부등식, 미분 방정식이나 적분 뿐만 아니라 방정식이나 부등식을 풀거나 필요한 수학적 변환을 수행하도록 요청할 수도 있습니다. 그러나 수학자로서 저는 이 인공 지능이 항상 효율적이고 합리적으로 수행되는 것은 아니며 때로는 작업을 완료하지 못한 채로 남겨두기도 하는 것을 보았습니다. 따라서 재차 확인이 필요합니다.

물론 이 기능은 수학자가 아닌 분들에게 유용할 수 있습니다. 그러나 오래 연속하여 사용하게 되면 여러분은 더 많은 실수를 하게 되고 여러분의 솔루션이 매우 비합리적이고 서투르게 될 것입니다. 그러나 여러분은 코드의 수학적인 문제 중 일부를 다룰 것입니다. 코드가 일반적으로 수치적인 방법만 사용하는 반면 적용된 수학은 그리 복잡하지 않다는 점을 감안해서 말입니다. 여기에는 미분 수학이 없습니다.


MQL4 및 MQL5에서 코드 생성을 위한 올바른 접근 방식

이제부터 상황이 흥미로워집니다. 충분히 높은 품질과 어느 정도 괜찮은 결과를 내는 트레이딩 시스템의 코드는 그 크기가 상당히 크다는 점을 감안할 때 이러한 코드를 생성하는 프로세스에 접근하는 방법에 대해 생각해 봐야 합니다. 여기서 가장 큰 장애물은 질문에 대한 답변의 크기가 특정 문자 수로 제한되어 있다는 사실이고 크고 복잡한 코드를 생성하려고 여러 번 시도한 끝에 저는 각 코드 출력은 충분히 짧아야 한다는 결론에 도달했습니다. 즉 코드가 부분적으로 표시되어야 합니다. 이를 어떻게 달성할 수 있을까요? 답은 간단합니다 - 우리는 EA 지표 또는 스크립트를 개발하기 위한 계획을 세워야 합니다.

이 계획은 각 하위 항목이 독립적으로 기능할 수 있는 별도의 하위 작업이어야 한다는 조건으로 작성해야 합니다. 그런 다음 우리는 각 하위 작업을 순차적으로 해결한 다음 모든 코드를 하나로 결합하면 됩니다. 이 접근 방식의 또 다른 장점은 우리가 각각의 각 하위 작업을 개별적으로 마무리할 수 있으며 각 하위 작업은 모두 합친 것보다 간단하기 때문에 마무리 작업을 더 빠르고 편안하게 수행할 수 있다는 것입니다. 이 방법은 오류를 방지할 수 있습니다.

개발자로서 저는 AI의 간섭을 받지 않고 EA의 주요 아키텍처를 독립적으로 생각하는 것이 훨씬 더 편했습니다. 대신 저의 EA에서 별도의 구분된 절차 구현하도록 합니다. 모든 주요 로직은 절차에 포함되도록 하세요. 다시 말해 빈 함수로 대략적인 코드 템플릿을 구현한 다음 각 함수를 개별적으로 구현하도록 요청하기만 하면 됩니다. 우리는 인공 지능이 함수 프로토타입이나 기타 구조를 구현하도록 요청할 수도 있습니다.

이러한 접근 방식의 또 다른 중요한 장점은 여러분의 요구 사항을 수행하는 EA 또는 기타 코드에 대한 계획을 준비하도록 인공 지능에게 요청하고 그 계획을 하나씩 간단히 구현할 수 있다는 것입니다. 만약 여러분이 EA의 알고리즘이 어떻게 작동할지 그리고 인공 지능이 어떤 지표나 다른 접근 방식을 사용할지에 대해 대략적이거나 정확하게 파악하고 있으면 좋습니다. 그러나 그런 아이디어가 없다면 먼저 EA와 대화하여 EA의 거래 전략을 선택하는 데 도움을 요청할 수 있습니다. 그러면 인공 지능이 몇 가지 옵션을 여러분에게 제공할 것입니다. 이 과정을 예로 들어 보겠습니다.

이제 위의 내용을 요약하고 새로운 EA를 처음부터 새로 구축할 때 취할 수 있는 과정을 나타내는 간단한 하위 포인트를 만들어 보겠습니다. 우선 이 시작을 위한 몇 가지 가능한 시나리오가 있습니다:

  1. 우리는 미래의 코드 아키텍처를 결정하지 않았고 어디서부터 시작해야 할지 모르며 거래에 대해 어떠한 접근 방식을 선택해야 할지 전혀 알지 못합니다.
  2. 우리는 코드의 아키텍처를 아직 결정하지 않았고 어디서부터 시작해야 할지 모르지만 주요 작업 코드와 EA에서 우리가 원하는 것에 대한 대략적인 그림은 알고 있습니다.
  3. 우리는 우리에게 편안한 언제나 사용 가능한 아키텍처를 가지고 있지만 어떤 거래 방식을 선택해야 할지 전혀 알지 못합니다.
  4. 우리는 우리가 사용하고자 하는 아키텍처를 알고 있으며 향후 EA의 거래 로직에 대한 명확한 아이디어도 가지고 있습니다.

원칙적으로 모든 것이 유사한 구조로 축소됩니다. 다음과 같이 하면 네 가지 사항을 모두를 모든 거래 시스템 구축에 적용할 수 있습니다:

  • 아키텍처(메인 코드 또는 프레임워크)를 모르는 경우 먼저 이를 구현한 다음 이 프레임워크의 작동을 보장하는 모든 것을 구현해야 합니다.

예를 들어 클래스, 입력 변수, 필드 및 메서드 프로토타입, 인터페이스는 물론 우리가 요구하는 엔티티를 사용하는 EA의 주요 거래 기능을 구현하도록 요청할 수 있습니다. ChatGPT를 적절히 처리하면 전체 문자 수의 5~10% 이하로 코드를 구현할 수 있습니다. 이렇게 빠르게 구현한 다음 이후 전체 코드의 약 90%를 차지하는 나머지 절차를 구현하는 과정으로 넘어갈 수 있습니다. 이러한 여러 절차는 동일한 간단한 방식으로 구현됩니다. 개발의 과정에는 이러한 많은 절차가 있고 이를 매우 작고 쉽게 실행할 수 있기 때문입니다. 물론 여러분이 이미 만들어진 템플릿을 가지고 있고 이 모든 것을 구현할 필요가 없는 경우 훨씬 쉽지만 그러기 위해서는 지식과 경험이 필요합니다.


ChatGPT를 사용한 트레이딩 시스템 개발

이론적인 정보는 충분히 제공했다고 생각합니다. 이제 적용해야 할 때입니다. 제 경우에는 제가 가진 템플릿을 사용하여 EA를 작성합니다. 이전 글 중 하나에서 저는 이러한 패턴에 대해 설명한 적이 있습니다. 이 플랫폼의 특징은 단일 차트에서 활성화되는 여러 상품들이 동시에 거래되도록 한다는 것입니다. 이미 필요한 모든 거래 기능과 주요 아키텍처를 갖추고 있습니다. 이제 ChatGPT의 권장 사항을 엄격하게 준수하는 거래 시스템을 구축하겠습니다. EA의 주요 거래 로직과 시각적 구성 요소는 제가 직접 구현할 것입니다. 이 방법이 저는 더 편합니다.

여러분이 ChatGPT와 상호작용을 시작하게 되면 인공 지능에게 무엇을 해야 하는지 설명하는 데 훨씬 더 많은 노력을 기울이게 되고 일부 요청과 작업을 구현하면서 인공 지능의 답변의 오류를 수백 번 지적하며 수정하게 된다는 것을 알게 될 것입니다. 잠시 후 어떤 질문이 가치가 있고 어떤 질문이 가치가 없는지 알아 보시기 바랍니다. 시간을 낭비하지 않고 궁극적으로 시간을 절약할 수 있는 작업을 시작해 보시기 바랍니다. 여기에는 다소 얇은 선이 있으며 다른 방법은 없습니다. 모든 것은 실습을 통해 배게 됩니다. EA 설계에 대한 저의 접근 방식은 이러한 사항들을 고려하여 형성되었습니다.

저는 인공 지능에세 EA의 작동 원리가 무엇인지, 어떤 방법이나 지표를 사용할 것인지 등 EA의 기초를 설명하도록 요청했습니다(모델이 재량에 따라 사용 가능한 모든 정보를 사용할 수 있도록 허용했습니다). 동시에 다음 네 가지 술어에서 제가 읽기 쉬운 형식의 논리 조건이 필요하고 이 부분은 제가 직접 구현할 수 있다고 명시했습니다:

  1. 매수 포지션 진입하기.
  2. 매수 포지션 청산하기.
  3. 매도 포지션 진입하기.
  4. 매도 포지션 청산하기.

이러한 술어를 구현에 대해 모델은 다음과 같은 조건부 논리를 제공했습니다:

  1. 현재 가격이 EMA 위에 고정되어 있고, 현재 가격과 EMA의 차이가 ATR * 비율보다 작으며, RSI가 30 미만인 경우입니다.
  2. 현재 가격이 SMA 아래로 마감되었거나 현재 가격이 볼린저 밴드 지표의 상단 밴드 위로 마감되었습니다.
  3. 현재 가격이 EMA 아래에 갇혀 있고, 현재 가격과 EMA의 차이가 ATR * 비율보다 작으며, RSI가 70보다 큽니다.
  4. 현재 가격이 SMA 위에 갇혀 있거나 현재 가격이 볼린저 밴드 지표의 하단 밴드 아래에 갇혀 있습니다.

이러한 부울 조건은 성공하면 'true'를 반환하고 실패하면 'false'를 반환하게 되는 것은 명백합니다. 이러한 신호 값은 시장가 주문으로 거래해도 좋습니다. 여기서 저는 이 논리를 좀더 보기 좋게 할 수 있는 분명한 가능성에 주목하고 싶습니다. 이를 위해 우리는 다음을 수행할 수 있습니다:

  • [K1] - 낮은 RSI 값의 영역
  • [K2 = 100 - K1] - 높은 RSI 값의 영역

이러한 표현식은 알고리즘의 유연성을 확장하는 데 사용될 수 있으며 이는 이후 EA를 최적화하는데에 효율성의 측면에서 긍정적인 영향을 미칩니다:

  1. 현재 가격이 EMA 위에 갇혀 있고 현재 가격과 EMA의 차이가 ATR * 비율보다 작으며 RSI가 K1보다 작습니다.
  2. 현재 가격이 SMA 아래에 갇혀 있거나 현재 가격이 볼린저 밴드 지표의 상단 밴드 위에서 마감되었습니다.
  3. 현재 가격이 EMA 아래로 마감되고, 현재 가격과 EMA의 차이가 ATR * 비율보다 작고, RSI가 K2보다 큽니다.
  4. 현재 가격이 SMA 위에 갇혀 있거나 현재 가격이 볼린저 밴드지표의 하단 밴드 아래에 갖혀 있습니다.

제가 이 예시를 제공한 이유는 문제가 되는 솔루션이 더 큰 알고리즘의 특수한 경우일 뿐이라는 것이 분명하다면 모델을 확장하는 데 주저해서는 안 되기 때문입니다. 이러한 확장이 무엇을 제공할 수 있는지 모르더라도 이렇게 하면 최소한 알고리즘의 유연성이 향상되고 미세 조정의 가능성이 높아져 결과적으로 효율성이 향상될 수 있습니다.

구현해야 하는 트레이딩 조건을 고려할 때 다음의 지표를 구현하기 위해서 우리는 두 가지 옵션 중 하나가 필요합니다:

  1. SMA - 표준 이동 평균(한 줄)
  2. EMA - 지수 이동 평균(한 줄)
  3. 볼린저 밴드 - 볼린저 밴드(세 줄로 구성된 세트)
  4. RSI - 상대 강도 지수(별도의 창에 한 줄로 표시)
  5. ATR - 평균 실제 범위(별도의 창에 한 줄로 표시)

미리 정의된 특수한 MQL5 함수들을 사용하여 지표를 구현할 수 있지만 저는 이러한 접근을 좋아하지 않습니다. 왜냐하면 구현된 코드가 MQL4 버전으로 변환하기가 더 어렵기 때문입니다. 게다가, 예를 들어 제가 자주 사용하는 다른 언어로 된 프로젝트에 이것들을 통합하는 것이 더 어려울 것입니다. 저는 오랫동안 모든 일을 가능한 한 간단하게 그리고 나중에 사용할 것을 염두에 두고 처리하는 습관이 있습니다. 이것은 매우 좋은 습관이라고 생각합니다.

두 번째로 중요한 점은 일반적으로 이러한 지표가 불필요하고 중복된 계산과 기능을 끌어온다는 점입니다. 또한 이러한 지표의 기능이 코드 수준에서 엄격하게 설정되어 있기 때문에 이러한 지표를 세분화하는 것은 불가능합니다. 변경하려면 어떤 경우 든 자신만의 지표의 버전을 만들어야 합니다. EA 혹은 스크립트 내에서 사용자 지정 방식으로 구현을 하는 것이 더 낫다는 것은 분명하다고 생각합니다. 이러한 지표를 구현하기 위해 저는 다음과 같은 트릭을 생각해냈습니다:

  1. 지표 라인의 값을 저장하기 위한 배열을 생성합니다(마지막 N 막대로 제한).
  2. 새 막대가 생성될 때 배열 값이 이동하도록 구현.
  3. 오류가 발생하거나 연결이 오래 끊긴 경우 지표 값 배열을 지우는 기능을 구현.
  4. 마지막 바가 닫힐 때 지표 값의 계산을 구현.

이 접근 방식에서는 처음 세 단락에서 위의 나열된 작업을 하게 하는 공통 배열 블록과 함수를 만듭니다. 작업을 예로 들어 어떻게 보이는지 살펴보겠습니다. 첫 번째 사항부터 시작하겠습니다:

   double SMA1Values[]; // Array for storing SMA values
   double EMAValues[];  // Array for storing EMA values (exponential)
   double RSIValues[];  // Array for storing RSI values
   
   double BollingerBandsUpperValues[];  // Array for storing BollingerBands values, upper
   double BollingerBandsMiddleValues[]; // Array for storing BollingerBands values, middle
   double BollingerBandsLowerValues[];  // Array for storing BollingerBands values, lower
   
   double ATRValues[];// array for storing Average True Range values

이러한 배열은 EA가 시작될 때 주어진 길이 제한대로 초기화됩니다:

   //Prepare indicator arrays
   void PrepareArrays()
   {
      ArrayResize(SMA1Values, LastBars);
      ArrayResize(EMAValues, LastBars);
      ArrayResize(RSIValues, LastBars);
      ArrayResize(BollingerBandsUpperValues, LastBars);
      ArrayResize(BollingerBandsMiddleValues, LastBars);
      ArrayResize(BollingerBandsLowerValues, LastBars);
      ArrayResize(ATRValues, LastBars);
   }

기존 지표와 달리 이 전략에서는 이전 값을 모두 가져올 필요가 없습니다. 이는 분명한 장점입니다. 저는 이 구현 방식의 패러다임을 좋아합니다. 왜냐하면 이 방식은 코드의 단순성과 지표의 시작 값과 이전 지표를 사용하여 얻은 값의 동등성을 보장하기 때문입니다. 이제 값의 이동이 어떻게 이루어지는지 살펴보겠습니다:

   //shift of indicator values
   void ShiftValues()
   {
      int shift = 1;
      for (int i = LastBars - 1; i >= shift; i--)
      {
         SMA1Values[i] = SMA1Values[i - shift];
         EMAValues[i] = EMAValues[i - shift];
         RSIValues[i] = RSIValues[i - shift];
         BollingerBandsUpperValues[i] = BollingerBandsUpperValues[i - shift];
         BollingerBandsMiddleValues[i] = BollingerBandsMiddleValues[i - shift];
         BollingerBandsLowerValues[i] = BollingerBandsLowerValues[i - shift];
         ATRValues[i] = ATRValues[i - shift];
      }
   }

보시다시피 모든 것이 매우 간단합니다. 배열을 지울 때도 마찬가지입니다:

   //reset all indicator arrays if connection fails [can also be used when initializing an EA]
   void EraseValues()
   {
      for (int i = 0; i < LastBars; i++)
      {
         SMA1Values[i] = -1.0;
         EMAValues[i] = -1.0;
         RSIValues[i] = -1.0;
         BollingerBandsUpperValues[i] = -1.0;
         BollingerBandsMiddleValues[i] = -1.0;
         BollingerBandsLowerValues[i] = -1.0;
         ATRValues[i] = -1.0;
      }
   }

이 기능이 어디에 사용될지는 꽤 명확하다고 생각합니다. 이제 지표 자체의 구현으로 넘어가 보겠습니다. 이를 위해 저는 ChatGPT에 코드 구축 패러다임에 따라 적합한 함수를 구현해 달라고 요청했습니다. SMA 지표로 시작했습니다:

   //1 Function that calculates the indicator value to bar "1"
   double calculateMA(int PeriodMA,int Shift=0)
   {
      int barIndex=Shift+1;//bar index SMA is calculated for (with a shift)
      int StartIndex=barIndex + PeriodMA-1;//starting bar index for calculating SMA
      if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating SMA (if not valid, then the value is -1)
      double sum = 0.0;

      for (int i = StartIndex; i >= barIndex; i--)
      {
         sum += Charts[chartindex].CloseI[i];
      }
      LastUpdateDateTime=TimeCurrent();
      return sum / PeriodMA;
   }

보시다시피 이 함수는 매우 간단하고 짧습니다. 처음에는 이 함수의 모양이 조금 달랐습니다. 1세대에서는 시간 대비 바의 번호 매기기의 방향을 잘못 이해하는 등 많은 오류를 발견했습니다. 그러나 저는 몇번의 조정을 통해 이 모든 것을 수정하고 원래의 구현에는 없었던 Shift 매개 변수를 추가로 추가했습니다. 저는 시각적 개선 사항을 구현한 후 나머지 지표도 비슷한 방식으로 구현해 달라고 요청했습니다. 그 후 구현 오류가 줄어들었습니다. 저는 이전에 제가 질문을 한 맥락으로 이전 구현의 예를 포함하여 다른 지표에 대해 유사한 기능을 구현하기 위해 다음과 같은 요청을 보냈습니다. 덕분에 많은 시간을 절약할 수 있었습니다. 이제 나머지 모든 지표에 대한 구현에 대해 살펴보겠습니다. EMA부터 시작하겠습니다:

   //2 Function that calculates the value of the exponential moving average to bar "1"
   double calculateEMA(int PeriodEMA,double Flatness=2.0,int Shift=0)
   {
      int barIndex = Shift+1; // bar index EMA is calculated for (with a shift)
      int StartIndex=barIndex + PeriodEMA-1;//index of the starting bar for calculating the first SMA, for starting the recurrent calculation of EMA
      if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating EMA (if not valid, then the value is -1)
   
      double sum = 0.0;
      double multiplier = Flatness / (PeriodEMA + 1); // Weight multiplier 
      double prevEMA;
   
      // Calculate the initial value for the EMA (the first value is considered as a normal SMA) 
      for (int i = StartIndex; i >= barIndex; i--)
      {
         sum += Charts[chartindex].CloseI[i];
      }
      prevEMA = sum / PeriodEMA;//this is the starting value for the bar (StartIndex-1)
   
      // Apply the EMA formula for the remaining values 
      for (int i = StartIndex; i >= barIndex; i--)
      {
         prevEMA = (Charts[chartindex].CloseI[i] - prevEMA) * multiplier + prevEMA;
      }
   
      LastUpdateDateTime = TimeCurrent();
      return prevEMA;
   }

그런데 ChatGPT의 세대를 연구할 때 우리는 어떤 세대가 어떤 아이디어에 기반한 것인지 이해하기 위해 다양한 인터넷 리소스를 살펴봐야 합니다. 이를 통해 우리는 더 잘 적응 할 수 있습니다. 이는 특히 EMA에서 두드러집니다. 코드를 자세히 살펴보면 SMA의 좀 더 간단한 구현과 크게 다르지 않고 오히려 일반적인 이동 평균에 추가 기능처럼 보입니다. 여기에는 지수가 없지만 어떤 이유에서인지 지표 이름에 지수가 있습니다. 다음은 RSI 지표입니다:

   //3 Function for calculating RSI to bar "1"
   double calculateRSI(int PeriodRSI,int Shift=0)
   {
       int barIndex = Shift+1; // bar index RSI is calculated for (with a shift)
       int StartIndex = barIndex + PeriodRSI - 1; // starting bar index for calculating RSI
       if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating RSI (if not valid, then the value is -1)
   
       double avgGain = 0.0;
       double avgLoss = 0.0;
       double change;
   
       // Calculate initial values for avgGain and avgLoss
       for (int i = StartIndex; i > barIndex; i--)
       {
           change = Charts[chartindex].CloseI[i]-Charts[chartindex].OpenI[i];
           if (change > 0)
           {
               avgGain += change;
           }
           else if (change < 0)
           {
               avgLoss -= change;
           }
       }
   
       avgGain /= PeriodRSI;
       avgLoss /= PeriodRSI;
   
       // RSI calculation
       double RS = 0.0;
       if (avgLoss != 0)
       {
           RS = avgGain / avgLoss;
       }
   
       double RSI = 100 - (100 / (1 + RS));
   
       LastUpdateDateTime = TimeCurrent();
       return RSI;
   }

이제 볼린저 밴드 지표에 대해서도 비슷한 절차를 수행해야 합니다. 이 절차는 미리 준비된 구조에 넣을 수 있는 세 개의 커브 값을 반환해야 합니다:

   //structure to return all three bollinger band lines
   struct BollingerBands 
   {
       double upper;
       double middle;
       double lower;
   };

이제 질문에 이 구조를 추가했으므로 인공 지능이 볼린저밴드 유형을 반환해야 한다는 사실을 고려하여 함수를 구현하도록 요청할 수 있습니다. 이 모델은 문제없이 이러한 작업을 할 수 있습니다.

   //4 Function for calculating the Bollinger Bands of the indicator 
   BollingerBands calculateBollingerBands(int PeriodBB, double DeviationBB,int Shift=0) 
   {
       int barIndex = Shift+1; // bar index Bollinger Bands is calculated for (with a shift)
       int StartIndex = barIndex + PeriodBB - 1; // index of the starting bar for calculating the first SMA, for starting the recurrent calculation of EMA
       BollingerBands rez;
       rez.lower=-1.0;
       rez.middle=-1.0;
       rez.upper=-1.0;
       if (StartIndex >= LastBars) return rez; // Check for the availability of the bars for calculating BB (if not valid, then the value is -1)
   
       double sum = 0.0;
       double prevBB;
       double sumSquares = 0.0;
   
       // Calculate the initial value for BB (the first value is considered as a normal SMA)
       for (int i = StartIndex; i >= barIndex; i--) {
           double closePrice = Charts[chartindex].CloseI[i];
           sum += closePrice;
       }
       prevBB = sum / PeriodBB; //this is the starting value for the bar (StartIndex-1)
   
       // Calculation of standard deviation
       for (int i = StartIndex; i >= barIndex; i--) {
           double closePrice = Charts[chartindex].CloseI[i];
           sumSquares += pow(closePrice - prevBB, 2);
       }
       double standardDeviation = sqrt(sumSquares / PeriodBB);
   
       // Calculate Bollinger Bands
       double upperBand = prevEMA + DeviationBB * standardDeviation;
       double lowerBand = prevEMA - DeviationBB * standardDeviation;
   
       rez.upper = upperBand;
       rez.middle = prevEMA;
       rez.lower = lowerBand;
   
       LastUpdateDateTime = TimeCurrent();
       return rez;
   }

이제 ATR을 계산하는 함수의 버전을 구현하는 일이 남아 있습니다:

   //5 Function for calculating Average True Range (Relative)
   double calculateRelativeATR(int PeriodATR,int Shift=0)
   {
       int barIndex = Shift+1; // bar index ATR is calculated for (with a shift)
       int StartIndex = barIndex + PeriodATR - 1; // starting bar index for calculating the first ATR
       if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating ATR and True Range (if not valid, then the value is -1)
   
       double sumPrice=0.0;
       double sumTrueRange = 0.0;
       double ATR;
   
       // Calculating True Range for bars and the sum of values for calculating the first ATR
       for (int i = StartIndex; i >= barIndex; i--)
       {
           sumPrice+=Charts[chartindex].HighI[i]+Charts[chartindex].LowI[i]+Charts[chartindex].CloseI[i]+Charts[chartindex].OpenI[i];//added by me 
           double high = Charts[chartindex].HighI[i];
           double low = Charts[chartindex].LowI[i];
           double trueRange = high - low;
           sumTrueRange += trueRange;
       }
   
       // ATR calculation
       //ATR = sumTrueRange / PeriodATR; - conventional calculation
       ATR = 100.0 * (sumTrueRange / PeriodATR)/(sumPrice/(PeriodATR*4.0));//calculation of relative ATR in %
   
       LastUpdateDateTime = TimeCurrent();
       return ATR;
   }

마지막에 코멘트가 달린 줄에 주목하세요. 저는 이 지표를 약간 수정하여 상대값으로 작동하도록 했습니다. 이는 각 거래 상품에 대해 자체 가중치를 설정할 필요가 없도록 하기 위해 필요합니다. 대신 현재 가격을 기준으로 자동으로 진행됩니다. 이렇게 하면 보다 효율적인 다중 통화 최적화가 가능합니다. 이러한 간단한 알고리즘도 올바르게 사용하면 작지만 충분한기간을 제공합니다. 다른 효율적인 방법과 결합하면 현재 EA가 허용하는 수준에서도 이 거래는 상당히 수용 가능한 수준으로 만들 수 있습니다.

제가 술어를 직접 구현했습니다. 매우 쉬웠습니다. 그 중 첫 번째를 예로 들어 보겠습니다:

   //to open buy positions
   bool bBuy()
      {
      //determine if an open position is already present
      bool ord;
      ulong ticket;
      bool bOpened=false;
      for ( int i=0; i<PositionsTotal(); i++ )
         {
         ticket=PositionGetTicket(i);
         ord=PositionSelectByTicket(ticket);
         if ( ord && PositionGetInteger(POSITION_MAGIC) == MagicF)
            {
            bOpened=true;
            return false;
            }
         }
         
      if (!bOpened && EMAValues[1] > 0.0)//only if nothing is open and the indicator has been calculated 
         {
         //K - control ratio
         //RSIPercentBorder - control RSI
         double Val1=Charts[chartindex].CloseI[1]-EMAValues[1];
         double Val2=ATRValues[1]*(1.0/K);
         if (Val1 > 0 && Val1 < Val2 && RSIValues[1] < RSIPercentBorder) return true;         
         } 
      return false;
      }

매도 포지션 진입의 전제 조건은 약간의 예외를 제외하고는 비슷합니다. 청산용 술어는 훨씬 더 간단합니다:

   //to close a buy position
   bool bCloseBuy()
      {
      if (SMA1Values[1] > 0.0)
         {
         if (Charts[chartindex].CloseI[1] < SMA1Values[1] || Charts[chartindex].CloseI[1] > BollingerBandsUpperValues[1] )
            {
            return true;
            }
         }
      return false;   
      }

이 모든 것이 매우 간단한 방식으로 작동합니다:

   IndicatorDataRecalculate();//recalculate indicators

   if ( bCloseBuy() )
      {
         CloseBuyF();
      }
   if ( bCloseSell() )
      {
         CloseSellF();  
      }
   if ( bBuy() )
      {
         BuyF();
      }
   if ( bSell() )
      {
         SellF();
      } 

이렇게 가능한 한 간단하며 더 복잡할 필요는 없다고 생각합니다. 이 모든 코드는 새로운 바가 나타날 때 실행되어야 합니다. 저는 지표의 시각화를 별도로 구현했습니다. 제가 마음에 들지 않는 유일한 점은 ATR 및 RSI와 같은 지표가 별도의 창에 표시되도록 설계되어 있다는 것입니다. 별도의 창을 인위적으로 만들 수 없고 솔직히 실제로 필요하지 않기 때문에 저는 이 지표들이 가격과 연동되도록 렌더링 버전을 만들었습니다. 이를 위해 창 지표를 그리는 어떤 패러다임을 만들었습니다.

  1. 퍼센트 제어 값을 입력하여 하나의 통로에서 3개의 통로를 만듭니다.
  2. 저장된 값의 전체 배열에 대한 최대(Max) 및 최소(Min) 지표 값을 결정합니다.
  3. 주어진 통로의 델타를 계산합니다(Delta = Max - Min).
  4. 증가된 값의 상단 통로를 계산합니다(HighBorder = Max - Delta * Percent / 100).
  5. 증가된 값의 하단 통로를 계산합니다(LowBorder = Min + Delta * Percent / 100).
  6. 위쪽 통로와 아래쪽 통로가 모두 정의되었으므로 중간 통로는 이미 정의된것입니다.

지표의 현재 값이 통로 중 하나에 있는 경우 해당 포인트는 통로에 해당하는 적절한 색상을 얻습니다. 모든 것이 간단합니다. 예를 들어 차트 바에 값을 바인딩하고 그에 따라 색상을 변경하거나 바에 연결된 객체와 해당 색상을 가진 객체를 만들 수 있습니다. 많은 분이 눈치 채셨겠지만 이것은 RSI 지표에서 영감을 얻은 것입니다. 일반적으로 이와 같은 방식의 구조가 거래에 사용됩니다. 이러한 영역을 과매수 및 과매도 영역이라고 합니다.

제 생각으로는 이 코드는 여기서 그다지 중요하지 않다고 생각합니다. 왜냐하면 작업 구현과 가장 관련이 적고 오류 및 개선 사항을 수정하는 데만 도움이 되기 때문입니다. 여러분이 원한다면 ChatGPT를 사용하여 이 렌더링을 구현할 수도 있습니다. 저는 이 렌더링이 어떻게 작동하는지 보여드릴 가치가 있다고 생각합니다:

지표 시각화하기

여기서 모든 작업은 라인 객체 유형만을 사용하여 가능한 한 간단하게 수행됩니다. 선을 만들 때 선의 시작점과 끝점이 같은 시간과 가격에 묶여 있으면 선이 점으로 바뀝니다. 선 굵기를 조정하여 해당 점의 가중치를 조정합니다. 여기서 제가 오랫동안 사용해온 몇 가지 생활 꿀팁을 소개합니다.


기능의 평가 및 결과 분석

ChatGPT는 이 알고리즘이 최적이라고 생각하지만 그 근거가 무엇인지는 알 수 없습니다. 좋은 백테스트 또는 실제 거래는 효율성의 척도가 될 수 있습니다. 실제 거래는 최적의 설정이 선행되어야 하며 이는 MetaTrader 5 옵티마이저를 사용하여 수행할 수 있다는 것을 모두가 이해하길 바랍니다. 이 터미널은 다중 통화 최적화의 가능성이 있고 제 템플릿은 이 터미널의 기능과 효과를 완전히 사용할 수 있다는 것을 고려할 때 우리는 모든 "28"통화 쌍에 대해 EA를 안전하게 최적화할 수 있습니다. 아마도 이 터미널의 모든 장점을 나열할 수는 없는 것입니다. 그러나 이러한 접근 방식의 분명한 장점에 주목할 가치가 있습니다:

  1. 다중 통화 패턴 자동 검색
  2. 다중 통화 패턴은 더 많은 비중을 차지하며 시장 변화에 더 잘 적응합니다.
  3. 각 거래 상품이 각자의 데이터를 제공하기 때문에 더 많은 거래가 이루어집니다.
  4. 시간 절약(각각의 도구를 개별적으로 최적화할 필요가 없음)

물론 단점도 있습니다. 이 경우 가장 중요한 것은 각각의 상품에 대한 미세 조정이 불가능하다는 점입니다. 물론 이 문제는 추가적인 기능을 통하여 해결할 수 있지만 이 글의 주제는 아닙니다. 그러나 이 최적화를 수행하는 것만으로는 충분하지 않으며 전체적인 것을 보며 결과를 올바르게 선택하는 것도 중요합니다. 저는 최적의 것을 선택했습니다:

최적의 최적화 옵션

보시다시피 저는 '2018'부터 '2023'까지 'H4' 기간을 사용하여 최적화를 수행했으며 '2023'부터 6개월은 모두 남겨두었습니다. 보시다시피 최적화 섹션의 수익 곡선이 완벽하지 않음에도 불구하고 수익성있는 거래에 몇 달이 더 걸렸으며 이 사실은 전략이 거래에 성공적으로 사용될 가능성이 있음을 의미합니다. 최적화 기능이 있는 많은 트레이딩 시스템이 이러한 결과에 근접하지는 못할 가능성이 높습니다. 때로는 어떤 사람은 코드 측면에서 놀랍도록 멋진 시스템을 테스트할 수 있지만 이와 같은 결과를 얻지 못하는 경우도 있습니다.

이 알고리즘에 더 많은 기능을 추가할 수 있습니다. 저는 이곳을 놀이터라고 생각합니다. 결과적으로 EA의 확장 잠재력이 중요하다고 말할 가치가 있습니다. 여기서 중요한 것은 누군가가 만든 알고리즘이 아니라 여러분의 역량과 창의력입니다. MQL5 개발 프로세스에 성공적으로 적응하려면 중요한 자질이 필요합니다:

  • 프로그래밍 기술(필수)
  • 수학 능력(바람직)
  • 구분적인 사고
  • 작업을 단순화하고 여러 단계로 세분화할 수 있는 기능
  • ChatGPT는 도구일 뿐이므로 제대로 작동하지 않는 것에 대해 비난할 필요가 없습니다 (작동하지 않는 것을 수정하는 것은 사용자의 몫입니다).
  • 거래 결과에 대한 올바른 해석
  • 모델이 어쨌든 실수를한다는 것을 인정 그러나 이러한 실수에 짜증 내지 않아야 합니다(가장 중요한 것은 여러분이 개발 인건비를 줄였다는 것입니다).
  • 자신만의 애플리케이션 구조 개발(물론 필자의 접근 방식을 사용할 수 있습니다)
  • ChatGPT는 여러분에게 힘이 되는 동반자입니다. 인내심이 많고, 똑똑하고, 수완이 뛰어날수록 이 동반자는 더 효과적입니다.

이 인공지능을 사용하거나 사용하지 않는 것은 여러분 자유이지만 이 도구는 프로그래밍을 포함한 여러 측면에서 매우 유용하다고 확실히 말할 수 있습니다.


결론

사실 이 도구를 사용하는 제 모델을 고수할 필요는 없습니다. 제가 많은 것들을 해봤지만 가능성은 거의 무한하다고 말할 수 있습니다. 물론 성공하기까지 여러분도 저처럼 어느 정도의 시간과 노력이 필요할 것입니다.

그러나 여전히 이 도구를 사용해보시라고 말씀드리고 싶습니다. 최소한 ChatGPT를 사용하면 인공지능에 대한 올바른 관점을 가질 수 있습니다. 이 기술은 거의 모든 개발 체인에 통합될 수 있는 잠재력이 있습니다. 저는 이것이 시작에 불과하며 변화가 곧 다가올 것이라고 확신합니다. 여러분은 가능한 한 빨리 이 도구에 익숙해지기 시작하고 가장 광범위한 작업에 적용하는 것이 좋습니다.

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

파일 첨부됨 |
ChatGPT_bot.set (2.99 KB)
ChatGPT_bot.mq5 (145.44 KB)
MQL5의 ALGLIB 수치 해석 라이브러리 MQL5의 ALGLIB 수치 해석 라이브러리
이 글에서는 금융 데이터 분석의 효율성을 향상시킬 수 있는 ALGLIB 3.19 수치 분석 라이브러리와 그 응용 프로그램 및 새로운 알고리즘에 대해 간략히 살펴봅니다.
트레이딩을 위한 조합론과 확률 이론(3부): 첫 번째 수학적 모델 트레이딩을 위한 조합론과 확률 이론(3부): 첫 번째 수학적 모델
앞서 살펴본 주제에 대해 논리적으로 연속적인 내용을 다루자면 그것은 아마도 트레이딩 작업을 위한 다기능 수학적 모델의 개발일 것입니다. 이 글에서 저는 프랙탈을 설명하는 최초의 수학적 모델의 개발과 관련된 전체의 과정을 처음부터 설명하겠습니다. 이 모델은 중요한 빌딩 블록이 되어야 하며 다 기능적이고 보편적이어야 합니다. 그리고 모델은 우리의 아이디어를 더욱 발전시키기 위한 이론적 기반을 구축할 것입니다.
Scikit-Learn 라이브러리의 분류 모델 및 ONNX로 내보내기 Scikit-Learn 라이브러리의 분류 모델 및 ONNX로 내보내기
이 글에서는 피셔의 붓꽃 데이터 세트의 분류 작업을 해결하기 위해서 Scikit-Learn 라이브러리에서 사용할 수 있는 모든 분류 모델을 적용하는 방법을 살펴봅니다. 우리는 이러한 모델을 ONNX 형식으로 변환하고 그 결과 모델을 MQL5 프로그램에서 활용하려고 합니다. 또한 전체 붓꽃 데이터 세트에서 원래 모델의 정확도를 ONNX 버전과 비교합니다.
프리랜스 서비스에서 트레이더의 주문을 처리하여 수익을 창출하는 방법 프리랜스 서비스에서 트레이더의 주문을 처리하여 수익을 창출하는 방법
MQL5 프리랜스는 개발자가 트레이더 고객을 위한 트레이딩 애플리케이션을 만들어 주고 그 대가를 금전적으로 받는 온라인 서비스입니다. 이 서비스는 2010년부터 성공적으로 운영되어 현재까지 100,000개 이상의 총 7백만 달러의 프로젝트가 완료되었습니다. 보시다시피 여기에는 상당한 금액이 관련됩니다.