MetaTrader 4. Build 173 - страница 3

 
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                                        Copyright © 2005, Profi_R |
//|                                               rvm_fam@fromru.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link      "rvm_fam@fromru.com"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
  //Alert("Здравствуй Мир!!!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- 
  Alert("Здравствуй Мир!!!");
//----
   return(0);
  }
//+------------------------------------------------------------------+


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

 
Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init(),
присоединенная к графику программы, запускается также сразу после старта клиентского терминала и в 
случае смены финансового инструмента и/или периода графика

при смене периода графика инит не отрабатывает

//+------------------------------------------------------------------+
//|                                                   Day_AMA_PC.mq4 |
//|                                        Copyright © 2005, Profi_R |
//|                                               rvm_fam@fromru.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link      "rvm_fam@fromru.com"

//---- input parameters
extern int btf=1440;
extern int bfAMARange=10;
extern int bfAMAFast=2;
extern int bfAMASlow=20;
extern int bfAMAFilter=60;
extern int bfAMAFRange=6;
extern int bfAMAFPillow=30;
extern int bPCRange=6;
extern int bePillow=40;
extern int biPillow=10;
extern int SLLRange=30;
extern int SLLPersent=80;
extern int PCRange=6;
extern int fAMARange=10;
extern int fAMAFast=2;
extern int fAMASlow=20;
extern int fAMAFilter=60;
extern int fAMAFRange=6;
extern int fAMAFPillow=20;
extern int ePillow=30;
extern int iPillow=5;

datetime btflag,tflag;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   if(myInit()!=0)
   {
      return(0);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//-------------------- начальная инициализация эксперта------------------------------
   Alert(btf," ",Period());
/*   if(myInit()!=0)
   {
      return(0);
   }*/
//------------------- конец инициализации эксперта ---------------------------------
//----
   return(0);
  }
//+------------------------------------------------------------------+
//********************************************************************************
int myInit()
   {
   int blimit,limit;
   //проверка графика на котором работает эксперт (таймфрейм должен быть не больше
   //таймфрейма на котором определяем направление)
   if(Period()>=btf)
   {
      Alert("Запустите эксперта на графике с меньшим таймфреймом или увеличте значение таймфрейма",
             " на котором определяется направление !!!");
      return(-1);
   }
   //проверка на правильность выставленных параметров в fAMA
   if(bfAMAFast>=bfAMASlow||fAMAFast>=fAMASlow)
   {
      Alert("Проверьте параметры адаптивной средней !!!");
      return(-1);
   }
   //проверочный блок для графика с большим таймфреймом
   if(btflag!=iTime(NULL,btf,0))
   {
      blimit=MathMax(bfAMASlow,bPCRange);
      if(blimit>=iBars(NULL,btf))
      {
         Alert("Недостаточно данных на графике с большим таймфреймом !!!");
         return(-1);
      }
      btflag=iTime(NULL,btf,0);
   }
   //проверочный блок для графика с меньшим таймфреймом
   if(tflag!=Time[0])
   {
      limit=MathMax(fAMASlow,PCRange);
      if(blimit>=Bars)
      {
         Alert("Недостаточно данных на графике с меньшим таймфреймом !!!");
         return(-1);
      }
      tflag=Time[0];
   }

//----
   return(0);
   }
//*****************************************************************
 
при смене периода графика инит не отрабатывает

Все нормально отрабатывает - я сам только что проверил на приведенном коде.
Поставьте Print в начало функции init и посмотрите логи.
 
при смене периода графика инит не отрабатывает

Все нормально отрабатывает - я сам только что проверил на приведенном коде.
Поставьте Print в начало функции init и посмотрите логи.

поставил Print("**************************"), переключил несколько раз на дневки и обратно на получасовки
2005.06.14 17:44:31	PChannel GBPUSD,M30: initialized
2005.06.14 17:44:31	fAMA GBPUSD,M30: initialized
2005.06.14 17:44:29	PChannel GBPUSD,Daily: initialized
2005.06.14 17:44:29	fAMA GBPUSD,Daily: initialized
2005.06.14 17:40:03	PChannel GBPUSD,M30: initialized
2005.06.14 17:40:03	fAMA GBPUSD,M30: initialized
2005.06.14 17:39:49	PChannel GBPUSD,Daily: initialized
2005.06.14 17:39:49	fAMA GBPUSD,Daily: initialized
2005.06.14 17:39:41	Day_AMA_PC GBPUSD,M30: initialized
2005.06.14 17:39:41	Day_AMA_PC GBPUSD,M30: *************************************************
2005.06.14 17:39:41	Day_AMA_PC GBPUSD,M30: loaded successfully


в лог вывел один раз , а в этом логе вообще четко видна деинициализация эксперта и отсутсвие инициализации на другом таймфрейме

2005.06.14 18:08:27	test GBPUSD,Weekly: deinitialized
2005.06.14 18:08:23	test GBPUSD,Daily: deinitialized
2005.06.14 18:07:48	test GBPUSD,M30: deinitialized
2005.06.14 18:07:41	test GBPUSD,M30: initialized
2005.06.14 18:07:41	test GBPUSD,M30: Ура, заработало!!!
2005.06.14 18:07:40	test GBPUSD,M30: loaded successfully
2005.06.14 18:07:36	Compiling 'test'

Причем такая фигня только в эксперте в индикаторе работает

 
Изредка все-таки срабатывает
2005.06.14 18:21:01	test GBPUSD,Monthly: deinitialized
2005.06.14 18:20:59	test GBPUSD,Weekly: deinitialized
2005.06.14 18:20:56	test GBPUSD,Daily: deinitialized
2005.06.14 18:20:47	test GBPUSD,Daily: initialized
2005.06.14 18:20:47	test GBPUSD,Daily: Ура, заработало!!!
2005.06.14 18:20:47	test GBPUSD,H4: deinitialized
2005.06.14 18:20:45	test GBPUSD,Daily: deinitialized
2005.06.14 18:20:43	test GBPUSD,Weekly: deinitialized
2005.06.14 18:20:34	test GBPUSD,Monthly: deinitialized
2005.06.14 18:16:50	test GBPUSD,Daily: deinitialized
 
При переключении между счетами в МТ не всегда очищается/заменяется история операций.
Т.е. позиции показываются на новом счете, а история от старого счета.
При этом если закрываются позиции, то они дописываются в конец истории другого счета.
Помогает рефреш вручную.
 
1. Создаем эксперт (без внешних перемнных) , вставляем в раздел "expert initialization function" строку
Alert("Любой текст !!!");

. Цепляем эксперт к графику. Наблюдаем выдачу алерта. Кликаем по кнопкам меняющим т-ф графика. Результат - почти никогда алерт не срабатывает.
2. "Выдергиваем" вписанную строку из "expert initialization function" и вставляем в "expert start function". Цепляем эксперт к графику. Наблюдаем выдачу алерта с каждым новым тиком. Кликаем по кнопкам меняющим т-ф графика. Результат - после смены т-ф выдача алертов прекращается на какое-то время, по прошествии времени (закономерность определить не удалось) алерты вдруг возобновляются.
3. Из истории форума - коротко речь шла о том, что эксперт устанавливал (или удалял) торговые позиции в неторговое время и ему это удавалось (связано вроде было с ошибками работы сервера), но "expert start function" советника должен отрабатывать только "При поступлении новых котировок", получается сервер посылал котировки, чего я не наблюдал (тогда), или все-таки "expert start function" отрабатывает и в других (неописанных) случаях.

Вопрос: 1 и 2 только у меня? (пожалуйста ответьте).
Для справки: вышеописанные результаты были получены при следующих условиях - ОС=WinXP SP2, ресурсов системы предостаточно (параллельно запущены опера, TC, ICQ, касперский, оутпост, менеджер паролей, при этом ресурсы загружены не более чем на 10-15%), связь стабильная (выделенка), софт впрочем как и система работают стабильно. В оутпосте МТ прописан как доверенное приложение, да и работает он в режиме обучения (а запросов о разрешении/запрете каких- либо соединений не было).

из-за проблем на сайте приведу на всякий случай вставляемую строку еще раз:
Alert("Любой текст !!!");

 
имеем следующий код в индикаторе
int All[];
int tmp;
....
    tmp=NormalizeDouble(S_Ampl/Range,0);
    All[cb]=tmp;

а в результате - array to be set has incompatible type. Если заменить тип массива на double, то все отрисуется как положено. Попытка конвертировать double в string, а затем из string в intiger также результата не принесла.

 
имеем следующий код в индикаторе
int All[];
int tmp;
....
    tmp=NormalizeDouble(S_Ampl/Range,0);
    All[cb]=tmp;

а в результате - array to be set has incompatible type. Если заменить тип массива на double, то все отрисуется как положено. Попытка конвертировать double в string, а затем из string в intiger также результата не принесла.


Не совсем понял что Вы хотели получить. Если Вам надо вычислить некое значение и в ЦЕЛОЧИСЛЕННОМ виде запихнуть его в ЦЕЛОЧИСЛЕННЫЙ массив, то при чем здесь NormalizeDouble? Эта функция преобразования данных не выполняет, хотя бы даже и с точностью ноль знаков, результат все равно будет вещественным. Используйте либо целочисленное деление либо функцию округления до ЦЕЛОЧИСЛЕННОГО результата (в зависимости от того что хотите получить).
А может у Вас какой другой умысел был, но его из приведенного куска кода не видно.
 
имеем следующий код в индикаторе
int All[];
int tmp;
....
    tmp=NormalizeDouble(S_Ampl/Range,0);
    All[cb]=tmp;

а в результате - array to be set has incompatible type. Если заменить тип массива на double, то все отрисуется как положено. Попытка конвертировать double в string, а затем из string в intiger также результата не принесла.

Не совсем понял что Вы хотели получить. Если Вам надо вычислить некое значение и в ЦЕЛОЧИСЛЕННОМ виде запихнуть его в ЦЕЛОЧИСЛЕННЫЙ массив,
точно
то при чем здесь NormalizeDouble? Эта функция преобразования данных не выполняет, хотя бы даже и с точностью ноль знаков, результат все равно будет вещественным.
Зато она "округляет" до указанной точности вещественное, а затем при присваивании целочисленной переменной происходит отбрасывание дробной части.
Используйте либо целочисленное деление либо функцию округления до ЦЕЛОЧИСЛЕННОГО результата (в зависимости от того что хотите получить).
А здесь если можно подробней пожалуйста, что вы подразумеваете под "целочисленное деление" и наименование функции "округления до ЦЕЛОЧИСЛЕННОГО результата"
А может у Вас какой другой умысел был, но его из приведенного куска кода не видно.

Никаких тайных умыслов, может причина в "SetIndexBuffer(0,All);" А может я здесь "Операция деления !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" target=_blank>"Операция деления !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"</a> и здесь <a href=""Косяки с арифметикой?" чего не правильно понял?