Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не понял насчет кол-ва строк в логах.. зачем именно 4, но я закрываю вот так, готовый пример - открывает позу и частично закрывает. Остается 0.25 лотов от начальных 0.5. И не надо библиотеку править. Оформить это все в методы и думаю норм.
//| PosPartClose.mq5 |
//| Copyright 2015, MA. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
CTrade m_Trade;
CPositionInfo m_Position;
CAccountInfo m_Account;
MqlTradeRequest m_request;
MqlTradeResult m_result;
MqlTick fpprcurr;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(CountPosBuy(_Symbol)==0 && CountPosSell(_Symbol)==0)
{
double priceBuy=fpprcurr.ask;
m_Trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.5,priceBuy,0,0,NULL);
ulong ticket;
for(int pos=PositionsTotal(); pos>=0; pos--)
{
string symb=PositionGetSymbol(pos);
if(m_Position.Select(symb) && m_Position.Type()==POSITION_TYPE_BUY)
{
ticket=m_Position.Ticket();
}
}
m_request.position=PositionGetInteger(POSITION_TICKET);
m_request.order=ticket;
m_request.type =ORDER_TYPE_SELL;
m_request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
m_request.action =TRADE_ACTION_DEAL;
m_request.symbol =_Symbol;
m_request.volume =0.25;
OrderSend(m_request,m_result);
}
}
//+------------------------------------------------------------------+
int CountPosBuy(string symbol)
{
int result=0;
for(int k=0; k<PositionsTotal(); k++)
{
if(m_Position.Select(symbol)==true)
{
if(m_Position.PositionType()==POSITION_TYPE_BUY)
{result++;}
else
{}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountPosSell(string symbol)
{
int result=0;
for(int k=0; k<PositionsTotal(); k++)
{
if(m_Position.Select(symbol)==true)
{
if(m_Position.PositionType()==POSITION_TYPE_SELL)
{result++;}
else
{}
}
}
return(result);
}
Вопрос о четырёх строках был не случайным. Я на MQL5 пишу опираясь на стандартную библиотеку, и вот когда стала задача частично закрыть позицию на hedge счёте, сначала пришло решение "влоб": открыть противоположную позицию половинным объёмом, потом закрыть используя CTrade::PositionCloseBy.
Конечно при таком подходе получалось далеко не четыре строчки в журнале :). Потом немного подумав переиначил задачу.
В итоге появился такой класс:
//| CPartialClosing.mqh |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.000"
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Class CPartialClosing. |
//| Appointment: Class trade operations - Partial closing. |
//| Derives from class CTrade. |
//+------------------------------------------------------------------+
class CPartialClosing : public CTrade
{
public:
CPartialClosing();
~CPartialClosing();
bool PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX,const double partial_volume=0);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CPartialClosing::CPartialClosing()
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CPartialClosing::~CPartialClosing()
{
}
//+------------------------------------------------------------------+
//| Close specified opened position |
//+------------------------------------------------------------------+
bool CPartialClosing::PositionClose(const ulong ticket,const ulong deviation,const double partial_volume=0)
{
//--- check stopped
if(IsStopped(__FUNCTION__))
return(false);
//--- check position existence
if(!PositionSelectByTicket(ticket))
return(false);
string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
ClearStructures();
//--- check
if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
//--- prepare request for close BUY position
m_request.type =ORDER_TYPE_SELL;
m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
}
else
{
//--- prepare request for close SELL position
m_request.type =ORDER_TYPE_BUY;
m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
}
//--- setting request
m_request.action =TRADE_ACTION_DEAL;
m_request.position =ticket;
m_request.symbol =symbol;
m_request.volume =(partial_volume==0) ? PositionGetDouble(POSITION_VOLUME) : partial_volume;
m_request.magic =m_magic;
m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
PrintFormat("PositionClose #%I64d %s %.2f",ticket,EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),m_request.volume);
return(OrderSend(m_request,m_result));
}
//+------------------------------------------------------------------+
Таким образом, если нужно частичное закрытие, подключаю этом класс вместо CTrade.
Вопрос о четырёх строках был не случайным. Я на MQL5 пишу опираясь на стандартную библиотеку, и вот когда стала задача частично закрыть позицию на hedge счёте, сначала пришло решение "влоб": открыть противоположную позицию половинным объёмом, потом закрыть используя CTrade::PositionCloseBy.
Конечно при таком подходе получалось далеко не четыре строчки в журнале :). Потом немного подумав переиначил задачу.
В билде 1545, в торговом классе CTrade появился новый метод - PositionClosePartial:
PositionClosePartial
Документация | 2017.02.10 09:52