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

 
Youri Lazurenko:


Если нет полного кода - я ни смогу помочь Вам. Пожалуйста прикрепите полный код (прикрепите при помощи кнопки   Прикрепить файл)

 
Если в функции void OnTick(), то это выглядит так:
   if(currentTime >= OpenTrade && currentTime < CloseTrade)
   {
      if(SignalBuy1() || SignalBuy2())
      { 
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderBuy();
            PositionModifiBuy();
            CandleColor(ColorCandleBuy);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }
      
      if(SignalSell1() || SignalSell2()) 
      {
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderSell();
            PositionModifiSell();
            CandleColor(ColorCandleSell);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }  
   }
Что значит полный код? Всего советника? Он довольно громоздкий, и остальные функции к модификации не имеют ни какого отношения. Я понимаю, что можно сразу, при открытии позиции установить СЛ и ТП, но я хочу так, мне уже интересно почему не работает. В mql4 это делается как два пальца..., а здесь геморой.
 

И возвращаясь к рисованию трендовой линии. Если нужен код. 

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
{
   ObjectDelete(0, name);  
      
   if(ObjectCreate(0, name, OBJ_TREND, 0, time1, price1, time2, price2))
   {
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr); 
      ObjectSetInteger(0, name, OBJPROP_STYLE, TrendStyle); 
      ObjectSetInteger(0, name, OBJPROP_WIDTH, TrendWidth); 
      
      ChartRedraw(); 
      Sleep(10);
      
      return(true);
   }
   else 
   {
      Print("Ошибка в создании линии"); 
      return (false);
   }
}
Файлы:
1.png  82 kb
2.png  36 kb
 
Youri Lazurenko:

И возвращаясь к рисованию трендовой линии. Если нужен код. 

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

OBJ_TREND

Примечание

Для трендовой линии можно указать режим продолжения ее отображения вправо и/или влево (свойства OBJPROP_RAY_RIGHT и OBJPROP_RAY_LEFT соответственно).

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

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

 
Youri Lazurenko:


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

 
Alexey Viktorov:

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

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

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

Спасибо, сейчас посмотрю. И спасибо за ценные замечания. Я не программист, так для себя, часто использую уже чьи то наработки.

 
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