![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мастер MQL5 создаёт эксперта на базе класса "CExpert" и за открытие/закрытие/реверс отвечает главная функция "bool CExpert::Processing(void)".
При работе на хедж счёте нужно полностью переписать эту функцию и зависимые от неё в новом классе - наследнике от CExpert.
Ничего себе. Это задачка конкретная. Получается, нужно будет переопределить почти всё.
Может кто-то уже это делал?
Смысл действия в том, чтобы увеличивать позицию при движении инструмента в ненужную сторону и таким образом усреднять позицию и уменьшать убыток по ней.
Алгоритм такой: если цена откатывается на 1% в ненужную сторону, покупать еще лот к уже имеющемуся в позиции.
Какое же это усреднение? Это докупка против тренда. Усреднение - открытие противоположных позиций с увеличенным лотом, таким, чтобы через в процессе ненужного движения прибыль от противоположных позиций сравнялась или стала больше убытка от текущей позиции. Тогда и закрывать текущую через CTrade.PositionCloseBy
Какое же это усреднение? Это докупка против тренда. Усреднение - открытие противоположных позиций с увеличенным лотом, таким, чтобы через в процессе ненужного движения прибыль от противоположных позиций сравнялась или стала больше убытка от текущей позиции. Тогда и закрывать текущую через CTrade.PositionCloseBy
Да, это то, что Вы называете докупкой против тренда. Вопрос в том, каким образом её сделать через CExpert
Примерно так:
//| ExpertAveraging.mqh |
//| Copyright © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#include "Expert.mqh"
//+------------------------------------------------------------------+
//| Class CExpertAveraging. |
//| Purpose: Base class expert advisor. |
//| Derives from class CExpert. |
//+------------------------------------------------------------------+
class CExpertAveraging : public CExpert
{
protected:
public:
protected:
//--- processing (main method)
virtual bool Processing(void);
};
//+------------------------------------------------------------------+
//| Main function |
//+------------------------------------------------------------------+
bool CExpertAveraging::Processing(void)
{
//--- calculate signal direction once
m_signal.SetDirection();
//--- check if open positions
if(SelectPosition())
{
//--- drawdown test
double balance=m_account.Balance();
double equity=m_account.Equity();
if(equity/balance<0.99)
{
//--- check the possibility of opening a position/setting pending order
if(CheckOpen())
return(true);
}
//--- open position is available
//--- check the possibility of reverse the position
if(CheckReverse())
return(true);
//--- check the possibility of closing the position/delete pending orders
if(!CheckClose())
{
//--- check the possibility of modifying the position
if(CheckTrailingStop())
return(true);
//--- return without operations
return(false);
}
}
//--- check if plased pending orders
int total=OrdersTotal();
if(total!=0)
{
for(int i=total-1; i>=0; i--)
{
m_order.SelectByIndex(i);
if(m_order.Symbol()!=m_symbol.Name())
continue;
if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT || m_order.OrderType()==ORDER_TYPE_BUY_STOP)
{
//--- check the ability to delete a pending order to buy
if(CheckDeleteOrderLong())
return(true);
//--- check the possibility of modifying a pending order to buy
if(CheckTrailingOrderLong())
return(true);
}
else
{
//--- check the ability to delete a pending order to sell
if(CheckDeleteOrderShort())
return(true);
//--- check the possibility of modifying a pending order to sell
if(CheckTrailingOrderShort())
return(true);
}
//--- return without operations
return(false);
}
}
//--- check the possibility of opening a position/setting pending order
if(CheckOpen())
return(true);
//--- return without operations
return(false);
}
//+------------------------------------------------------------------+
и в эксперте, который сгенерировал Мастер MQL5 заменить в двух местах:
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Expert\ExpertAveraging.mqh>
//--- available signals
.
.
.
//+------------------------------------------------------------------+
//| Global expert object |
//+------------------------------------------------------------------+
CExpertAveraging ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert |
//+------------------------------------------------------------------+
Но это очень грубо - просто набросок.