[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 309

 
Zhunko спасибо большое.Все возвращается бумерангом и добро тоже.
 
artmedia70:
Именно. Глобальная переменная Reason получает значение, но получает она его не в deinit(), а в init(), чтобы можно было видеть при запуске init() причину последней деинициализации и, исходя из значения, выполнять то или иное действие. Но не работает как положено.

Вам сказали, как сделать. Именно в deinit() мы узнаем причину последней деинициализации  и передаем ее через переменную, объявленную на глобальном уровне. В init() проверяете значение переменной и узнаете причину последней деинициализации. Это работает!.

PS Видимо, не все осознают, что init()/deinit() не изменяют значения переменных, объявленных на глобальном уровне, если это явно не указано в операторах внутри функций. 

Вообще-то в init() лучше, ордера не закрывать.  Там MarketInfo() часто работает не так, как ожидалось. 

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
Вам сказали, как сделать. Именно в deinit() мы узнаем причину последней деинициализации  и передаем ее через переменную, объявленную на глобальном уровне. В init() проверяете значение переменной и узнаете причину последней деинициализации. Это работает!.
Понял, что у Артёма проблема именно с переключением с ТФ М5. Там ошибка. Надо бы проверить так ли это. Может это баг МТ4.
 
Zhunko:
Это предположил, что Вы будете делать с этой функцией. Такой функцией обычно бегают по истории.

Даже не представляю, что б функцию гоняли по циклу...
 
hoz:

Даже не представляю, что б функцию гоняли по циклу...

  Да пожалуйста :
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
Понял, что у Артёма проблема именно с переключением с ТФ М5. Там ошибка. Надо бы проверить так ли это. Может это баг МТ4.

Нет это не баг. Вот советник. Менял таймфреймы с M1до H1

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15: initialized
19:20:09 111 CADJPY,M15: DeinitReason 3
19:20:09 111 CADJPY,M15: deinitialized
19:20:09 111 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,M15: deinitialized
19:20:09 Supertrend[1] CADJPY,M15: uninit reason 3
19:20:09 HLC CADJPY,M15: deinitialized
19:20:09 HLC CADJPY,M15: uninit reason 3
19:20:09 AMA optimized1 CADJPY,M15: deinitialized
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3
19:20:09 AMA optimized1 CADJPY,M15: deinitialized
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,H1: initialized
19:20:09 HLC CADJPY,H1: initialized
19:20:09 AMA optimized1 CADJPY,H1: initialized
19:20:09 AMA optimized1 CADJPY,H1: initialized
19:20:09 111 CADJPY,H1: initialized
 
Mislaid:

Нет это не баг. Вот советник. Менял таймфреймы с M1до H1 

Ну и хорошо! А то у меня тоже сильно всё завязано на причины деинициализации.

Mislaid:

Вообще-то в init() лучше, ордера не закрывать.  Там MarketInfo() часто работает не так, как ожидалось. 

Да. Нельзя. В справке написано.  

hoz:

Даже не представляю, что б функцию гоняли по циклу...
Обычное дело.  
 
Zhunko:

Ну и хорошо! А то у меня тоже сильно всё завязано на причины деинициализации.

Да. Нельзя. В справке написано.   Обычное дело.  

Вот окончательный вариант для проверки. Предыдущий был не очень удачным, поскольку init()/deinit()  иногда не дружат с print()

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Задался я вопросом написать функцию. Суть такая, что необходимо что, при откате N-свечей в в определённую строну, просчитывать количество свечей. НО. Для это есть несколько условий, а точнее будет со временем их перечень.

Скажем так, тренд, например, направлен вниз,... пошёл откат вверх. Я хочу чтоб если прошло 5 свечей вверх, и каждая свеча была бычья, и, например, размер каждой свечи был больше заданного i_sizeOfCurrBar, и ещё какие-н. условия, то выводим количество баров непрерывно бычьих, и возвращаем какой-то результат из функции.

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

Вот что у меня, есть:

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

 

 На данный момент идёт просто перебор от предпоследнего бара, то бара с индексом 6, т.е. 5 баров в подряд. Но мне нужно, чтоб эксперт просчитывал только бары, которые вляются бычьими, а не все в подряд. Как это будет адекватнее реализовать?

 По размеру я вроде как отфильтровал верно.

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

 
Mislaid:

Вам сказали, как сделать. Именно в deinit() мы узнаем причину последней деинициализации  и передаем ее через переменную, объявленную на глобальном уровне. В init() проверяете значение переменной и узнаете причину последней деинициализации. Это работает!.

PS Видимо, не все осознают, что init()/deinit() не изменяют значения переменных, объявленных на глобальном уровне, если это явно не указано в операторах внутри функций. 

Вообще-то в init() лучше, ордера не закрывать.  Там MarketInfo() часто работает не так, как ожидалось. 

А где вы видите, что я в init() позиции закрываю? Я задал один вопрос о запросе об удалении, а вот где я их удаляю - я об этом не говорил и тем более не спрашивал. Как думаете - почему?