Собрал Франкенштейна. Конечно же он не работает.

 

По идее советник следит за открытой позицией. Выставляет максимальный профит и когда профит опустится до 50% от максимума (можно изменить) любая сделка закрывается.

И как здесь поставить таймер, чтобы сходу не закрыл ордер.

double profit;
double maxprofit;
double input percent =50.0; //процент
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+       
//|Функция возвращает профит последней позиции                       |
//+------------------------------------------------------------------+
double ProfitLastPos()
  {
  maxprofit=0.0;
// --- определение границ требуемой торговой истории
   datetime end=TimeCurrent();                 // текущее серверное время
   datetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
//--- запросим в кэш программы торговую историю за день
   if(HistorySelect(start,end))
     {
      //--- получим количество сделок в истории
      int history_orders=HistoryDealsTotal();
      //--- получим тикет сделки из истории, имеющей последний индекс в списке
      ulong order_ticket=HistoryDealGetTicket(history_orders-1);

      if(order_ticket>0) // получили в кэш историческую сделку, работаем с ней
        {
        
         profit=(HistoryDealGetDouble(order_ticket,DEAL_PROFIT));
         if(profit>maxprofit)
           {
            maxprofit=profit;
            Comment(maxprofit);
           }
           if(profit<(maxprofit*percent/100))
             {
              //--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // количество открытых позиций   
//--- перебор всех открытых позиций
   for(int i=total-1; i>=0; i--)
     {
      //--- параметры ордера
      ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber позиции
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции
      //--- вывод информации о позиции
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- если MagicNumber совпадает
      if(magic==EXPERT_MAGIC)
        {
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
         //--- установка параметров операции
         request.action   =TRADE_ACTION_DEAL;        // тип торговой операции
         request.position =position_ticket;          // тикет позиции
         request.symbol   =position_symbol;          // символ 
         request.volume   =volume;                   // объем позиции
         request.deviation=5;                        // допустимое отклонение от цены
         request.magic    =EXPERT_MAGIC;             // MagicNumber позиции
         //--- установка цены и типа ордера в зависимости от типа позиции
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- вывод информации о закрытии
         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         maxprofit=0;
         //--- отправка запроса
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());
            SendNotification("Проверь сделки");  // если отправить запрос не удалось, вывести код ошибки
         //--- информация об операции   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
     }
     }
     }
   return(profit);
  }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
burB0T:

По идее советник следит за открытой позицией. Выставляет максимальный профит и когда профит опустится до 50% от максимума (можно изменить) любая сделка закрывается.

И как здесь поставить таймер, чтобы сходу не закрыл ордер.

Попробуй так, должно работать. Но это не точно)))

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_PositionInfo;
CTrade         m_trade;
input double percent =50.0; //процент
input ulong  Magic                       =  673984;          // magic
double profit,maxprofit;
//+------------------------------------------------------------------+
int OnInit()
  {
   m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   profit= Profit();
   maxprofit=profit>maxprofit?profit:maxprofit;
   if(profit>0&&profit<=maxprofit*100*percent)
      PositionClose();
  }
//+------------------------------------------------------------------+
double Profit(void)
  {
   double prof=0;
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_PositionInfo.SelectByIndex(i))
         if(m_PositionInfo.Symbol()==_Symbol && m_PositionInfo.Magic()==Magic)
            prof+=m_PositionInfo.Commission()+m_PositionInfo.Swap()+m_PositionInfo.Profit();
   return(prof);
  }
//+------------------------------------------------------------------+
void PositionClose()
  {
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      if(m_PositionInfo.SelectByIndex(i))
         if(m_PositionInfo.Symbol()==_Symbol && m_PositionInfo.Magic() == Magic)
            m_trade.PositionClose(m_PositionInfo.Ticket());
     }
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii:

Попробуй так, должно работать. Но это не точно)))

Не работает увы. Вывел comment максимального профита. По нулям. Сделка не закрывается

maxprofit/100*percent
Документация по MQL5: Общие функции / Comment
Документация по MQL5: Общие функции / Comment
  • www.mql5.com
[in]   Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n". Количество параметров не может превышать 64. Общая длина выводимого сообщения (включая служебные неотображаемые символы) не может превышать 2045 символов (лишние символы будут обрезаны...
 
burB0T:

Не работает увы. Вывел comment максимального профита. По нулям. Сделка не закрывается

Тогда придётся что-нибудь почитать. 

 
burB0T:

Не работает увы. Вывел comment максимального профита. По нулям. Сделка не закрывается

maxprofit/100*percent  это, да, лоханулся.

А в остальном всё работает. Я проверил.

Сделку открываешь вручную? Откроешь сделку экспертом с магиком, всё заработает. Или убери магик из эксперта.

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_PositionInfo;
CTrade         m_trade;
input double percent =50.0; //процент
double profit,maxprofit;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   profit= Profit();
   maxprofit=profit>maxprofit?profit:maxprofit;
   if(profit>0&&profit<=maxprofit/100*percent)
     {
      PositionClose();
      maxprofit = 0;
     }
  }
//+------------------------------------------------------------------+
double Profit(void)
  {
   double prof=0;
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_PositionInfo.SelectByIndex(i))
         if(m_PositionInfo.Symbol()==_Symbol)
            prof+=m_PositionInfo.Commission()+m_PositionInfo.Swap()+m_PositionInfo.Profit();
   return(prof);
  }
//+------------------------------------------------------------------+
void PositionClose()
  {
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      if(m_PositionInfo.SelectByIndex(i))
         if(m_PositionInfo.Symbol()==_Symbol)
            m_trade.PositionClose(m_PositionInfo.Ticket());
     }
  }
//+------------------------------------------------------------------+
Файлы:
burB0T.mq5  7 kb
 
Aleksandr Slavskii:

А в остальном всё работает. Я проверил.

Сделку открываешь вручную? Откроешь сделку экспертом с магиком, всё заработает. Или убери магик из эксперта.

Для проверки открыл вручную.

Думал почему не работает, даже начал делать с

ACCOUNT_PROP_PROFIT
 
Aleksandr Slavskii:

А в остальном всё работает. Я проверил.

Сделку открываешь вручную? Откроешь сделку экспертом с магиком, всё заработает. Или убери магик из эксперта.

Спасибо огромное.
Причина обращения: