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

 
Vladimir Karputov:

Проблема в советнике. Кстати, правилами на виртуальном хостинге dll запрещены.

Раньше все чудесно работало. Надо было на бесплатном хостинге попробовать. В общем подарил метаквотам 15 баксов )))

Спасибо за ответ!

 

Советник открывает рыночные ордера, а потом модифицирует их, устанавливает ТП и СЛ. Проверка в тестере. Первый ордер модифицируется, нужными параметрами. Открывается второй ордер, в том же направлении, при действующем первом, но модифицируется первый ордер, по параметрам второго, а второй остается с нулевыми СЛ и ТП. При этом в условии стоит - если СЛ == 0 и ТП == 0, а модифицируется, почему то, тот у которого эти показатели уже не нулевые. Почему? Изменение перебора, от первого к последнему, ни чего не меняет.

И еще. В тестере, в графе прибыль, при открытых двух ордерах прибыль ордеров указана наоборот - у первого открытого ордера указана прибыль второго и наоборот. Почему?

И еще. Нужно нарисовать трендовую линию по двум экстремумам. Линия рисуется, но огрызок, от бара до бара. Это не трендовая линия, а просто отрезок, а хотелось бы видеть именно линию. 

void PositionModifiSell()
{
   int    i;
   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)
               {
                  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(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

Советник открывает рыночные ордера, а потом модифицирует их, устанавливает ТП и СЛ. Проверка в тестере. Первый ордер модифицируется, нужными параметрами. Открывается второй ордер, в том же направлении, при действующем первом, но модифицируется первый ордер, по параметрам второго, а второй остается с нулевыми СЛ и ТП. При этом в условии стоит - если СЛ == 0 и ТП == 0, а модифицируется, почему то, тот у которого эти показатели уже не нулевые. Почему? Изменение перебора, от первого к последнему, ни чего не меняет.

И еще. В тестере, в графе прибыль, при открытых двух ордерах прибыль ордеров указана наоборот - у первого открытого ордера указана прибыль второго и наоборот. Почему?

И еще. Нужно нарисовать трендовую линию по двум экстремумам. Линия рисуется, но огрызок, от бара до бара. Это не трендовая линия, а просто отрезок, а хотелось бы видеть именно линию. 

1. Не ОРДЕРА, а ПОЗИЦИИ

2. Сформулируйте свой вопрос - пока увидел повествование, а вопроса и алгоритма "как хочется, чтобы работало" я не увидел.

 
Vladimir Karputov:

1. Не ОРДЕРА, а ПОЗИЦИИ

2. Сформулируйте свой вопрос - пока увидел повествование, а вопроса и алгоритма "как хочется, чтобы работало" я не увидел.

И так понятно что позиции, раз это на языке mql5. И в коде стоит position. Вопрос - почему модифицируется первая позиция, а не последняя, хотя в условии указано: 

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

И так понятно что позиции, раз это на языке mql5. И в коде стоит position. Вопрос - почему модифицируется первая позиция, а не последняя, хотя в условии указано: 

Вопрос где??? Опишите алгоритм "я хочу чтобы алгоритм был такой ...".

 
Vladimir Karputov:

Вопрос где??? Опишите алгоритм "я хочу чтобы алгоритм был такой ...".

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

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

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

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