개요
MetaEditor 에서 신규 스크립트 생성하기.
- 본 예에서는 Scripts 하위에 폴더 igotit 를 만들고 이곳에 스크립트 파일(이름 예 : CyClosePositionAll ) 생성한다.
코드
- 아래 소스 코드 처럼 작성하자. 기본 생성된 것에서 라인 10, 12, 18 추가된것이 전부임.
- 아래 소스코드에서 1번째 OnStart 함수내부구현 코드는 1개의 포지션만 청산시키는 것.
- 아래 소스코드에서 2번째 OnStart 함수내부구현 코드는 모든 포지션 청산시키는 것.
//+------------------------------------------------------------------+ | |
//| CyClosePositionAll.mq5 | | |
//| igotit | | |
//| http://igotit.tistory.com | | |
//+------------------------------------------------------------------+ | |
#property copyright "igotit" | |
#property link "http://igotit.tistory.com" | |
#property version "1.00" | |
#include <Trade\Trade.mqh> | |
CTrade trade; | |
//+------------------------------------------------------------------+ | |
//| Script program start function | | |
//+------------------------------------------------------------------+ | |
///// close only one position which lowest ticket number. | |
void OnStart() // | |
{ | |
trade.PositionClose(Symbol()); | |
} | |
//+------------------------------------------------------------------+ | |
//// close all postion | |
void OnStart() | |
{ | |
int maxnum_position = PositionsTotal(); | |
for(int i=0; i<maxnum_position; i++ ) | |
{ | |
trade.PositionClose(Symbol()); | |
} | |
} |
1번 OnStart 코드에서의 작동.
- 스크립트 1회 실행에 1개의 포지션만 청산하는 중. Trade 리스트중에서 가장 작은 Ticket 번호부터 청산시킨다.
2번 OnStart 코드에서의 작동
- 의도했던 스크립트 1회 실행에 보유한 모든 포지션 청산된다.
상기 코드 예에서는 PositionClose 함수 호출시 인자로 Symbol() 을 입력하고 있기 때문에 스크립트를 배치한 챠트의 1개 종목에 대해서만 보유한 모든 포지션 청산이 이뤄지고 있다. 챠트의 종목이 무엇이든 모든 종목의 포지션 정리하는 함수는 아래와 같이 구현가능하다.
void OnStart()
{
maxnum_position = PositionsTotal(); // total number of position
while(maxnum_position>0)
{
if(trade.PositionClose(PositionGetSymbol(maxnum_position-1))) maxnum_position--;
}
}
코드예
- 챠트의 symbol 의 모든포지션, 매수포지션, 매도 포지션 시장가 청산하는 코드예.
- 무결성, 무오류 확인된것.
- 코드의 주요처리부분 : 매수포지션, 매도 포지션 청산주문 처리시 CArrayLong 형식으로 선언된 컬렉션 변수 m_CArrayLong_TicketPosi 에서 먼저 ticket 부터 모두 저장한이후 포지션 청산수행하는것.
//+------------------------------------------------------------------+ | |
//| CyClosePositionAllSymbol.mq5 | | |
//| igotit | | |
//| http://igotit.tistory.com | | |
//+------------------------------------------------------------------+ | |
#property copyright "igotit" | |
#property link "http://igotit.tistory.com" | |
#property version "1.00" | |
#include <Trade\Trade.mqh> | |
#include <Arrays\ArrayLong.mqh> | |
CTrade trade; | |
CPositionInfo m_CPositionInfo; | |
CArrayLong m_CArrayLong_TicketPosi; | |
int maxnum_position; | |
//+------------------------------------------------------------------+ | |
//| Script program start function | | |
//+------------------------------------------------------------------+ | |
void OnStart() | |
{ | |
Close_PositionAll_Symbol(_Symbol); | |
// Close_PositionBuyAll_Symbol(_Symbol); | |
// Close_PositionSellAll_Symbol(_Symbol); | |
} | |
void Close_PositionAll_Symbol(string symbol) | |
{ | |
if(PositionsTotal() == 0) return; // no position at all, return | |
/// at least one position for the symbol. | |
while(m_CPositionInfo.Select(symbol) == true) | |
{ | |
trade.PositionClose(symbol); // close one position per call. | |
} | |
} | |
/* | |
Close Position Buy All for only one symbol | |
*/ | |
void Close_PositionBuyAll_Symbol(string symbol) | |
{ | |
int num_position_total = PositionsTotal(); // total number of position | |
if(num_position_total == 0) return; | |
int idx =0; | |
///get all ticket for position buy for the symbol | |
m_CArrayLong_TicketPosi.Clear(); | |
for(idx=0; idx<num_position_total; idx++) | |
{ | |
if(symbol == PositionGetSymbol(idx)) //only for target symbol | |
{ | |
if(POSITION_TYPE_BUY == m_CPositionInfo.PositionType()) | |
{ | |
m_CArrayLong_TicketPosi.Add(m_CPositionInfo.Ticket()); | |
} | |
} | |
} | |
for(idx = 0; idx< m_CArrayLong_TicketPosi.Total(); idx++) | |
{ | |
trade.PositionClose(m_CArrayLong_TicketPosi.At(idx)); // close by ticket | |
} | |
} | |
/* | |
Close Position Sell All for only one symbol | |
*/ | |
void Close_PositionSellAll_Symbol(string symbol) | |
{ | |
int num_position_total = PositionsTotal(); // total number of position | |
if(num_position_total == 0) return; | |
int idx =0; | |
///get all ticket for position buy for the symbol | |
m_CArrayLong_TicketPosi.Clear(); | |
for(idx=0; idx<num_position_total; idx++) | |
{ | |
if(symbol == PositionGetSymbol(idx)) //only for target symbol | |
{ | |
if(POSITION_TYPE_SELL == m_CPositionInfo.PositionType()) | |
{ | |
m_CArrayLong_TicketPosi.Add(m_CPositionInfo.Ticket()); | |
} | |
} | |
} | |
for(idx = 0; idx< m_CArrayLong_TicketPosi.Total(); idx++) | |
{ | |
trade.PositionClose(m_CArrayLong_TicketPosi.At(idx)); // close by ticket | |
} | |
} |
상위 정리글.
메타트레이더 5. 체계정리. 활용법/지식
MetaTrader 5 메타트레이더 5 , 메타에디터, MQL5 활용정보 체계정리. 본 글에서 주요 정리대상 정보 1. 메타트레이더 5 사용법. 2. MQL5 언어 기반 "직접 코딩"하여 메타프레이더5에서 자동매매 달성하기 위한 기..
igotit.tistory.com
첫글등록 : 2018년 8월 27일.
최종수정 : 2019년 4월 19일
본글단축주소 : https://igotit.tistory.com/1832
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MQL5. PositionsTotal (0) | 2019.04.19 |
---|---|
MQL5. NormalizeDouble (0) | 2019.04.19 |
메타트레이더 5. MQL5. 이벤트 및 핸들러. (0) | 2019.04.17 |
MQL5 (MetaTrader 5) 에서 Visual C++ DLL 로딩하기 (0) | 2019.04.16 |
메타트레이더 5. MQL5. 주문함수 오류 및 해결방법. (1) | 2018.08.28 |
댓글