Помогите с MQL5

 

Добрый день. Есть несколько вопросов к профи. Подскажите как прописать в советники, чтоб был выбор например только на открытие ордеров на продажу или на покупку. И да подскажите в какую тему дальше писать по разработке.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
makssub:
Добрый день. Есть несколько вопросов к профи. Подскажите как прописать в советники, чтоб был выбор например только на открытие ордеров на продажу или на покупку.

Что значит "чтоб был выбор"? Вы хотите выбирать позиции ТОЛЬКО ОДНОГО НАПРАВЛЕНИЯ? Или Вы хотите выбирать сигналы ОПРЕДЕЛЕННОГО НАПРАВЛЕНИЯ?

 
Vladimir Karputov:

Что значит "чтоб был выбор"? Вы хотите выбирать позиции ТОЛЬКО ОДНОГО НАПРАВЛЕНИЯ? Или Вы хотите выбирать сигналы ОПРЕДЕЛЕННОГО НАПРАВЛЕНИЯЯ 

Я хочу найти ордер самый дальний по пунктам от текущей цены и закрыть его. Не зависимо на какой валютной паре и в какую сторону он идет)

 
makssub:

Я хочу найти ордер самый дальний по пунктам от текущей цены и закрыть его. Не зависимо на какой валютной паре и в какую сторону он идет)

Не ордера, а позиции.

Вот основа - на базе этого можно найти что угодно. Данная функция возвращает в переменную 'price_highest_buy' цену самой высокой позиции BUY, а в переменную 'price_lowest_sell' - самой низкой позиции SELL.

//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
void CalculateAllPositions(double &price_highest_buy,double &price_lowest_sell)
  {
//--- auxiliary variables
   double price_highest_buy   = DBL_MIN;
   double price_lowest_sell   = DBL_MAX;
//---
   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)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceOpen()>price_highest_buy) // the highest position of "BUY" is found
                  price_highest_buy=m_position.PriceOpen();
               continue;
              }
            else
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_position.PriceOpen()<price_lowest_sell) // the lowest position of "SELL" is found
                     price_lowest_sell=m_position.PriceOpen();
                 }
           }
  }
 

ни в одном месте не спец в MQl5 , но найти тикет открытой позиции которая находится дальше от цены можно попробовать так:

void OnStart()
{
   while(!IsStopped())
   {
      ulong ticket = 0;
      int max_pips = INT_MIN;
      for(int i = PositionsTotal() - 1; i >= 0; i--)
      {
         ulong curr_ticket = PositionGetTicket(i);
         string pos_sym = PositionGetString(POSITION_SYMBOL);
         double pos_point = SymbolInfoDouble(pos_sym, SYMBOL_POINT);
         int pos_pip = fabs(PriceToInteger(PositionGetDouble(POSITION_PRICE_OPEN), pos_point)
                            - PriceToInteger(PositionGetDouble(POSITION_PRICE_CURRENT), pos_point));
         if(max_pips < pos_pip)
         {
            max_pips = pos_pip;
            ticket = curr_ticket;
         }
      }
      if(ticket > 0) Comment("Max pips in position = ", max_pips, " , ticket = ", ticket);
      else Comment("");
   }
   Comment("");
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
 
Vladimir Karputov:

Не ордера, а позиции.

Вот основа - на базе этого можно найти что угодно. Данная функция возвращает в переменную 'price_highest_buy' цену самой высокой позиции BUY, а в переменную 'price_lowest_sell' - самой низкой позиции SELL.

Спасибо. Попробую прикрутить, посмотрю, что выйдет.

И дурацкий вопрос: Какая разница, между Ордером и Позиции? Везде говорят Ордер, и в MQL везде OrderSend, OrderClose и т.д.

 
makssub:

Спасибо. Попробую прикрутить, посмотрю, что выйдет.

И дурацкий вопрос: Какая разница, между Ордером и Позиции? Везде говорят Ордер, и в MQL везде OrderSend, OrderClose и т.д.

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

В результате сделки может быть открыта позиция или закрыта (или изменен ее объем на неттинге). Это все становится понятно, если посмотреть историю в МТ5 - сначала ордер на выполнение рыночный сделки, потом сделка, после этого появляется позиция.

А в МТ4 было принято все называть ордерами. Рыночные ордера там сразу открывались.

 
makssub:

Спасибо. Попробую прикрутить, посмотрю, что выйдет.

И дурацкий вопрос: Какая разница, между Ордером и Позиции? Везде говорят Ордер, и в MQL везде OrderSend, OrderClose и т.д.

Ордер это приказ, в 4ке упростили и сделали рыночный ордер это совершенный приказ на покупку / продажу. В 5ке приближено к понятиям биржи и ордер это приказ на покупку, продажу, модификацию и др. , а позиция это исполненный приказ на покупку / продажу, стоимость актива так сказать) В акциях это проще понимается, на валютном рынке сложнее)))

Причина обращения: