개요
- 이벤트 드리븐 방식으로 포지션 생성,제거(청산) 시점 검출 코드 클래스로 구현.
백그라운드.
- 메타트레이더 EA 구현시 포지션 정보를 함수 호출하여 폴링으로 확인하는건 이 코드예 에서 처럼 간단하게 구현가능하다.
- 그러나, 포지션 변경이 언제 생길지 알수 없는데 수시로 함수호출하는 폴링방식으로 포지션의 생성 , 청산을 확인 하는 코드는 비효율적일 수 밖에 없기에, 이벤트 드리븐 방식으로 포지션 생성/청산 시점 검출방식으로 구현되어야 한다.
- 포지션 생성, 청산시 호출되는 이벤트핸들러는 OnTrade() 이며, 이곳에서 구현하면 되는데, OnTrade 로는 포지션외에 주문관련 이벤트를 비롯하여 여러 가지 이벤트 요인에 의하여 호출된다.
- OnTrade() 로 포지션 생성/청산 정보 검출하려면 사용자가 직접 로직을 설계하고 필요에 맞게 구현해야한다.
코드 구현 개념.
1. CHashMap<long, int> map_PosiSymbol; 맵에는 항상 현재 시점 심볼1개(EA 적용중인 챠트의 심볼)포지션 오픈된것만 저장해두는 용도.
2. 초기 EA 실행시점 심볼의 모든 포지션 ticket 을 맵의 키에 저장 .
3. 이벤트 핸들러 OnTrade 에서 클래스 함수 OnTrade_CyManagerPosi(); 호출해두면 함수 내부적으로 포지션 신규 생성, 제거된것 검출 이뤄짐.
//+------------------------------------------------------------------+ | |
//| CyManager_Posi.mqh | | |
//| igotit | | |
//| https://www.mql5.com | | |
//+------------------------------------------------------------------+ | |
#property copyright "igotit" | |
#property link "https://www.mql5.com" | |
#property version "1.00" | |
#include <Trade\PositionInfo.mqh> | |
#include <Generic\HashMap.mqh> | |
#include <Arrays\ArrayLong.mqh> | |
class CCyManagerPosi | |
{ | |
private: | |
string m_strSymbol; // 생성자에서 전달방은 심볼 1개의 포지션만 관리함. | |
CPositionInfo m_CPosiInfo; // 포지션 정보 확보 편리. | |
CHashMap<long, int> map_PosiSymbol; //심볼1개의 포지션 티켓을 저장용 맵. key : ticket of position. value : not used. 임의 값 기록해둬도 됨. | |
void Proc_Check_Posi_CreateDelete(string str_symbol); | |
public: | |
CCyManagerPosi(string str_symbol); | |
~CCyManagerPosi(); | |
void OnTrade_CyManagerPosi(); // OnTrade 에서 호출. | |
}; | |
CCyManagerPosi::CCyManagerPosi(string str_symbol) | |
{ | |
m_strSymbol = str_symbol; | |
map_PosiSymbol.Clear(); | |
Proc_Check_Posi_CreateDelete(str_symbol); // 클래스 개체 생성시점 1회만 하면됨. OnInit 에서 호출할 필요없음. | |
} | |
CCyManagerPosi::~CCyManagerPosi() | |
{ | |
} | |
void CCyManagerPosi::OnTrade_CyManagerPosi() | |
{ | |
Proc_Check_Posi_CreateDelete(m_strSymbol); | |
} | |
void CCyManagerPosi::Proc_Check_Posi_CreateDelete(string str_symbol) | |
{ | |
int num_posi_total = PositionsTotal(); // 전종목의 포지션수량. | |
CHashMap<long,int> map_temp_posi_symbol; | |
for(int idx_posi=0; idx_posi<num_posi_total; idx_posi++) | |
{ | |
m_CPosiInfo.SelectByIndex(idx_posi); | |
if(m_CPosiInfo.Symbol() == str_symbol) | |
{ | |
/// check for creation position | |
long ticket = m_CPosiInfo.Ticket(); | |
if(map_PosiSymbol.ContainsKey(ticket)) // map 에 기등록 상태. | |
{ | |
// Print("already exist map"); | |
} | |
else // map 에 없음. 신규 포지션 생성된것 | |
{ | |
// TO DO : Do Something when position created. | |
Print("Position. add to map for Symbol : " + str_symbol);// test | |
map_PosiSymbol.Add(ticket,1);// map 에 추가. value에는 아무거나 기록해도됨 활용하지 않음. | |
} | |
map_temp_posi_symbol.Add(ticket,1); // 현재 심볼의 모든 포지션을 임시 map 에 모두 저장해둠. 아래 포지션 제거된것 확인용. | |
} // if symbol | |
} // for | |
/// check for deleted position | |
int num_posi_map = map_PosiSymbol.Count(); | |
if(num_posi_map > map_temp_posi_symbol.Count()) | |
{ | |
/// search for deleted position ticket. | |
long keys[]; | |
int values[]; | |
CArrayLong arr_keys_deleted; | |
map_PosiSymbol.CopyTo(keys, values); | |
int count_deleted=0; | |
for(int idx_posi=0; idx_posi < num_posi_map; idx_posi++) | |
{ | |
if( map_temp_posi_symbol.ContainsKey(keys[idx_posi]) == false) // 포지션 제거되었음. | |
{ | |
arr_keys_deleted.Add(keys[idx_posi]); | |
}// if | |
}// for | |
// 제거된 포지션들 map 에서도 제거. | |
for(int idx = 0; idx<arr_keys_deleted.Total();idx++) | |
{ | |
// TO DO : Do Something when position deleted. | |
Print("Position Deleted : " + arr_keys_deleted.At(idx)); | |
map_PosiSymbol.Remove(arr_keys_deleted.At(idx)); | |
} | |
} | |
} | |
///////////////// example ///////////////////////////////////////////////// | |
#include "CyManagerPosi.mqh" | |
CCyManagerPosi m_CyManagerPosi(_Symbol); // ea 배치된 챠트의 심볼 1개의 포지션 관리. | |
void OnTrade() | |
{ | |
m_CyManagerPosi.OnTrade_CyManagerPosi(); | |
} | |
실행샷
- 상기 코드를 메타트레이더에서 실행시켜보면 아래 화면의 Experts 출력부분에 포지션 추가, 제거시마다 해당 정보 검출되어 표현.

재료들
MQL5. 클래스 만들기
MQL5 에서는 C++과 동일 문법의 클래스 만들 수 있고, 활용가능하다. 통상 C++ 에서는 클래스 코드작성시 헤더파일에 선언 몰아두고 함수정의는 c 파일에서 작성하나, MQL5 에서는 확장자mqh (헤더파
igotit.tistory.com
MQL5. 포지션 함수, 클래스 활용코드 . 심볼1개의 모든 포지션등.
1. 계정의 모든 심볼의 모든 포지션 정보들 확보하기. #include CPositionInfo m_PosiInfo; int Proc_SupplyPosition() { int num_position_all_symbol = PositionsTotal(); // 계좌의 모든 포지션 수량 반환됨. f..
igotit.tistory.com
MQL5. CHashMap iteration.반복
MQL5 의 컬렉션은 컬렉션 자체의 반복 수단 제공되지 않으며, 컬렉션 요소를 CopyTo 로 array 로 복사한 이후 array로 루프돌림 #include CHashMap map_My; string keys[]; int values[]; map_my.CopyTo(keys, val..
igotit.tistory.com
MQL5. CArray. 동적 배열
CArray - CArray 를 베이스 클래스로 하는 CArrayChar, CArrayDouble, CArrayFloat, CArrayInt, CArrayLong, CArrayObj, CArrayShort, CArrayString 코드예. - CArrayLong - 다른 것도 거의 동일. #include..
igotit.tistory.com
상위정리
메타트레이더 5. 체계정리. 활용법/지식
MetaTrader 5 메타트레이더 5 , 메타에디터, MQL5 활용정보 체계정리. 본 글에서 주요 정리대상 정보 1. 메타트레이더 5 사용법. 2. MQL5 언어 기반 "직접 코딩"하여 메타프레이더5에서 자동매매 달성하기
igotit.tistory.com
첫 등록 : 2020.11.09
최종 수정 :
단축 주소 : https://igotit.tistory.com/2692
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MQL5. CSymbolInfo. class for easy access to the symbol properties. (0) | 2020.11.21 |
---|---|
MQL5. Symbol Specification (0) | 2020.11.21 |
MQL5. CArray. 동적 배열 (0) | 2020.11.09 |
MQL5. CHashMap iteration.반복 (0) | 2020.11.09 |
MQL5. 포지션 함수, 클래스 활용코드 . 심볼1개의 모든 포지션등. (3) | 2020.11.08 |
댓글