시스템트레이딩

MQL5 프로그래밍: 트레이더를 위한 자동 매매의 기초
MetaTrader5
MQL5 프로그래밍: 트레이더를 위한 자동 매매의 기초

6부. 자동 매매 시스템 개발 안녕하세요, 트레이더 여러분! 오늘은 "6부. 자동 매매 시스템 개발"에 대해 이야기해보려고 합니다. MQL5 언어의 핵심 요소를 살펴보며, 특히 금융 상품 사양과 거래 계좌 설정 같은 기본 개념부터 시작할 거예요. 이런 것들은 제대로 작동하는 EA(Expert Advisor)를 만들기 위한 필수 조건이죠. 그 다음에는 내장 함수와 데이터 구조, 로봇 특유의 이벤트, 그리고 전략 테스터에서의 EA 운영의 주요 측면에 대해 알아보겠습니다. 메타트레이더 5의 전략 테스터는 트레이딩 로봇 개발에서 중요한 역할을 합니다. 이 도구를 통해 금융 성과를 평가하고 거래 전략을 최적화할 수 있거든요. 테스터는 다양한 모드에서 디버깅을 위한 필수 도구를 제공하는데, 여기에는 바나 틱 기반의 시각적 테스트 모드가 포함됩니다. 모델링된 틱이나 실제 틱을 사용하여 테스트할 수 있으며, 시각적 창 없이 간단한 테스트도 가능합니다. 이전에 지표를 시각적 모드에서 테스트한 경험이 있으실 텐데, 지표에 대해서는 제한된 설정만 가능했죠. 하지만 EA를 개발하면서는 테스터의 모든 기능을 활용할 수 있습니다. 또한, 우리는 시장 데이터의 다양한 표현 방식인 Depth of Market과 그 소프트웨어 인터페이스에 대해서도 살펴보겠습니다. 메타트레이더 5는 금융 상품(심볼)을 분석하고 거래할 수 있는 기능을 제공합니다. 이들은 터미널의 모든 하위 시스템의 기초를 형성하죠. 사용자들은 브로커가 제공하는 심볼 목록에서 원하는 심볼을 선택하고, 이를 마켓 워치에서 모니터링할 수 있습니다. MQL5 API를 통해 모든 심볼의 특성을 조회하고 분석할 수 있으며, 마켓 워치에서 심볼을 추가하거나 제거하는 것도 가능합니다. 브로커가 제공하는 표준 심볼 외에도, 메타트레이더 5는 사용자 정의 심볼을 생성하고 임의의 데이터 소스에서 그 속성과 호가 이력을 로딩하거나, MQL5 프로그램을 사용하여 계산할 수 있도록 지원합니다.

2023.12.16
MQL5 프로그래밍으로 자동 매매 프로그램 만들기 - 제5부
MetaTrader5
MQL5 프로그래밍으로 자동 매매 프로그램 만들기 - 제5부

제5부. MQL5로 애플리케이션 프로그램 만들기 MQL5 프로그래밍으로 트레이더를 위한 책의 제5부에서는 알고리즘 트레이딩과 관련된 API에 대해 더 깊이 알아보겠습니다. 여기에는 금융 데이터 분석, 차트 시각화, 자동화, 사용자 상호작용 등이 포함됩니다. 우리는 MQL 프로그램 생성의 일반 원칙부터 시작하여 이벤트 유형, 기능 및 터미널의 모델에 대해 살펴볼 것입니다. 이후에는 시계열 접근, 차트 및 그래픽 객체 작업, 각 MQL 프로그램 유형의 생성 및 적용 원칙을 별도로 탐구할 것입니다. 메타트레이더 5 터미널은 다섯 가지 프로그램 유형을 지원합니다: 기술 지표, 자동 또는 반자동 트레이딩을 위한 Expert Advisor(EA), 일회성 작업을 수행하는 스크립트, 백그라운드 작업을 위한 서비스, 그리고 개별 기능 모듈을 위한 라이브러리입니다. 지표와 차트 작업에 대해 깊이 들어가며, Expert Advisor에도 적용할 수 있는 기술을 배우게 될 것입니다. Expert Advisor 개발은 책의 다음 부분에서 다룰 예정이며, 여기서는 주문의 자동 실행, 트레이딩 전략의 형식화, 그리고 과거 데이터를 활용한 테스트 및 최적화에 대해 다룰 것입니다. 우리는 기본 제공되는 지표를 사용하는 방법과 다른 지표를 기반으로 하거나 처음부터 우리의 맞춤형 애플리케이션을 만드는 방법을 배울 것입니다. 모든 컴파일된 프로그램은 메타트레이더 5의 내비게이터에 표시되며, EX5 라이브러리는 다른 프로그램에서 사용되지만 내비게이터에 별도로 표시되지 않습니다. 결과적으로 우리는 MQL5 언어의 기능과 알고리즘 트레이딩에서의 적용 가능성을 더 잘 이해하게 될 것입니다. 이를 통해 금융 데이터를 효과적으로 다루고 트레이딩 지표와 Expert Advisor를 생성할 수 있게 됩니다.

2023.12.16
트레이더를 위한 MQL5 프로그래밍: 메타트레이더 5의 기본 API
MetaTrader5
트레이더를 위한 MQL5 프로그래밍: 메타트레이더 5의 기본 API

4부. MQL5의 기본 API 이전 섹션에서 MQL5 프로그래밍 언어의 기초, 문법, 사용 규칙 및 주요 개념에 대해 알아보았습니다. 하지만 실제 데이터 처리 및 자동 거래 프로그램을 작성하려면 메타트레이더 5 터미널과 상호 작용하기 위한 다양한 내장 함수를 활용해야 합니다. "4부. MQL5의 기본 API"에서는 내장 함수(MQL5 API)를 마스터하는 데 집중하고, 점진적으로 전문 하위 시스템으로 깊이 들어갈 것입니다. 모든 MQL5 프로그램은 풍부한 기술과 기능을 활용할 수 있으므로, 대부분의 프로그램에서 사용 가능한 가장 간단하고 유용한 함수부터 시작하는 것이 유리합니다. 주요 주제로는 배열 작업, 문자열 처리, 파일 상호작용, 데이터 변환 및 사용자 상호작용 함수 등을 다룰 것입니다. 또한 수학 함수와 프로그램 환경 관리에 대해서도 탐구할 예정입니다. 다른 프로그래밍 언어와는 달리, MQL5 API의 내장 함수를 사용하기 위해 추가적인 전처리기 지시어를 필요로 하지 않습니다. 모든 MQL5 API 함수의 이름은 전역 컨텍스트(namespace)에서 사용할 수 있으며, 언제든지 무조건 접근 가능합니다. 또한 클래스 메서드 이름이나 사용자 정의 네임스페이스와 같은 서로 다른 프로그램 컨텍스트에서 유사한 이름을 사용하는 가능성에 대해서도 논의할 것입니다. 이 경우, 중첩 타입, 네임스페이스 및 컨텍스트 연산자 '::'에 대한 섹션에서 논의한 대로 글로벌 함수를 호출하기 위해 컨텍스트 해상도 연산자를 사용해야 합니다. 프로그래밍은 다양한 데이터 타입과의 작업을 요구하는 경우가 많습니다. 이전 섹션에서 우리는 내장 데이터 타입의 명시적 및 암시적 변환 메커니즘을 이미 살펴보았습니다. 그러나 다양한 이유로 인해 항상 적합하지 않을 수 있습니다. 서로 다른 타입 간의 보다 세밀한 데이터 변환을 제공하기 위해 MQL5 API에는 변환 함수 세트가 포함되어 있습니다. 특히 문자열과 숫자, 날짜 및 시간, 색상, 구조체 및 열거형과 같은 다른 타입 간의 변환 함수에 주목해야 합니다.

2023.12.15
MQL5에서 객체 지향 프로그래밍 배우기 - 트레이더를 위한 실전 가이드
MetaTrader5
MQL5에서 객체 지향 프로그래밍 배우기 - 트레이더를 위한 실전 가이드

3부. MQL5의 객체 지향 프로그래밍 "3부. MQL5의 객체 지향 프로그래밍"에서는 MQL5 언어의 객체 지향 프로그래밍(OOP) 세계에 깊이 들어갑니다. 소프트웨어 개발은 여러 개체를 관리하는 복잡성과 관련이 있으며, 프로그래밍의 편리함과 생산성, 품질을 향상시키기 위해 고급 기술이 필요합니다. OOP 기술은 프로그래머가 MQL5 도구를 사용하여 정의한 사용자 정의 타입의 변수인 객체 개념을 기반으로 합니다. 사용자 정의 타입을 생성하면 객체를 모델링할 수 있어 프로그램 작성 및 유지 관리가 용이해집니다. 이번 부분에서는 클래스, 구조체, 유니온 등 새로운 타입을 정의하는 다양한 방법을 살펴봅니다. 이러한 사용자 정의 타입은 데이터와 알고리즘을 결합하여 애플리케이션 객체의 상태와 동작을 설명할 수 있습니다. 저자는 "분할 정복" 원칙에 대해 설명하며, 객체가 각각 작은 논리적 작업을 해결하는 미니 프로그램이라고 강조합니다. 이러한 객체들을 통합하여 단일 시스템으로 만들고 임의의 복잡성을 가진 제품과 서비스를 생성할 수 있습니다. MQL5의 기능을 학습하는 데 도움을 주기 위해, "MQL5의 객체 지향 프로그래밍" 부분에서는 OOP의 원칙과 함께 실용적인 구현 예제를 소개합니다. 또한 템플릿, 인터페이스, 네임스페이스에 대해서도 다루어 MQL5 프로그램 개발에서 OOP의 유연성과 강력함을 보여줍니다.

2023.12.15
트레이더를 위한 MQL5 프로그래밍 – 개발 환경 소개
MetaTrader5
트레이더를 위한 MQL5 프로그래밍 – 개발 환경 소개

1부: MQL5 소개 및 개발 환경 이번 포스팅에서는 "MQL5와 개발 환경 소개"라는 책의 첫 번째 부분을 통해 MQL5 언어와 개발 환경의 기초에 대해 알아보겠습니다. MQL4(메타트레이더 4 언어)에 비해 MQL5에서 새롭게 도입된 기능 중 하나는 객체 지향 프로그래밍(OOP)을 지원한다는 점입니다. 이로 인해 C++와 유사해졌죠. 이미 일부 OOP 기능이 MQL4로 이전되었지만, 프로그래밍에 익숙하지 않은 사용자에게는 OOP가 다소 어려울 수 있습니다. 이 책의 목적은 이러한 접근 방식을 이해하기 쉽게 만드는 것입니다. MQL5 프로그래밍의 모든 측면을 다루고 모든 과정을 상세히 설명하는 보조 자료로 활용될 수 있습니다. 개발자는 객체 지향 및 절차 지향 프로그래밍 스타일 중에서 선택하거나 두 가지를 조합할 수 있습니다. 이미 프로그래밍 경험이 있는 분들은 기초 부분을 건너뛰셔도 괜찮습니다. C++ 프로그래머라면 MQL5를 더 쉽게 마스터할 수 있지만, 언어 차이에 주의하여 실수를 피하는 것이 중요합니다. MQL5를 사용하면 데이터의 그래픽적 표시를 위한 지표, 거래 자동화를 위한 EA(Expert Advisor), 일회성 작업을 위한 스크립트, 백그라운드 작업을 위한 서비스 등 다양한 프로그램을 만들 수 있습니다. 메타트레이더 5의 독특한 점은 클라이언트 터미널에서 전체 거래 시스템을 관리할 수 있다는 것입니다. 여기서 MQL5 프로그램이 실행되고 거래 서버로 명령을 전송합니다. MQL5 애플리케이션은 서버에 설치되지 않습니다. 1부에서는 프로그램을 편집하고 컴파일하며 실행하는 방법, 다양한 데이터 타입, 변수, 표현식, 배열, 디버깅 및 출력에 대해 설명합니다.

2023.12.15
MetaTrader 5에서 손글씨 숫자를 인식하는 EA 활용하기
MetaTrader5
MetaTrader 5에서 손글씨 숫자를 인식하는 EA 활용하기

손글씨 숫자를 인식하는 전문가 조언기(EA) 소개 MNIST 데이터베이스는 60,000개의 훈련 이미지와 10,000개의 테스트 이미지로 구성되어 있습니다. 이 이미지는 원래의 NIST 세트에서 가져온 20x20 픽셀의 흑백 샘플을 '재혼합'하여 생성된 것으로, 미국 인구조사국에서 제공된 자료와 미국 고등학생들로부터 수집된 샘플들로 보완되었습니다. 샘플은 28x28 픽셀 크기로 정규화되었으며, 그레이스케일 수준을 도입하기 위해 안티 앨리어싱 처리가 이루어졌습니다. 훈련된 손글씨 숫자 인식 모델인 mnist.onnx는 모델 제오(Model Zoo)에서 Github를 통해 다운로드할 수 있습니다 (opset 8). 관심이 있는 분들은 opset 1을 제외한 다른 모델들을 다운로드하고 테스트해볼 수 있습니다. 최근 ONNX 런타임에서 지원되지 않는 모델이기 때문입니다. 흥미롭게도, 출력 벡터는 일반적인 분류 모델에서 사용되는 Softmax 활성화 함수로 처리되지 않았습니다. 하지만 이는 문제가 되지 않습니다. 우리는 이를 쉽게 구현할 수 있습니다. int PredictNumber(void) {   static matrixf image(28,28);   static vectorf result(10);   PrepareMatrix(image);   if(!OnnxRun(ExtModel,ONNX_DEFAULT,image,result))     {      Print("OnnxRun error ",GetLastError());      return(-1);     }   result.Activation(result,AF_SOFTMAX);   int predict=int(result.ArgMax());   if(result[predict]<0.8)      Print(result);      Print("value ",predict," predicted with probability ",result[predict]);   return(predict);} 마우스를 사용해 특별한 그리드에 숫자를 그린 후, 왼쪽 마우스 버튼을 누른 채로 CLASSIFY 버튼을 눌러 그려진 숫자를 인식해 보세요. 인식된 숫자의 확률이 0.8 미만이라면, 각 클래스에 대한 확률 벡터가 로그에 출력됩니다. 예를 들어, 빈 입력 필드를 분류해보세요. [0.095331445,0.10048489,0.10673151,0.10274081,0.087865397,0.11471312,0.094342403,0.094900772,0.10847695,0.09441267] value 5 predicted with probability 0.11471312493085861 흥미롭게도, 숫자 9의 인식 정확도가 눈에 띄게 낮습니다. 왼쪽으로 기울어진 숫자는 더 정확하게 인식됩니다.

2023.11.23
MT5를 위한 브레이크아웃 마틴 게일 시스템 트레이딩
MetaTrader5
MT5를 위한 브레이크아웃 마틴 게일 시스템 트레이딩

안녕하세요, 트레이더 여러분! 오늘은 외환 시장에서 활용할 수 있는 '마틴 게일 브레이크아웃' 전략을 소개해드릴게요. 이 EA(시스템 트레이딩)는 브레이크아웃 방식과 마틴 게일 자금 관리 요소를 결합해 트레이딩 성과를 최적화하는 데 도움을 줍니다. 입력 파라미터: TakeProfPoints: 각 거래에 대해 설정할 수 있는 이익 실현 레벨(포인트 단위)입니다. BalancePercentageAvailable: 거래에 사용할 계좌 잔고의 퍼센트를 지정합니다. TP_Percentage_of_Balance: 각 거래에서 이익 실현에 사용할 계좌 잔고의 퍼센트를 결정합니다. SL_Percentage_of_Balance: 거래의 손실 제한을 위해 할당할 계좌 잔고의 퍼센트를 설정합니다. Start_The_Recovery: 회복 과정에서 중요한 역할을 하며, 회복 조치를 언제 어떻게 활성화할지 제어합니다. TP_Points_Multiplier: 이익 실현 포인트에 대한 배수로, 유연한 이익 실현 전략을 가능하게 합니다. MagicNumber: 이 EA만의 고유 식별자로, 독립적으로 거래를 관리할 수 있게 해줍니다. 전략 하이라이트: 브레이크아웃 트레이딩: 이 EA는 가격이 주요 레벨을 돌파할 때의 브레이크아웃 기회를 식별하는 데 특화되어 있습니다. 동적 로트 사이징: 마틴 게일 자금 관리 원칙에 따라 계좌 잔고와 위험 선호도에 따라 로트 사이즈가 동적으로 조정됩니다. 손실 회복: 이 EA는 손실을 회복하기 위해 필요에 따라 거래 파라미터를 조정하는 강력한 회복 메커니즘을 포함하고 있습니다. 이 EA에서 사용되는 주요 함수는 CalcLotWithTP()입니다. 이 함수는 3개의 입력 파라미터인 Takeprofit, Startprice, Endprice를 가지고 있으며, 거래가 Startprice에서 진입하고 Endprice에서 종료할 때 이익 목표를 달성하기 위한 거래량을 계산합니다. 코드 내 모든 부분은 주석으로 설명되어 있어 이해하기 쉽게 되어 있습니다.

2023.09.26
메타트레이더 5에서 심볼 채우기 정책 결정하기
MetaTrader5
메타트레이더 5에서 심볼 채우기 정책 결정하기

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 심볼의 채우기 정책을 결정하는 방법에 대해 이야기해보려고 해요. 이 과정은 특히 트레이딩 결정을 내리는 데 중요한 요소가 되죠. 먼저, 우리가 다룰 심볼을 입력해야 해요. 이것은 우리가 채우기 정책을 결정하려는 금융 상품의 심볼을 의미합니다. 채우기 정책 유형 얻기 (filling): 이 함수는 SymbolInfoInteger를 사용하여 제공된 심볼에 대한 채우기 정책 정보를 가져옵니다. 이 정보는 숫자 값으로 filling이라는 변수에 저장됩니다. 채우기 정책 비교: 다음으로, 이 숫자 값(filling)을 여러 사전 정의된 상수와 비교하는 단계입니다. 여기에는 '채우거나 죽이기' (SYMBOL_FILLING_FOK), '즉시 또는 취소' (SYMBOL_FILLING_IOC), '반환' (SYMBOL_FILLING_RETURN) 같은 다양한 채우기 정책이 포함됩니다. 채우기 정책 유형 반환: 마지막으로, 비교 결과를 바탕으로 채우기 정책 유형을 결정합니다. 만약 '채우거나 죽이기'와 일치하면 ORDER_FILLING_FOK를 반환하고, '즉시 또는 취소'와 일치하면 ORDER_FILLING_IOC를 반환합니다. 두 가지 모두에 해당하지 않으면 ORDER_FILLING_RETURN을 반환하게 됩니다. 정리하자면, 이 함수는 메타트레이더 5에서 심볼의 채우기 정책을 조회하고 반환할 수 있게 도와줍니다. 이렇게 하면 특정 금융 상품의 채우기 정책에 따라 트레이딩 결정을 내리는 데 유용하죠.

2023.09.26
AK-47 스캘퍼 EA: MetaTrader 5를 위한 효과적인 트레이딩 시스템
MetaTrader5
AK-47 스캘퍼 EA: MetaTrader 5를 위한 효과적인 트레이딩 시스템

안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 5에서 사용할 수 있는 강력한 스캘퍼 EA, "AK-47 EA"에 대해 이야기해보려고 합니다. 이 EA는 스캘핑 전략을 통해 단기 거래에서 수익을 극대화하도록 설계되었습니다. 1. 입력 파라미터 #define ExtBotName "AK-47 EA" // 봇 이름 #define  Version "1.00" // 입력 클래스 가져오기 #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh>   #include <Trade\AccountInfo.mqh> #include <Trade\OrderInfo.mqh> //--- 코드 가독성을 위한 미리 정의된 변수 소개 #define Ask    SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define Bid    SymbolInfoDouble(_Symbol, SYMBOL_BID) //--- 입력 파라미터 input string  EASettings         = "---------------------------------------------"; //-------- <EA 설정> -------- input int      InpMagicNumber    = 124656;   // 매직 넘버 input string  MoneySettings      = "---------------------------------------------"; //-------- <자금 설정> -------- input bool     isVolume_Percent  = true;     // 볼륨 퍼센트 허용 input double   InpRisk           = 3;        // 잔고의 리스크 비율 (%) input string  TradingSettings    = "---------------------------------------------"; //-------- <거래 설정> -------- input double   Inpuser_lot       = 0.01;     // 로트 input double   InpSL_Pips        = 3.5;      // 손절(핍 단위) input double   InpTP_Pips        = 7;        // 목표 수익(핍 단위) (0 = 목표 수익 없음) input int      InpMax_slippage   = 3;        // 허용 최대 슬리피지(핍 단위) input double   InpMax_spread     = 5;        // 허용 최대 스프레드(포인트 단위) (0 = 변동형) input string   TimeSettings      = "---------------------------------------------"; //-------- <거래 시간 설정> -------- input bool     InpTimeFilter     = true;     // 거래 시간 필터 input int      InpStartHour      = 2;        // 시작 시간 input int      InpStartMinute    = 30;       // 시작 분 input int      InpEndHour        = 21       // 종료 시간 input int      InpEndMinute      = 0        // 종료 분 2. 로컬 변수 초기화 //--- 변수들 int      Pips2Points;    // 슬리피지  3핍    3=포인트    30=포인트 double   Pips2Double;    // 손절 15핍    0.015      0.0150 bool     isOrder = false; int      slippage; long     acSpread; string   strComment = ""; CPositionInfo  m_position;                   // 거래 포지션 객체 CTrade         m_trade;                      // 거래 객체 CSymbolInfo    m_symbol;                     // 심볼 정보 객체 CAccountInfo   m_account;                    // 계좌 정보 래퍼 COrderInfo     m_order;                      // 미체결 주문 객체 3. 메인 코드 a/ 전문가 초기화 함수 //+------------------------------------------------------------------+ //| 전문가 초기화 함수                                   | //+------------------------------------------------------------------+ int OnInit() {    //3 또는 5자리 감지    // 핍과 포인트    if(_Digits % 2 == 1) {       Pips2Double  = _Point*10;       Pips2Points  = 10;       slippage = 10* InpMax_slippage;    }    else {       Pips2Double  = _Point;       Pips2Points  =  1;       slippage = InpMax_slippage;    }         if(!m_symbol.Name(Symbol())) // 심볼 이름 설정       return(INIT_FAILED);           RefreshRates(); //---    m_trade.SetExpertMagicNumber(InpMagicNumber);    m_trade.SetMarginMode();    m_trade.SetTypeFillingBySymbol(m_symbol.Name());    m_trade.SetDeviationInPoints(slippage); //---    return(INIT_SUCCEEDED); } b/ 전문가 틱 함수 //+------------------------------------------------------------------+ //| 전문가 틱 함수                                             | //+------------------------------------------------------------------+ void OnTick() {    if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) == false) {       Comment("LazyBot\n거래가 허용되지 않습니다.");       return;    }         MqlDateTime structTime;    TimeCurrent(structTime);    structTime.sec = 0;       // 시작 시간 설정    structTime.hour = InpStartHour;    structTime.min = InpStartMinute;          datetime timeStart = StructToTime(structTime);       // 종료 시간 설정    structTime.hour = InpEndHour;    structTime.min = InpEndMinute;    datetime timeEnd = StructToTime(structTime);       acSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);          strComment = "\n" + ExtBotName + " - v." + (string)Version;    strComment += "\n서버 시간 = " + TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " - " + DayOfWeekDescription(structTime.day_of_week);    strComment += "\n거래 시간 = [" + (string)InpStartHour + "h" + (string)InpStartMinute + " --> " +  (string)InpEndHour + "h" + (string)InpEndMinute + "]";       strComment += "\n현재 스프레드 = " + (string)acSpread + " 포인트";       Comment(strComment);       // 값 업데이트    UpdateOrders();       TrailingStop();           // 거래 조건    if(InpTimeFilter) {       if(TimeCurrent() >= timeStart && TimeCurrent() < timeEnd) {          if(!isOrder) OpenOrder();       }    }    else {       if(!isOrder) OpenOrder();    }    } //--- 함수 종료 3.1 주문 전송을 위한 신호 계산 //+------------------------------------------------------------------+ //| 신호 계산 및 주문 전송                                  | //+------------------------------------------------------------------+ void OpenOrder(){       ENUM_ORDER_TYPE OrdType = ORDER_TYPE_SELL;//-1;       double TP = 0;    double SL = 0;    string comment = ExtBotName;       // 로트 계산    double lot1 = CalculateVolume();       if(OrdType == ORDER_TYPE_SELL) {       double OpenPrice = Bid - NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits);              TP = OpenPrice - NormalizeDouble(InpTP_Pips * Pips2Double, _Digits);       SL = Ask + NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits);                if(CheckSpreadAllow()                                             // 스프레드 확인          && CheckVolumeValue(lot1)                                      // 볼륨 확인          && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, OpenPrice)  // OpenPrice에서 Bid까지의 거리 확인          && CheckStopLoss(OpenPrice,  SL, TP)                       // SL, TP와 OpenPrice 간의 거리 확인          && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_SELL)) // 명령이 실행 가능한지 확인       {          if(!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))          Print(__FUNCTION__,"--> 주문 전송 오류 ", m_trade.ResultComment());       }    }    else if(OrdType == ORDER_TYPE_BUY) {       double OpenPrice = Ask + NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits);       SL = Bid - NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits);              if(CheckSpreadAllow()                                             // 스프레드 확인          && CheckVolumeValue(lot1)                                      // 볼륨 확인          && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_BUY_STOP, OpenPrice)   // OpenPrice에서 Bid까지의 거리 확인          && CheckStopLoss(OpenPrice,  SL, TP)                              // SL, TP와 OpenPrice 간의 거리 확인          && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_BUY))  // 명령이 실행 가능한지 확인       {          if(!m_trade.BuyStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))// 만료일이 0일 때는 "ORDER_TIME_GTC" 사용          Print(__FUNCTION__,"--> 주문 전송 오류 ", m_trade.ResultComment());       }    }    } 3.2 볼륨 계산 //+------------------------------------------------------------------+ //| 볼륨 계산                                                 | //+------------------------------------------------------------------+ // 포지션 크기를 계산하고 주문할 로트를 반환하는 함수입니다. double CalculateVolume() {    double LotSize = 0;    if(isVolume_Percent == false) {       LotSize = Inpuser_lot;      }    else {       LotSize = (InpRisk) * m_account.FreeMargin();       LotSize = LotSize /100000;       double n = MathFloor(LotSize/Inpuser_lot);       //Comment((string)n);       LotSize = n * Inpuser_lot;              if(LotSize < Inpuser_lot)          LotSize = Inpuser_lot;       if(LotSize > m_symbol.LotsMax()) LotSize = m_symbol.LotsMax();       if(LotSize < m_symbol.LotsMin()) LotSize = m_symbol.LotsMin();    }      //---    return(LotSize); }3.3 EA의

2023.06.12
주식 기반 포지션 청산: 메타트레이더 5에서의 효과적인 방법
MetaTrader5
주식 기반 포지션 청산: 메타트레이더 5에서의 효과적인 방법

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 주식 기반 포지션을 효과적으로 청산하는 방법에 대해 이야기해볼게요. 포지션을 닫는 건 간단해 보이지만, 전략적으로 접근해야 원하는 결과를 얻을 수 있답니다.주식 기반 포지션 청산의 중요성주식 거래에서 포지션을 청산하는 이유는 다양하지만, 가장 큰 이유는 손실을 줄이거나 이익을 확정짓기 위함이에요. 적절한 타이밍에 포지션을 종료함으로써, 리스크를 최소화하고 수익을 극대화할 수 있습니다.메타트레이더 5에서 포지션 청산하기메타트레이더 5에서 포지션을 청산하는 방법은 다음과 같아요:트레이딩 터미널에서 청산하고 싶은 포지션을 선택하세요.포지션을 오른쪽 클릭한 후 '청산' 옵션을 선택합니다.청산 버튼을 클릭하면 포지션이 종료됩니다.이 과정은 매우 직관적이어서, 초보자들도 쉽게 따라할 수 있어요. 하지만, 청산을 결정하기 전에 항상 시장 상황을 분석하고, 자신이 설정한 목표 가격과 손절매를 고려해야 해요.마무리하며포지션 청산은 트레이딩 전략의 중요한 부분입니다. 메타트레이더 5의 기능을 잘 활용하여, 더 효과적인 거래를 이어가길 바랍니다. 앞으로도 다양한 트레이딩 팁과 정보를 공유할 예정이니, 많은 관심 부탁드려요!

2023.05.27
마틴게일 레벨을 활용한 자금 관리 방법 - 메타트레이더 5에서의 활용 팁
MetaTrader5
마틴게일 레벨을 활용한 자금 관리 방법 - 메타트레이더 5에서의 활용 팁

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 사용할 수 있는 자금 관리 알고리즘인 마틴게일 EA에 대해 알아보려고 합니다. 이 EA는 포지션을 열고 닫는 데 도움을 주며, 마틴게일 방식에 '배수기'(multiplier)를 적용한 것입니다. 이제 마틴게일 EA를 활용해보세요: 최고의 결과를 위해 포지션을 열기 전에 반드시 EA를 실행하세요. 어떤 차트에서도 'MartingaleEA-5Levels'를 실행하세요. 'Martingale 모드'를 활성화해야 합니다. 통화 쌍을 입력하세요. 예를 들어 EURUSD 또는 GBPUSD와 같이요. 마틴게일 배수를 선택하고 'Martingale Volume Multiplier'에 입력하세요. 예를 들어, 여기서 2를 입력하면 첫 번째 포지션의 볼륨이 1 롯일 때, 두 번째 포지션은 2 롯으로, 세 번째 포지션은 4 롯으로 열립니다. 이 EA는 최대 5개의 마틴게일 포지션을 열 수 있으니, 'Number Of Martingale Trading' 필드에 1에서 5 사이의 숫자를 입력하세요. 'Distance' 필드(거리 1부터 거리 5까지)에 각 포지션 간의 피프스(pips) 또는 포인트를 입력하세요. 'Close all positions when total take profit is' 필드에는 100과 같은 숫자를 입력하세요. 모든 마틴게일 포지션이 $100에 도달하면 모든 열려 있는 포지션이 닫힙니다. 'Close all positions when total stop loss is' 필드에는 -500과 같은 숫자를 입력하세요. 모든 마틴게일 포지션이 -$500에 도달하면 모든 열려 있는 포지션이 닫힙니다. 마틴게일 시스템을 활용하면 더욱 안정적으로 자금을 관리할 수 있습니다. 여러분의 트레이딩에 큰 도움이 되길 바랍니다!

2023.05.24
다이나믹 트레일링 스톱로스와 수익 목표 관리 - 메타트레이더 5를 위한 시스템
MetaTrader5
다이나믹 트레일링 스톱로스와 수익 목표 관리 - 메타트레이더 5를 위한 시스템

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 사용할 수 있는 다이나믹 트레일링 스톱로스와 수익 목표 관리 시스템에 대해 이야기해보려고 해요. 이 코드는 기존 거래를 관리하는 리스크 관리 전략으로, 입력된 파라미터에 따라 손익을 조절합니다. 코드에 대한 간단한 설명을 드릴게요: 거래 및 심볼 정보 클래스를 위한 필수 헤더 파일이 포함되어 있습니다. 리스크 비율, 수익 비율, 트레일링 스톱 포인트를 위한 입력 파라미터가 정의됩니다. 거래 및 심볼 정보를 위한 글로벌 변수가 선언됩니다. OnInit 함수는 심볼 정보 객체를 초기화하고 오류를 체크합니다. OnDeinit 함수는 이 경우 아무 작업도 수행하지 않습니다. OnTick 함수는 새로운 틱이 수신될 때마다 호출되며, CheckTrades 함수를 호출합니다. CheckTrades 함수는 열려 있는 모든 포지션을 반복하며 현재 심볼에 속하는지 확인합니다. 만약 그렇다면 현재 수익을 계산하고 손익 임계값에 도달했는지 판단합니다. 임계값에 도달하면 포지션을 닫습니다. 임계값에 도달하지 않았다면, 포지션 타입이 매수 또는 매도인지 확인하고 트레일링 스톱으로 스톱로스 수준을 업데이트합니다. 만약 새로운 스톱로스 수준이 현재 스톱로스 수준보다 유리하다면, 포지션은 새로운 스톱로스 수준으로 수정됩니다. 이 코드는 트레일링 스톱을 기반으로 스톱로스 수준을 동적으로 조정하고, 손익 임계값에 도달했을 때 거래를 종료하는 간단한 리스크 관리 전략을 제공합니다. 여러분의 거래에 도움이 되길 바랍니다!

2023.04.28
사용자 입력 기반으로 다수의 매수 및 매도 주문을 여는 EA 소개
MetaTrader5
사용자 입력 기반으로 다수의 매수 및 매도 주문을 여는 EA 소개

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5(MT5)에서 사용할 수 있는 새로운 EA(Expert Advisor)를 소개할게요. 이 EA는 사용자 입력에 따라 여러 개의 매수 및 매도 주문을 자동으로 열어주는 기능을 가지고 있어요. 이 EA의 주요 특징은 다음과 같습니다: 사용자 입력 변수: 매수 및 매도 주문 수, 거래당 위험 비율, 손절매, 이익 실현, 슬리피지 등을 설정할 수 있어요. 간편한 사용자 인터페이스: 매수와 매도 버튼이 있어 클릭만으로 여러 주문을 쉽게 열 수 있습니다. EA는 설정한 위험 비율과 손절매를 바탕으로 적절한 롯트 크기를 계산해요. 주문을 진행하기 전에 설정된 슬리피지와 스프레드를 체크하여 최적의 조건에서 거래를 시작하도록 합니다. 평균 가격이 현재 매도 호가보다 높으면 매수 주문을, 평균 가격이 현재 매수 호가보다 낮으면 매도 주문을 열게 됩니다. 사용자가 매수 또는 매도 버튼을 클릭하면, EA는 계산된 롯트 크기, 손절매, 이익 실현을 적용해 지정된 수의 매수 또는 매도 주문을 열어요. 하지만 이 EA는 간단한 예제일 뿐이므로, 실제 거래에 사용하기 전에 추가적인 수정 및 최적화가 필요할 수 있습니다. 따라서 실제 자금을 이용하기 전에는 데모 계좌에서 충분히 테스트하는 것이 중요해요. 더 궁금한 점이 있거나 도움이 필요하시면 언제든지 댓글로 알려주세요. 행복한 트레이딩 되세요!

2023.04.27
MetaTrader 5를 위한 CheckTrades: 리스크 관리의 새로운 접근
MetaTrader5
MetaTrader 5를 위한 CheckTrades: 리스크 관리의 새로운 접근

안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 5에서 사용할 수 있는 CheckTrades라는 시스템 트레이딩에 대해 알아보려고 합니다. 이 EA는 사용자 정의 이익 또는 손실 한계에 도달했을 때 열려 있는 포지션을 닫는 기능을 가진 MQL5 Expert Advisor입니다. CheckTrades의 핵심은 포지션의 리스크를 관리하는 것입니다. 이 EA는 진입 신호나 시장 타이밍 규칙을 제공하지 않으며, 오직 현재 포지션의 이익 또는 손실이 설정한 한계에 도달했을 때만 포지션을 종료합니다. EA에서 사용하는 외부 변수 RiskPercentage: 이 변수는 거래당 최대 허용 손실을 계좌 잔고의 퍼센트로 나타냅니다. 만약 열려 있는 포지션의 현재 손실이 이 비율에 도달하면 리스크를 제한하기 위해 포지션이 종료됩니다. ProfitPercentage: 이 변수는 거래당 원하는 이익을 계좌 잔고의 퍼센트로 나타냅니다. 열려 있는 포지션의 현재 이익이 이 비율에 도달하면 이익을 확보하기 위해 포지션이 종료됩니다. 이 EA는 리스크 관리에 중점을 두고 있으며, 특정 시장 지표에 의존하지 않기 때문에 모든 심볼이나 시간 프레임에서 적용할 수 있습니다. 하지만, 이 EA는 진입 신호와 다른 거래 관리 규칙이 포함된 거래 전략과 결합되어야 완전한 거래 시스템이 됩니다. 이 코드를 include 파일로 사용하고 싶다면 (MQL5\Include 폴더에 배치하면 됩니다), 사용자 정의 이익 및 손실 한계에 따라 포지션을 종료하는 리스크 관리의 주목적을 수행하게 됩니다. 또한, 포지션 사이즈 계산, 트레일링 스톱로스 등 특정 목적을 가진 다른 include 파일과 결합하여 사용할 수 있습니다. 그러기 위해선 메인 EA 파일에서 #include 지시어를 사용하여 이 파일을 포함시키고, 필요할 때 CheckTrades() 함수를 호출하여 열린 포지션을 관리할 수 있습니다.

2023.04.25
처음 이전 1 2 3 4 5 6 7 8 9 10 11 다음 마지막