Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 571

 
greyfenrir:

Buen tiempo señores, decidí empezar a postear en este tema tonto, si alguien tiene algún consejo.

MT4 está perdiendo la red - el reloj del servidor no hace tictac, pero el "estado de la conexión" muestra que todo está bien. Internet está garantizado y no está ocupado de ninguna manera.

Esto sucede muchas veces al día, el cambio del corredor no afecta a la situación. El terminal se queda atascado en alguna posición y parece que puede quedarse en esta posición para siempre.

Se agradecerá cualquier consejo.

Quizá algún asesor o indicador esté defraudando a la MT con sus largos cálculos...
 
Notter:

Buenas tardes,

Recibo una advertencia durante la compilación

posible pérdida de datos debido a la conversión de tipos

en la línea:

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

La descripción de MarketInfo dice que devuelve el tipo double.

Pero el nivel de parada es un entero y quiero utilizarlo

como un número entero...

... ¿Es culpa de los desarrolladores, o la advertencia es correcta y yo no la entiendo?

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

Buenas tardes.

¿Puedes decirme qué broker tiene el mínimo retraso (ping) en MT4?

La pregunta está fuera de tema, los corredores no se discuten aquí. No es necesario hacer una pregunta dos veces en 2 foros.
 
paladin80:
La pregunta es off-topic, aquí no se habla de brokers. No es necesario hacer una pregunta dos veces en dos foros.

Lo siento)
 
paladin80:
La pregunta es off-topic, aquí no se habla de brokers. No es necesario hacer una pregunta dos veces en dos foros.
Al menos en diferentes foros... Y hay quienes preguntan lo mismo en 3-4 temas de un mismo foro...
 

queridos programadores, por favor ayuda!!!

El problema es que este script no hace su trabajo después de la última actualización de mt. Aún faltan barras.

¿Tal vez puedas modificarlo para una nueva plataforma? O tal vez hay otra solución similar y funcional. la búsqueda no devuelve ningún resultado.

gracias de antemano.

 //+------------------------------------------------------------------+
//|                                                   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:

Estimados programadores, ¡¡¡ayuda por favor!!!

el problema es que este script no funciona después de la última actualización de mt. las barras siguen sin aparecer.

¿se puede ajustar para la nueva plataforma? o tal vez haya una solución similar y factible.

gracias de antemano.


¿Dónde puedo descargar este script, no sé cómo meter todo este código en un script tan pequeño?
 
abdul1:

Estimados programadores, ¡¡¡ayuda por favor!!!

el problema es que este script no funciona después de la última actualización de mt. las barras siguen sin aparecer.

¿se puede ajustar para la nueva plataforma? o tal vez haya una solución similar y viable.

gracias de antemano.


Respuestas aquí
 

He encontrado el problema. ObjectGet da cero en lugar de tiempo y color. También está escrito en las advertencias, después de que yo lo establezca: posible pérdida de datos debido a la conversión de tipo. ¿Y qué hacer? ¿Cómo arreglarlo para que dé lo que necesito?

upd: ObjectGetInteger da todo bien. Llevo una semana devanándome los sesos...

 

Hola,

¿hay alguna forma de guardar los parámetros de carga de un indicador personalizado (que se inicializan a través de la entrada ... en la cabecera del código) y luego cargarlos, de forma similar a como se hace cuando se prueban los EAs?

Es decir, sin escribir sus propias utilidades.

Gracias