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

 
Artyom Trishkin:

Изменить размер массива nnc_arr_in на 1 больше его размера в ячейке 0 массива структур:

Спасибо.

 

Вопрос  mql5

Есть две открытых позиции и есть сигнал (Flag==true

по которому должна закрыться только одна позиция, та у которой профит больше.

Как  закрыть только ту, у которой профит больше?

как лучше обработать это событие.

 Я пытаюсь это сделать так:

if (invertStart == true) // получил событие, о том что есть две позиции и одну можно закрыть.
   {     
   int npos_L1=0;   NPos_L1(npos_L1);
   if(npos_L1==1)
   {
   int positions=PositionsTotal();
   for(int i=0;i<=positions;i++)
   {
   ulong ticket=PositionGetTicket(i);
   if(ticket!=0 && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL && POSITION_PROFIT>=50) //  50  допустим...
   {
   m_trade.PositionClose(ticket); 
   i--;
   invertStart = false;
   return;  
   }
   }
   }
   }  

Закрывается в итоге последняя открытая позиция. 

Подскажите пожалуйста, как правильно это реализовать.  Хотелось бы с примером.  Справки и буквари я читаю, но не всегда понимаю тонкости. 

 
Vladpedro:

Вопрос  mql5

Есть две открытых позиции и есть сигнал (Flag==true

по которому должна закрыться только одна позиция, та у которой профит больше.

Как  закрыть только ту, у которой профит больше?

как лучше обработать это событие.

 Я пытаюсь это сделать так:

Закрывается в итоге последняя открытая позиция. 

Подскажите пожалуйста, как правильно это реализовать.  Хотелось бы с примером.  Справки и буквари я читаю, но не всегда понимаю тонкости. 

Код:

   ulong ticket=ULONG_MAX;
   double profit=DBL_MIN;
   if(invertStart == true)  // получил событие, о том что есть две позиции и одну можно закрыть.
     {
      int positions=PositionsTotal();
      for(int i=PositionsTotal()-1; i>=0; i--)
        {
         ulong tmp_ticket=PositionGetTicket(i);
         if(ticket!=0)
           {
            double tmp_profit=PositionGetDouble(POSITION_PROFIT);
            if(tmp_profit>profit)
              {
               ticket=tmp_ticket;
               profit=tmp_profit;
              }
           }
        }
      //---
      if(ticket!=ULONG_MAX)
         m_trade.PositionClose(ticket);
     }
 
Vladimir Karputov:

Код:

Спасибо большое, вроде работает.  Только на ticket жалуется, так как такая локальная переменная уже есть.

declaration of 'ticket' hides local variable Lim_Stop_03_Sell_pos_06.mq5 299 10

Какой то из этих тикетов видимо нужно спрятать во внутрь.

 
Vladpedro:

Спасибо большое, вроде работает.  Только на ticket жалуется, так как такая локальная переменная уже есть.

declaration of 'ticket' hides local variable Lim_Stop_03_Sell_pos_06.mq5 299 10

Какой то из этих тикетов видимо нужно спрятать во внутрь.

Переименуйте переменную

ulong ticket=ULONG_MAX;

в

ulong close_ticket=ULONG_MAX;

 и конечно в коде тоже переименовать не забудьте.

 
Vladimir Karputov:

Переименуйте переменную

в

 и конечно в коде тоже переименовать не забудьте.

Да спасибо, я уже разобрался...  переименовал.

 

Добрый День!

Подскажите пожалуйста где можно найти советник который отправляет на почту или push письмо если цена выше верхней линии, или ниже нижней линии (линия горизонтальная или наклонная и ее можно передвигать на графике)

Может у кого есть, поделитесь пожалуйста.

Только на МТ5

Спасибо!

 

если я подключаю индикатор в ЕА

int OnInit()
{
   ind_handle = iCustom(_Symbol, indperiod, "MyInd", indParam);
   return(INIT_SUCCEEDED);
}

и затем получаю буфера индикатора с помощью CopyBuffer(ind_handle, 0, 1, 3, buffer1)


обязательно читать каждый тик индикаторные буфера

Нужен ответ и желательно первоисточник - доки, статьи:

1. индикатор всегда сам параллельно рассчитывается

2. индикатор будет рассчитываться только в момент вызова  CopyBuffer()

 
Igor Makanu:

если я подключаю индикатор в ЕА

и затем получаю буфера индикатора с помощью CopyBuffer(ind_handle, 0, 1, 3, buffer1)


обязательно читать каждый тик индикаторные буфера

Нужен ответ и желательно первоисточник - доки, статьи:

1. индикатор всегда сам параллельно рассчитывается

2. индикатор будет рассчитываться только в момент вызова  CopyBuffer()

Игорь, ну чисто логически, если индикатор правильно написан, то меняться могут только значения текущего бара. Следовательно если нужны текущие значения, то CopyBuffer нужно непосредственно перед использованием этих свежих значений. А если нужны исторические значения, то они не изменяются и никакого резона перечитывать их нет.

О расчёте индикатора на каждом тике где-то есть информация. На сколько я помню, по умолчанию индикатор пересчитывается только при обращении к нему, но есть возможность заставить его пересчитываться на каждом тике. Как это сделать надо искать в документации.

 
Alexey Viktorov:
Игорь, ну чисто логически, если индикатор правильно написан, то меняться могут только значения текущего бара. Следовательно если нужны текущие значения, то CopyBuffer нужно непосредственно перед использованием этих свежих значений. А если нужны исторические значения, то они не изменяются и никакого резона перечитывать их нет.

О расчёте индикатора на каждом тике где-то есть информация. На сколько я помню, по умолчанию индикатор пересчитывается только при обращении к нему, но есть возможность заставить его пересчитываться на каждом тике. Как это сделать надо искать в документации.

ОК, значит все равно тестировать придется

проблема в перерисовке индикатора, переписывать индикатор пока не хочется

Причина обращения: