Any rookie question, so as not to clutter up the forum. Professionals, don't pass by. Nowhere without you - 6. - page 571

 
Notter:

Good afternoon,

I get a warning during compilation

possible loss of data due to type conversion

on the line:

int Stop_Loss = MarketInfo(Symbol(),MODE_STOPLEVEL);

The description of MarketInfo says that it returns type double.

But the stop level is an integer and I want to use it

as an integer...

..Is it the developers' fault, or is the warning correct and I don't understand it?

int Stop_Loss = (int)MarketInfo(Symbol(),MODE_STOPLEVEL); 
 
Fomi4:

Good afternoon.

Can you tell me which broker has the minimum delay (ping) on MT4?

The question is off-topic, brokers are not discussed here. You don't need to ask a question twice in 2 forums.
 
paladin80:
The question is off-topic, we don't discuss brokers here. You don't need to ask a question twice in two forums.

Sorry)
 
paladin80:
The question is off-topic, we don't discuss brokers here. You don't need to ask a question twice in two forums.
At least in different forums... And there are those who ask the same question in 3-4 topics of one forum...
 

dear programmers, please help!!!

The problem is that this script does not do its job after the last update of mt. bars are still missing.

maybe you can tweak it for a new platform? Or maybe there is another similar and working solution. search does not return any results.

thanks in advance.

 //+------------------------------------------------------------------+
//|                                                   dehole_hst.mq4 |
//|                                                   kukan&alextron |
//|                                              http://www.kukan.ru |
//+------------------------------------------------------------------+
//8 декабря 2005г 
//
//Скрипт выполнен для решения задач по выводу нескольких инструментов в одно окно, 
//и для синхронного совместного использования. Котировщики, (в частности Альпари) 
//используют следующий принцип поставки котировок, если нет изменения цены на каком-то баре, 
//то этот бар не поставляется. Особенно это касается мелких тайм фреймов 1 мин,  5мин…
//В ночное время , когда активность рынка низкая,  бывают выпадают несколько баров подряд.
//Для  одной валюты это не принципиально, но для вывода на экран одновременно нескольких 
//валют или индикаторов, связанных с валютами и анализа их, это становится актуально.
//С течением времени под   баром с определенным временем одной валюты,  стоит бар с другим 
//временем другой валюты, другими словами происходит рассинхронизация валют.
//Кроме того,   ряд индикаторов, запуск которых осуществляется от определенного времени  (бара), 
//не корректно работают, так как в это время для запуска может не оказаться бара.
//Так же с помощью его можно находить крупные дыры в исторических файлах.
//
//Скрипт делает новые файлы истории *.new, которые можно переименовать в *.hst, и перезапустив
//терминал, иметь синхронизированную по времени историю.
//Не забудь сохранить оригинальные файлы
//
//сразу моменты:
//!находим пару с самой маленькой историей и с этого момента пойдет склейка
//!соответственно размер истории будет определяться самой маленькой историей
//!важно, склеивание идет не по времени, а по существующим барам, т.е.
//полная синхронизация инструментов по времени
//журнал работы по паре смотреть в файле *.log в дирректории где хранятся
//файлы истории
//
//это скрипт, положить в дирректорию скриптов.
//запускать можно на любом графике, он графиками не пользуется
//обработает историю и уйдет.
//
#property copyright "kukan&alextron"
#property link        "http://www.kukan.ru"
#property show_inputs

#define   qty_smb   6      //количество инструментов

extern    int       m_period= 1 ;           //можно клеить не только минутные бары - любые
extern    string    symbol_0= "EURUSD" ;   //поставить в "входные параметры" "N" чтоб исключить пару из синхронизации
extern    string    symbol_1= "GBPUSD" ;
extern    string    symbol_2= "AUDUSD" ;
extern    string    symbol_3= "USDCHF" ;
extern    string    symbol_4= "USDJPY" ;
extern    string    symbol_5= "USDCAD" ;   //можно другие инструменты обрабатывать
extern    int       volume_null= 0 ;       //чем заполняем пустые бары

//массив названий инструментов
string    symbol_m[qty_smb];
//массивы указателей
int       i_handle[qty_smb];
int       o_handle[qty_smb];
int       log_handle[qty_smb];
//массив переменных - данные истории
int       h_time[qty_smb];
double    h_open[qty_smb],h_low[qty_smb],h_high[qty_smb],h_close[qty_smb];
double    h_volume[qty_smb];
double    old_close[qty_smb];     //старая цена инструмента
int       old_time[qty_smb];       //старенькая дата для журнальчика
bool      symbol_list[qty_smb];   //наличие инструмента
//массив статистических данных для работы с логом
int       lg_sk[qty_smb];   //пропущенных котировок всего
int       lg_sk_v[qty_smb]; //пропущенных котировок подряд
int       tm_cur= 0 ;         //время бара обрабатываемой истории в секундах
int       ia,ib;             //переменные просто
int       cnt_bars= 0 ;       //счетчик обработанных баров
bool      fl_stop= false ;     //флаг останова скрипта
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 
//открываем все файлы истории
for    ( int i= 0 ;i<qty_smb;i++)
   {
   //открытие файлов доноров
   i_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".hst" , FILE_BIN | FILE_READ );
   symbol_list[i]= true ;
   if (i_handle[i]< 0 ) 
      {
       Print (symbol_m[i], " Нехватает самой истории, исключаем из работы" );
      h_time[i]=- 1 ;   //будем пропускать данный инструмент
      symbol_list[i]= false ;
      }
       else
      {
      fl_stop= true ;
      }
   //открытие файлов назначений
   if (h_time[i]>= 0 && symbol_list[i])
      {
      o_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".new" , FILE_BIN | FILE_WRITE );
       if (o_handle[i]< 0 ) return (- 1 );
      log_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".log" , FILE_BIN | FILE_WRITE );
       if (o_handle[i]< 0 ) return (- 1 );
       //переписывание заголовка исторического файла
      copy_title_proc(i_handle[i],o_handle[i]);
      }
   }
//проверка если нет ниодной истории то выйти нахрен
if (!fl_stop)
   {
   Print ( " Нет таких историй" );
   return (- 1 );
   }
//все готово файлы открыты
//ищем самую короткую историю
tm_cur= 0 ;     //возмем какое нибудь старое время
for    (i= 0 ;i<qty_smb;i++)
   {
   if (h_time[i]< 0 )   continue ;   //пропускаем инструмент
   read_bars_hst(i);
   if (h_time[i]== 0 )
      {
       Print (symbol_m[i], " Нехватает самой истории, исключаем из работы" );
      h_time[i]=- 1 ;     //будем пропускать данный инструмент
      symbol_list[i]= false ;
      }
   if (tm_cur<h_time[i])
      {
      tm_cur=h_time[i];
      ia=i;             //запоминаем номер инструмента с самой короткой историей
      }
   old_time[i]=h_time[i];     //убирание пограничных эфектов
   old_close[i]=h_close[i];
   }
cnt_bars++;
Print ( "Самая короткая история у " ,symbol_m[ia], " с " , TimeToStr (h_time[ia], TIME_DATE | TIME_MINUTES ));
//
//теперь устанавливаем файловые указатели на данное время по всем инструментам
//вернее на время после этого на один бар
for    (i= 0 ;i<qty_smb;i++)
   {
   if (h_time[i]< 0 )   continue ;   //пропускаем инструмент
   while (tm_cur>h_time[i])
      {
       if (h_time[i]== 0 ) 
         { //если файл кончился присылается 0 и это гуд, 
         //не буду пока обрабатывать конец файла
         //если файл кончился тут, то нехватает данных на инструменте 
         //в той истории где вопщето мы должны клеить
         Print (symbol_m[i], " Нехватает данных в ранней истории, исключаем из работы " );
         h_time[i]=- 1 ;   //будем пропускать данный инструмент
         symbol_list[i]= false ;
         break ;
         }
      read_bars_hst(i);
      }
   write_text_logs(i, "Начало работы\t " + TimeToStr (tm_cur, TIME_DATE | TIME_MINUTES )+ "\n" );
   }
//..................................................
//все файлы синхронизированы основной цикл склейки
//если время меньше то пишем в выходной файл цену закрытия с нулевым обьемом
//и редактируем журнал
//теперь если файл кончился уже не будем пропускать инструмент
while (fl_stop)
   {
   //заполняем новый файл истории записями
   for    (i= 0 ;i<qty_smb;i++)
      {
       if (symbol_list[i])   //если работать не начали то и нехрен придумывать
         {
         if (tm_cur<h_time[i] || h_time[i]< 0 )
            { //нет такого бара на инструменте или вообще кончился файл инструмента
            write_bars_hst_null(i); //придумываем его
            lg_sk[i]++;             //считаем придуманные бары
            lg_sk_v[i]++;           //считаем придуманные бары подряд
            }
             else
            { //такой бар есть копируем
            write_bars_hst(i);
             if (lg_sk_v[i]!= 0 )
               {
               //Однако пропущенные бары есть делаем запись в журнал
               write_text_logs(i, "Нет баров-" +lg_sk_v[i]+ "\t " + TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES )+ "\n" );
               lg_sk_v[i]= 0 ;
               }            
            }
         }
      }
   //теперь находим следующий сушествующий на каком либо инструменте бар
   //бар должен быть самым старым
   //для этого считываем по одной записи с инструмента
   //у которого время меньше или равно только что обработанному
   //
   ib= CurTime ();   //просто взял молодое время :)
   for    (i= 0 ;i<qty_smb;i++)
      {
       if (h_time[i]< 0 )   continue ;   //пропускаем инструмент
       if (h_time[i]<=tm_cur) read_bars_hst(i);
       if (h_time[i]== 0 ) 
         {
         Print (symbol_m[i], " Кончился файл истории " , TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES ));
         write_text_logs(i, "Кончился файл истории \t " + TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES )+
         "\t синхронизировал " +cnt_bars+ " баров\n" );
         h_time[i]=- 1 ;   //будем пропускать данный инструмент
         }
         else
         { //бар есть
         //если он старее ib, то ib будет равен ему
         if (ib>h_time[i]) ib=h_time[i];
         }
      }
   cnt_bars++;
   //теперь присваиваем текущему времени самое старое из прочитанных
   tm_cur=ib;
   //
   //проверяем не пора ли закончить тосить историю
   //если не осталось ни одного файла донора
   fl_stop= false ;
   for    (i= 0 ;i<qty_smb;i++)
      {
       if (h_time[i]> 0 )  fl_stop= true ;   //кто то живой остался :))
      }
   }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
int init()
  {
   symbol_m[ 0 ]=symbol_0;
   symbol_m[ 1 ]=symbol_1;
   symbol_m[ 2 ]=symbol_2;
   symbol_m[ 3 ]=symbol_3;
   symbol_m[ 4 ]=symbol_4;
   symbol_m[ 5 ]=symbol_5;
   //
   ArrayInitialize (i_handle,- 1 );
   ArrayInitialize (o_handle,- 1 );
   ArrayInitialize (log_handle,- 1 );
   ArrayInitialize (h_time, 0 );
   ArrayInitialize (lg_sk, 0 );
   ArrayInitialize (lg_sk_v, 0 );
   return ( 0 );
  }
//+------------------------------------------------------------------+
void deinit()
  {
   //закрываем открытые файлы при выходе из скрипта
for    ( int i= 0 ;i<qty_smb;i++)
   {
   if (i_handle[i]>= 0 ) { FileClose (i_handle[i]); i_handle[i]=- 1 ; }       //файлы источники
   if (o_handle[i]>= 0 ) { FileClose (o_handle[i]); o_handle[i]=- 1 ; }       //файлы назначения
   if (log_handle[i]>= 0 ) { FileClose (log_handle[i]); log_handle[i]=- 1 ; } //файлы журналов
   }
   Print ( "Работать закончил, синхронизировал " +cnt_bars+ " баров " );
   //
  }
//+------------------------------------------------------------------+
//процедура копирования заголовка исторического файла
//похоже это зря в процедуру оформил, фиг с ним
bool   copy_title_proc( int wi_handle, int wo_handle)
   //на входе указатели файла донора и куда
   {
   int     i_unused[ 13 ];
   //
   FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE );   //версия
   //
   FileWriteString (wo_handle, FileReadString (wi_handle, 64 ), 64 );   //копирайт
   FileWriteString (wo_handle, FileReadString (wi_handle, 12 ), 12 );   //символ
   //
   FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE );   //период
   FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE );   //количество знаков после точки
   FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE );   //незнаю
   FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE );   //незнаю
   //
   FileReadArray(wi_handle,i_unused, 0 , 13 );
   FileWriteArray (wo_handle,i_unused, 0 , 13 );   //незнаю
   //
   FileFlush (wo_handle);
   //
   return ( true );
   }
//+------------------------------------------------------------------+
//чтение одной записи из файла истории в массив
void   read_bars_hst( int number)
   //number-номер инструмента
   {
   old_time[number]=h_time[number];       //запоминаем дату для журнальчика
   old_close[number]=h_close[number];     //запоминаем предыдущую цену
   h_time[number]= FileReadInteger (i_handle[number], LONG_VALUE );
   //
   h_open[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
   h_low[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
   h_high[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
   h_close[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
   h_volume[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
   //
   }
//+------------------------------------------------------------------+
//запись одного бара в файл истории
void    write_bars_hst( int number)
   {
   FileWriteInteger (o_handle[number],h_time[number], LONG_VALUE );
   //
   FileWriteDouble (o_handle[number],h_open[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],h_low[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],h_high[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],h_close[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],h_volume[number], DOUBLE_VALUE );
   //
   FileFlush (o_handle[number]);
   //
   }
//---------------------------------------------------
//запись одного пустого бара в файл истории
void    write_bars_hst_null( int number)
   {
   FileWriteInteger (o_handle[number],tm_cur, LONG_VALUE );
   //
   FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
   FileWriteDouble (o_handle[number],volume_null, DOUBLE_VALUE );
   //
   FileFlush (o_handle[number]);
   //
   }
//процедура записи в журнал
void   write_text_logs( int number, string text)
   {
   FileWriteString (log_handle[number],text, StringLen (text));
   FileFlush (log_handle[number]);
   }
//---------------------------------------------------
 
abdul1:

Dear programmers, help please!!!

the problem is that this script doesn't work after the last mt update. the bars are still missing.

can it be tweaked for the new platform? or maybe there's a similar and workable solution.

thanks in advance.


Where can I download this script, I just don't know how to get all this code into a script so small?
 
abdul1:

Dear programmers, help please!!!

the problem is that this script doesn't work after the last mt update. the bars are still missing.

can it be tweaked for the new platform? or maybe there's a similar and workable solution.

thanks in advance.


Answers here
 

I found the problem. ObjectGet gives out zero instead of time and colour. It is written in warnings too, after I set it: possible loss of data due to type conversion. So what to do? How to fix it to give out what I need?

upd: ObjectGetInteger gives out all right. Been racking my brain for a week...

 

Hello,

is there any way to save the loading parameters of a custom indicator (which are initialized via input ... in the code header) and then load them, similar to how this is done when testing EAs?

I mean without writing your own utilities.

Thanks

 

I have started to get an error in this function in the library after the build update . The compiler points to the last line :

//=========================================================================================================================================
// 1.4 Функция преобразует код последней ошибки в текстовую строку, содержащую описание данной ошибки. ====================================
string fErrorDescription (int fi_Error)
{
   string ls_Error = "";

   switch (fi_Error)
   {
      // Коды ошибок, возвращаемые торговым сервером:
      case 0: ls_Error = "Нет ошибки";
      case 1: ls_Error = "Нет ошибки, но результат не известен";
      case 2: ls_Error = "Общая ошибка";
      case 3: ls_Error = "Неправильные параметры";
      case 4: ls_Error = "Торговый сервер занят";
      case 5: ls_Error = "Старая версия клиентского терминала";
      case 6: ls_Error = "Нет связи с торговым сервером";
      case 7: ls_Error = "Недостаточно прав";
      case 8: ls_Error = "Слишком частые запросы";
      case 9: ls_Error = "Недопустимая операция, нарушающая функционирование сервера";
      case 64: ls_Error = "Счёт заблокирован";
      case 65: ls_Error = "Не правильный номер счёта";
      case 128: ls_Error = "Истёк срок ожидания совершения сделки";
      case 129: ls_Error = "Неправильная цена";
      case 130: ls_Error = "Неправильные стопы";
      case 131: ls_Error = "Неправильный объём";
      case 132: ls_Error = "Рынок закрыт";
      case 133: ls_Error = "Торговля запрещена";
      case 134: ls_Error = "Недостаточно денег для совершения операции";
      case 135: ls_Error = "Цена изменилась";
      case 136: ls_Error = "Нет цен";
      case 137: ls_Error = "Брокер занят";
      case 138: ls_Error = "Новые цены";
      case 139: ls_Error = "Ордер заблокирован и уже обрабатывается";
      case 140: ls_Error = "Разрешена только покупка";
      case 141: ls_Error = "Слишком много запросов";
      case 145: ls_Error = "Модификация запрещена, т.к. ордер слишком близок к рынку";
      case 146: ls_Error = "Подсистема торговли занята";
      case 147: ls_Error = "Использование даты истечения ордера запрещено брокером";
      case 148: ls_Error = "Количество открытых и отложенных ордеров достигло  предела, установленого брокером";
      case 149: ls_Error = "Попытка открыть позицию к уже существующей, в случае, если хеджирование запрещено";
      case 150: ls_Error = "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO";
      // Коды ошибок выполнения MQL4-программы:
      case 4000: ls_Error = "Нет ошибки";
      case 4001: ls_Error = "Неправильный указатель функции";
      case 4002: ls_Error = "Индекс массива - вне диапазона";
      case 4003: ls_Error = "Нет памяти для стека функций";
      case 4004: ls_Error = "Переполнение стека после рекурсивного вызова";
      case 4005: ls_Error = "На стеке нет памяти для передачи параметров";
      case 4006: ls_Error = "Нет памяти для строкового параметра";
      case 4007: ls_Error = "Нет памяти для временной строки";
      case 4008: ls_Error = "Неинициализированная строка";
      case 4009: ls_Error = "Неинициализированная строка в массиве";
      case 4010: ls_Error = "Нет памяти для строкового массива";
      case 4011: ls_Error = "Слишком длинная строка";
      case 4012: ls_Error = "Остаток от деления на ноль";
      case 4013: ls_Error = "Деление на ноль";
      case 4014: ls_Error = "Неизвестная команда";
      case 4015: ls_Error = "Неправильный переход";
      case 4016: ls_Error = "Неинициализированный массив";
      case 4017: ls_Error = "Вызовы DLL не разрешены";
      case 4018: ls_Error = "Не возможно загрузить библиотеку";
      case 4019: ls_Error = "Не возможно вызвать функцию";
      case 4020: ls_Error = "Вызовы внешних библиотечных функций не разрешены";
      case 4021: ls_Error = "Недостаточно памяти для строки, возвращаемой из функции";
      case 4022: ls_Error = "Система занята";
      case 4050: ls_Error = "Неправильное количество параметров функции";
      case 4051: ls_Error = "Недопустимое значение параметра функции";
      case 4052: ls_Error = "Внутренняя ошибка строковой функции";
      case 4053: ls_Error = "Ошибка массива";
      case 4054: ls_Error = "Неправильное использование массива-таймсерии";
      case 4055: ls_Error = "Ошибка пользовательского индикатора";
      case 4056: ls_Error = "Массивы не совместимы";
      case 4057: ls_Error = "Ошибка обработки глобальных переменных";
      case 4058: ls_Error = "Глобальная переменная не обнаружена";
      case 4059: ls_Error = "Функция не разрешена в тестовом режиме";
      case 4060: ls_Error = "Функция не разрешена";
      case 4061: ls_Error = "Ошибка отправки почты";
      case 4062: ls_Error = "Ожидается параметр типа string";
      case 4063: ls_Error = "Ожидается параметр типа integer";
      case 4064: ls_Error = "Ожидается параметр типа double";
      case 4065: ls_Error = "В качестве параметра ожидается массив";
      case 4066: ls_Error = "Запрошенные исторические данные в состоянии обновления";
      case 4067: ls_Error = "Ошибка при выполнении торговой операции";
      case 4099: ls_Error = "Конец файла";
      case 4100: ls_Error = "Ошибка при работе с файлом";
      case 4101: ls_Error = "Неправильное имя файла";
      case 4102: ls_Error = "Слишком много открытых файлов";
      case 4103: ls_Error = "Не возможно открыть файл";
      case 4104: ls_Error = "Не совместимый режим доступа";
      case 4105: ls_Error = "Ни один ордер не выбран";
      case 4106: ls_Error = "Не известный символ";
      case 4107: ls_Error = "Не правильный параметр цены для торговой функции";
      case 4108: ls_Error = "Не верный номер тикета";
      case 4109: ls_Error = "Торговля не разрешена. Необходимо включить опцию \"Разрешить советнику торговать\" в свойствах эксперта";
      case 4110: ls_Error = "Длинные позиции не разрешены. Необходимо проверить свойства эксперта";
      case 4111: ls_Error = "Короткие позиции не разрешены. Необходимо проверить свойства эксперта";
      case 4200: ls_Error = "Объект уже существует";
      case 4201: ls_Error = "Запрошено неизвестное свойство объекта";
      case 4202: ls_Error = "Объект не существует";
      case 4203: ls_Error = "Неизвестный тип объекта";
      case 4204: ls_Error = "Нет имени объекта";
      case 4205: ls_Error = "Ошибка координат объекта";
      case 4206: ls_Error = "Не найдено указанное подокно";
      case 4207: ls_Error = "Ошибка при работе с объектом";
   }
}

The error is as follows:

'}' - not all control paths return a value      LErrorsHandling.mq4     200     1
How can I fix it? I understand that for other cases the default output is needed. But I don't logically need it... How to fix it?