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

 
lil_lil:
Спасибо.

Либо просто iHighest() - в последних билдах уже есть.

 
Ihor Herasko:

На счетах типа Netting позиция и сделка - разные понятия. Вы сейчас показали выбор позиции.

А как выбрать сделку, входящую в эту позицию 

long ID=PositionGetInteger(POSITION_IDENTIFIER);

 
Sile Si:

А как выбрать сделку, входящую в эту позицию 



bool  HistoryDealSelect(
   ulong  ticket     // тикет сделки
   );
Документация по MQL5: Торговые функции / HistoryDealSelect
Документация по MQL5: Торговые функции / HistoryDealSelect
  • www.mql5.com
Выбирает в истории сделку для дальнейших обращений к ней  через соответствующие функции. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Не следует путать между собой ордера, сделки и позиции. Каждая сделка...
 
Alexey Viktorov:


Спасибо, сделок несколько, поэтому решено использовать HistoryDealGetTicket().

Закомментировала всё, скажите, пожалуйста, где я что не так понимаю. Где ошибаюсь?

double Aver_Pr_nett()
  {
   double total_price_multiply_volume_sell   = 0.0;
   double total_volume_sell                  = 0.0;
   double net_price_sell_=0.0;
   string symb=_Symbol;
   int    total       =0;  // 
   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong pt=PositionGetTicket(i);//  тикет позиции
      long ID=PositionGetInteger(POSITION_IDENTIFIER);//id позиции
      if(PositionGetString(POSITION_SYMBOL)==symb && //символ позиции
      HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))//промежуток времени для поиска сделок
        {
         total=HistoryDealsTotal();//количество сделок
         
         for(int i=0; i<total; i++)// цикл по всем сделкам
           {
            ulong dt = HistoryDealGetTicket(i);//тикет сделки, возможно нужно использовать HistoryDealSelect()
            long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);//id сделки
            ENUM_DEAL_ENTRY in_out=HistoryDealGetInteger(dt,DEAL_ENTRY);//
            if(did==pt &&          //id сделки равно тикету позиции
            in_out==DEAL_ENTRY_IN) //сделка открыла позицию либо добавила объём
              {
               if(HistoryDealGetString(dt,DEAL_SYMBOL)==symb)//символ сделки равен текущему графику
                 {//дальше нахожу среднюю цену сделок
                  total_price_multiply_volume_sell+=HistoryDealGetDouble(dt,DEAL_PRICE)*HistoryDealGetDouble(dt,DEAL_VOLUME);
                  total_volume_sell+=HistoryDealGetDouble(dt,DEAL_VOLUME);
                  if(total_price_multiply_volume_sell!=0 && total_volume_sell!=0)
                    {
                    net_price_sell_=total_price_multiply_volume_sell/total_volume_sell;
                    };
                 }
              }
           }
        }
     }
//---
   return(net_price_sell_);
  }

 
Sile Si:

Спасибо, сделок несколько, поэтому решено использовать HistoryDealGetTicket().

Закомментировала всё, скажите, пожалуйста, где я что не так понимаю. Где ошибаюсь?


Я был очень неправ. В спешке дал неправильную ссылку. Думал об одном а выбрал совсем не то что надо.

Вот правильная ссылка.

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
Alexey Viktorov:

Я был очень неправ. В спешке дал неправильную ссылку. Думал об одном а выбрал совсем не то что надо.

Вот правильная ссылка.

Спасибо.

 
А как нарисовать линию на индикаторе, напр iAO,iDem, по 2 точкам? и получать значение линии в точке X ?
 
Сергей:
А как нарисовать линию на индикаторе, напр iAO,iDem, по 2 точкам? и получать значение линии в точке X ?

Каждый индикатор рисуется или в главном окне или в подокне. Значит шаг №1: узнать номер подокна, в котором нарисован индикатор. Смотрите в сторону Операции с графиками.

Шаг 2: когда есть номер подокна нарисовать линию просто. Смотрите справку OBJ_TREND, и параметры функции "TrendCreate"

//+------------------------------------------------------------------+ 
//| Создает линию тренда по заданным координатам                     | 
//+------------------------------------------------------------------+ 
bool TrendCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="TrendLine",  // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time1=0,           // время первой точки 
                 double                price1=0,          // цена первой точки 
                 datetime              time2=0,           // время второй точки 
                 double                price2=0,          // цена второй точки 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray_left=false,    // продолжение линии влево 
                 const bool            ray_right=false,   // продолжение линии вправо 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
 
Artyom Trishkin:

Либо просто iHighest() - в последних билдах уже есть.

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

 

Без сомнений, советник прикреплённый к si  модифицирует vtbr. Ставит T/P позиции по котировкам своего инструмента "si" 

   лло

Если прикрепить советник к vtbr, то si он не модифицирует, работает только на своём инструменте

ппв

Хоть какое нибудь объяснение этому есть?

Модификации в коде нет, кроме этой:

   if(TakeProfit>0)
     {
     if(!RefreshRates())
            return;
      int total=PositionsTotal();
      for(int i=total-1;i>=0;i--)
        {
         if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
           {
            if(m_position.Symbol()==Symbol())
              {
               //if(m_position.PositionType()==POSITION_TYPE_BUY)
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                 {
                  if(m_symbol.NormalizePrice(Aver_Pr_sell_nett()+ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     m_trade.PositionModify(m_position.Ticket(),
                                            m_position.StopLoss(),
                                            m_symbol.NormalizePrice(Aver_Pr_sell_nett()+ExtTakeProfit)
                                            );
                     Sleep(300);

                    }
                 }
               //==//
               //if(m_position.PositionType()==POSITION_TYPE_SELL)
               else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(Aver_Pr_sell_nett()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(Aver_Pr_sell_nett()-ExtTakeProfit)
                                               );
                        Sleep(300);
                       }
                    }
                 }
              }
           }
        }
     }