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

Vladimir Karputov:

Прошу в третий и последний раз: прикрепите полный код.

Уже решил проблему. Модифицирую через Тicket, а не Symbol. Не понимаю, к чему полный код, какое, например, имеет отношение условие открытия позиции к модификации?

А выглядит сейчас это так, может кому пригодится.

void PositionModifiSell()
{
   int    i;
   ulong  ticket;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {               
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  ticket = m_position.Ticket();
                  
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                   
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  }
                  
                  if(!m_trade.PositionModify(ticket, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
Youri Lazurenko:


Изучите справку - в чем различие выбора позиции по тикету и по символу. Пригодиться, чтобы не делать ошибок:

PositionSelect

bool  PositionSelect(
   string  symbol     // имя инструмента
   );

Примечание

При "неттинговом" учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция, которая является результатом одной или более сделок. Не следует путать между собой позиции и действующие отложенные ордера, которые также отображаются на вкладке "Торговля" в панели "Инструменты".

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
PositionSelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Alexey Viktorov:

Читайте документацию!!!

По умолчанию эти свойства установлены в false.

И вопрос: Зачем удалять объект и создавать его заново? Разве не проще создать только в том случае если такой объект на графике не найден? И даже если надо поменять координаты привязки, нет необходимости удалять объект и снова его создавать.

Еще раз спасибо, теперь линия как линия, приятно посмотреть. Вот только  ObjectDelete(0, name); нужен, иначе раз нарисованная линия не перерисовывается. Тоже и в mql4, просто забыл.

Youri Lazurenko:

Еще раз спасибо, теперь линия как линия, приятно посмотреть. Вот только  ObjectDelete(0, name); нужен, иначе раз нарисованная линия не перерисовывается. Тоже и в mql4, просто забыл.

Ну что за несуразица. Нарисованный графический объект спокойно перемещается. Пример дан в справке для каждого объекта (для горизонтальной линии OBJ_HLINE).

Также уже нарисованному объекту можно менять любое свойство: цвет, стиль , запах ...
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
  • www.mql5.com
OBJ_HLINE - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Youri Lazurenko:

Еще раз спасибо, теперь линия как линия, приятно посмотреть. Вот только  ObjectDelete(0, name); нужен, иначе раз нарисованная линия не перерисовывается. Тоже и в mql4, просто забыл.

Я сделал-бы так

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
    if(!ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0))
     {
      Print("Ошибка в создании линии");
      return (false);
     }
  ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
  ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
  ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 0, price1);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 1, price2);

  ChartRedraw();
  return(true);
 }
Vladimir Karputov:

Ну что за несуразица. Нарисованный графический объект спокойно перемещается. Пример дан в справке для каждого объекта (для горизонтальной линии OBJ_HLINE).

Также уже нарисованному объекту можно менять любое свойство: цвет, стиль , запах ...

В ручную, не спорю. Советник же рисует трендовые линии по точкам ДеМарка. С функцией  ObjectDelete(0, name);, при изменении точек, убирается старая трендовая линия и рисуется новая. Без этой функции первые нарисованные линии больше не перерисовываются. Это не несуразица, а факт. 

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Youri Lazurenko:

В ручную, не спорю. Советник же рисует трендовые линии по точкам ДеМарка. С функцией  ObjectDelete(0, name);, при изменении точек, убирается старая трендовая линия и рисуется новая. Без этой функции первые нарисованные линии больше не перерисовываются. Это не несуразица, а факт. 

Да прочтите же справку наконец! И пример запустите.

Alexey Viktorov:

Я сделал-бы так

Спасибо, но оставлю свой вариант, он работает. Хотя попробую вместо  ObjectDelete(0, name); применить 

 ChartRedraw();
Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Vladimir Karputov:

Да прочтите же справку наконец! И пример запустите.

Справку я прочитал. Только вы возмущаетесь голословно, а я пишу исходя из практики. Другое дело что вместо ObjectDelet() использовать ChartRedraw(), не спорю и проверю. Только на это и нужно указать, ссылаясь на пример.

Youri Lazurenko:

Справку я прочитал. Только вы возмущаетесь голословно, а я пишу исходя из практики. Другое дело что вместо ObjectDelet() использовать ChartRedraw(), не спорю и проверю. Только на это и нужно указать, ссылаясь на пример.

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