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

 
Youri Lazurenko:

При пробое трендовой линии и закрытии бара выше/ниже онной, открывается позиция с нулевыми СЛ и ТП. Сразу же после открытия, устанавливается нужные ТП и СЛ (позиция модифицируется). Почему модифицируется не последняя позиция, а предыдущая, при этом нарушая условие:   

Теперь понятно? Даже если в условие ввести время открытие позиции, ни чего не меняется. Ограничения по количеству позиций нет.

У Вы уверены, что в момент модификации новая позиция уже есть? (отослать торговый приказ - это ещё не гарантия, что позиция есть).

Когда входите в условие (SL == 0.0 и TP == 0.0) распечатайте тикет позиции.

 
Vladimir Karputov:

У Вы уверены, что в момент модификации новая позиция уже есть? (отослать торговый приказ - это ещё не гарантия, что позиция есть).

Когда входите в условие (SL == 0.0 и TP == 0.0) распечатайте тикет позиции.

Да, вторая позиция уже есть. Я журнал читаю. Метод Sell произведен успешно, код 10009. (Тикет #3). А потом следует модификация, только позиции с тикетом #2, которая тоже выполнена успешно (модификация, хотя, подчеркиваю, по условиям происходить не должна, СЛ уже не равен 0!).  

Уже писал, пробовал и по времени открытия, и по тикету, ни фига, модифицирует предыдущую позицию. Например:

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 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)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  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(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 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)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != 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(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}


  

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

Да, вторая позиция уже есть. Я журнал читаю. Метод Sell произведен успешно, код 10009. (Тикет #3). А потом следует модификация, только позиции с тикетом #2, которая тоже выполнена успешно. 

Уже писал, пробовал и по времени открытия, и по тикету, ни фига, модифицирует предыдущую позицию. Например:


  

То есть: Вы не проверяете результат появление позиции и Вы не желаете даже распечатать тикет. В таком случае прикрепите полный код (прикрепите при помощи кнопки  Прикрепить файл)

 
Vladimir Karputov:

То есть: Вы не проверяете результат появление позиции и Вы не желаете даже распечатать тикет. В таком случае прикрепите полный код (прикрепите при помощи кнопки  )

Вы не желаете даже распечатать тикет - это не понял. Вот выписка журнала.

2021.02.01 12:54:55.338 2018.01.02 17:00:00   market sell 0.01 EURUSD (1.20384 / 1.20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00   deal #2 sell 0.01 EURUSD at 1.20384 done (based on order #2)

2021.02.01 12:54:55.338 2018.01.02 17:00:00   deal performed [#2 sell 0.01 EURUSD at 1.20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00   order performed sell 0.01 at 1.20384 [#2 sell 0.01 EURUSD at 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00   CTrade::OrderSend: market sell 0.01 EURUSD [done at 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00   Метод Sell() виконаний успішно. Код повернення = 10009 (done at 1.20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00   position modified [#2 sell 0.01 EURUSD 1.20384 sl: 1.20813 tp: 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00   CTrade::OrderSend: modify position #2 EURUSD (sl: 1.20813, tp: 1.20013) [done]

2021.02.01 12:54:55.346 2018.01.02 17:00:00   Метод PositionModify() виконаний успішно. Код повернення = 10009 (done)

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00   market sell 0.01 EURUSD (1.20442 / 1.20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00   deal #3 sell 0.01 EURUSD at 1.20442 done (based on order #3)

2021.02.01 12:55:48.819 2018.01.03 09:00:00   deal performed [#3 sell 0.01 EURUSD at 1.20442]                                                  

2021.02.01 12:55:48.819 2018.01.03 09:00:00   order performed sell 0.01 at 1.20442 [#3 sell 0.01 EURUSD at 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00   CTrade::OrderSend: market sell 0.01 EURUSD [done at 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00   Метод Sell() виконаний успішно. Код повернення = 10009 (done at 1.20442)

====================================================================================================================== после успешно открытой позиции, модификация, но предыдущего ордера

2021.02.01 12:55:48.821 2018.01.03 09:00:00   position modified [#2 sell 0.01 EURUSD 1.20384 sl: 1.20663 tp: 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00   CTrade::OrderSend: modify position #2 EURUSD (sl: 1.20663, tp: 1.20154) [done]

2021.02.01 12:55:48.823 2018.01.03 09:00:00   Метод PositionModify() виконаний успішно. Код повернення = 10009 (done)


Я выложил полный код модификации позиции на Sell, с вариантами.  

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
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.

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

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