Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1205

 

Добрый День!

Подскажите пожалуйста где можно найти советник который отправляет на почту или push письмо если цена выше верхней линии, или ниже нижней линии (линия горизонтальная или наклонная и ее можно передвигать на графике)

Может у кого есть, поделитесь пожалуйста.

Только на МТ5

Спасибо!

 

если я подключаю индикатор в ЕА

int OnInit()
{
   ind_handle = iCustom(_Symbol, indperiod, "MyInd", indParam);
   return(INIT_SUCCEEDED);
}

и затем получаю буфера индикатора с помощью CopyBuffer(ind_handle, 0, 1, 3, buffer1)


обязательно читать каждый тик индикаторные буфера

Нужен ответ и желательно первоисточник - доки, статьи:

1. индикатор всегда сам параллельно рассчитывается

2. индикатор будет рассчитываться только в момент вызова  CopyBuffer()

 
Igor Makanu:

если я подключаю индикатор в ЕА

и затем получаю буфера индикатора с помощью CopyBuffer(ind_handle, 0, 1, 3, buffer1)


обязательно читать каждый тик индикаторные буфера

Нужен ответ и желательно первоисточник - доки, статьи:

1. индикатор всегда сам параллельно рассчитывается

2. индикатор будет рассчитываться только в момент вызова  CopyBuffer()

Игорь, ну чисто логически, если индикатор правильно написан, то меняться могут только значения текущего бара. Следовательно если нужны текущие значения, то CopyBuffer нужно непосредственно перед использованием этих свежих значений. А если нужны исторические значения, то они не изменяются и никакого резона перечитывать их нет.

О расчёте индикатора на каждом тике где-то есть информация. На сколько я помню, по умолчанию индикатор пересчитывается только при обращении к нему, но есть возможность заставить его пересчитываться на каждом тике. Как это сделать надо искать в документации.

 
Alexey Viktorov:
Игорь, ну чисто логически, если индикатор правильно написан, то меняться могут только значения текущего бара. Следовательно если нужны текущие значения, то CopyBuffer нужно непосредственно перед использованием этих свежих значений. А если нужны исторические значения, то они не изменяются и никакого резона перечитывать их нет.

О расчёте индикатора на каждом тике где-то есть информация. На сколько я помню, по умолчанию индикатор пересчитывается только при обращении к нему, но есть возможность заставить его пересчитываться на каждом тике. Как это сделать надо искать в документации.

ОК, значит все равно тестировать придется

проблема в перерисовке индикатора, переписывать индикатор пока не хочется

 

mql5 (хедж)

Как реализовать  алгоритм закрытия позиций по двум  условиям?

1 случай.  Если открыто 2 позиции, то закрыть ту где прибыль больше чем...   2 случай.  Если открыто 2 и более позиций, то закрыть по усреднению на значение...

Сейчас у меня закрытие таких позиций происходит по двум методам,

для 1 случая сравнение позиций по профиту и закрытие той, чей профит больше, для 2 случая  закрытие всех позиций по усреднению, по Эквити.

В отдельности эти методы хорошо работают, но вместе ни как,  из-за того что одно из двух событий попадает под раздачу обеих методов.

И у меня ни как их не получается развести. В результате оба случая закрываются преимущественно по Эквити с закрытием всех позиций. Это приводит к тому, что в первом случае удаляется нужная позиция и открывается заново.

В результате. Двойной спрэд, двойная комиссия. Это огорчает)))

Схема установки ордеров и позиций выглядит так:   Для SELL (и далее только для SELL)

Лимитный ордер. SELL_LIMIT

позиция.                  SELL   (всегда между ордерами)

Стоповый ордер.  SELL_STOP

Графическую схему прилагаю.

 Закрытие позиций.

1. если сработал стоповый ордер, то есть одновременно  появились две или более поз, то нужно закрыть одну позицию, ту чей  профит больше чем... (20)

2. если сработал лимитный ордер, то есть открыто одновременно две или более поз, то нужно закрыть их по усреднению (по эквити) на значение...(15)

 Вопрос. Как развести два этих метода, что бы они обрабатывали только своё событие?

Быть может есть какой то другой метод как обработать два этих условия?

Примеры используемых мной методов.

//+---------------------------------------------------------------------+
//|  -- ЗАКРЫВАЕМ ОДНУ ИЗ ДВУХ ПОЗИЦИЙ С НИЗУ, ГДЕ ПРОФИТ БОЛЬШЕ ЧЕМ ---|
//+---------------------------------------------------------------------+ 
ulong ticket_n=ULONG_MAX;  double profit=DBL_MIN;

     if(invert_close == true) //Проверка на наличие 2х и более поз.
     {
     int positions=PositionsTotal();
     for(int i=PositionsTotal()-1; i>=0; i--)
     {
     ulong tmp_ticket=PositionGetTicket(i);
     if(ticket_n!=0)
     {
     double tmp_profit=PositionGetDouble(POSITION_PROFIT);
     if(tmp_profit>profit+Prof_eqw_niz)// допустим 20
     {
     ticket_n=tmp_ticket;
     profit=tmp_profit;
     }
     }
     }
//-----------
     if(ticket_n!=ULONG_MAX)
     m_trade.PositionClose(ticket_n);
     invert_close = false;
     Print("------  ЗАКРЫЛИ ТОЛСТУЮ ---------");
     }       

//+---------------------------------------------------------------------+
//|                     Э К В И Т И   ДЛЯ SELL_LIMIT                    |
//+---------------------------------------------------------------------+
   npos_ALL=0; NPos_ALL(npos_ALL);
   if (npos_ALL>=Metod_Eqw && m_account.Equity()>= m_account.Balance()+Prof_eqw)//Допустим 15
   {
   CloseAllPositions();
   Print("------  ЗАКРЫЛИ ВСЕ ---------");
   }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Файлы:
 
Vladpedro:


Позиции открываются по символу на котором работает советник? Magic number используется?
 
Vladimir Karputov:
Позиции открываются по символу на котором работает советник? Magic number используется

Да, по текущему символу.  Да магик используется.

 
Vladpedro:

Да, по текущему символу.  Да магик используется.

Объясните второе условие, что это значит? (Если открыто 2 и более позиций, то закрыть по усреднению на значение...)

 
Vladimir Karputov:

Объясните второе условие, что это значит? (Если открыто 2 и более позиций, то закрыть по усреднению на значение...)

Это значит:  Если открыто две или более позиций и сумма по Эквити больше баланса на какое то значение, (допустим 15) то закрываются все позиции. 

Например. открылись три позиции.  на первой текущий убыток -10, на второй -5, на третей профит +30 в сумме +15 можно закрывать все. 

Если усреднённый профит + 15 не был достигнут, то позиции закроются по своим собственным предустановленным  SL или ТР. (это вроде как третье условие закрытия позиций, но с ним проблем не возникает, по тому я о нём умолчал.)

 
Vladpedro:

Это значит:  Если открыто две или более позиций и сумма по Эквити больше баланса на какое то значение, (допустим 15) то закрываются все позиции. 

Например. открылись три позиции.  на первой текущий убыток -10, на второй -5, на третей профит +30 в сумме +15 можно закрывать все. 

Если усреднённый профит + 15 не был достигнут, то позиции закроются по своим собственным предустановленным  SL или ТР. (это вроде как третье условие закрытия позиций, но с ним проблем не возникает, по тому я о нём умолчал.)

Вот полный код для двух условий:

//+------------------------------------------------------------------+
//|                                       Closing Two conditions.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
/*
   barabashkakvn Trading engine 3.116
*/
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input double   InpProfitTarget      = 15;       // Profit target, in deposit money (if Positions > 2)
input ulong    InpDeviation         = 10;       // Deviation, in points (1.00045-1.00055=10 points)
input ulong    InpMagic             = 200;      // Magic number
//---
bool     m_need_close_all           = false;    // close all positions
ulong    m_need_close_ticket        = ULONG_MAX;// close one position
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(InpDeviation);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(m_need_close_all)
     {
      if(IsPositionExists())
        {
         CloseAllPositions();
         return;
        }
      else
         m_need_close_all=false;
     }
//---
   if(m_need_close_ticket!=ULONG_MAX)
     {
      //--- close one position
      if(m_position.SelectByTicket(m_need_close_ticket))
        {
         m_trade.PositionClose(m_need_close_ticket); // close a position
         return;
        }
      else
         m_need_close_ticket=ULONG_MAX;
     }
//--- calculate all positions
   int total=0;
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            total++;

   if(total==2)
     {
      //--- conditon 1
      ulong tmp_ticket=ULONG_MAX;
      double tmp_profit=DBL_MIN;
      for(int i=PositionsTotal()-1; i>=0; i--)
         if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
            if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
              {
               double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
               if(profit>tmp_profit)
                 {
                  tmp_profit=profit;
                  tmp_ticket=m_position.Ticket();
                 }
              }
      //---
      if(tmp_ticket!=ULONG_MAX)
         m_need_close_ticket=tmp_ticket;
     }
   else
     {
      if(total>2)
        {
         //--- conditon 2
         double profit=0;
         for(int i=PositionsTotal()-1; i>=0; i--)
            if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
               if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
                  profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
         //---
         if(profit>=InpProfitTarget)
            m_need_close_all=true;
        }
     }
  }
//+------------------------------------------------------------------+
//| Is position exists                                               |
//+------------------------------------------------------------------+
bool IsPositionExists(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified m_symbol
  }
//+------------------------------------------------------------------+
Файлы: