Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 936

[Удален]  
AlexeyVik:
А надо-ли такое извращение с индикаторами? Не проще всё засунуть в советник?

Со временем советник обростает дополнительными условиями для корректной работы и становится не гибким.

(Возможно извращение. Мы, Россияне, не ищем легких путей:) 

 
Добрый день!
Как можно в эксперте определить "Market is closed"?
 
abeiks:
Добрый день!
Как можно в эксперте определить "Market is closed"?

Зачем тебе это? Если рынок закрыт, то не будет тиков, соответственно эксперт не будет работать.

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

MarketInfo(Symbol(), MODE_TRADEALLOWED);

Если рынок открыт, то возвращает 1. Если рынок закрыт, то должен возвращать 0, только как он это сделает, если тики не идут :)

 

Такое дело - нужно определить минимальное и максимальное значение цены за последние, например 100 баров, ну и потом зафиксировать рост/падение при снижении/росте цены, чтобы обрисовать разворотный патерн типа 1 2 3. Не могу понять разницу между функциями ArrayMaximum и iHighest. Если я правильно понимаю, то результатом их вычислений будет только индекс максимального бара на указанном промежутке массива? А для расчётов требуется использование оператора for при работе с массивами, как в задаче 26 из учебника?  Я изменил этот код то такого вида

//--------------------------------------------------------------------
// extremumprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Quant_Bars=100;                       // Количество баров
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int i;                                       // Номер бара 
   double Minimum=Bid,                          // Минимальная цена
          Maximum=Bid;                          // Максимальная цена
         
   for(i=0;i<=Quant_Bars-1;i++)                 // От нуля (!) до..
                                               // ..Quant_Bars-1 (!)
      if (Low[i]< Minimum)                      // Если < известного
         Minimum=Low[i];                        // то оно и будет мин
      if (High[i]> Maximum)                     // Если > известного
         Maximum=High[i];                       // то оно и будет макс
    
   
   double
   Level_1,                                    // Сигнальный уровень 1
   Level_2,                                    // Сигнальный уровень 2
   Price;                                      // Текущая цена
   Level_1=Minimum;                             // Задаём минимальный уровень 
   Level_2=Maximum;                             // Задаём максимальный уровень 
   Price=Bid;                                  // Запрашиваем цену
   
   if (Price<Level_1) 
   {                                           // Проверка сложн услов  
      Alert("Образовался патерн на продажу"); 
      } 
        if (Price<Level_2) 
   {                                           // Проверка сложн услов  
      Alert("Образовался патерн на покупку");  // Сообщение 
  }
   return; 
   }                               
  //--------------------------------------------------------------------


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


 

 
silachara:

Зачем тебе это? Если рынок закрыт, то не будет тиков, соответственно эксперт не будет работать.

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

Если рынок открыт, то возвращает 1. Если рынок закрыт, то должен возвращать 0, только как он это сделает, если тики не идут :)

Спасибо!
Для получения информации. Надо подсчитать время между тиками.
Использую OnTimer().
[Удален]  
Deniskaaa:

Такое дело - нужно определить минимальное и максимальное значение цены за последние, например 100 баров, ну и потом зафиксировать рост/падение при снижении/росте цены, чтобы обрисовать разворотный патерн типа 1 2 3. Не могу понять разницу между функциями ArrayMaximum и iHighest. Если я правильно понимаю, то результатом их вычислений будет только индекс максимального бара на указанном промежутке массива? А для расчётов требуется использование оператора for при работе с массивами, как в задаче 26 из учебника?  Я изменил этот код то такого вида


 


Если хочешь торговать по этим сигналам, то не стоит. Если учишься программировать, пиши правильно.

 double

   Level_1,                                    // Сигнальный уровень 1
   Level_2,                                    // Сигнальный уровень 2
   Price;                                      // Текущая цена
сверху.
for(i=0;i<=Quant_Bars-1;i++) замени for(i=0; i<Quant_Bars; i++)
{
	if (Low[i]< Minimum)                      // Если < известного
         	Minimum=Low[i];                   // то оно и будет мин
      	if (High[i]> Maximum)                     // Если > известного
         	Maximum=High[i];                  // то оно и будет макс
}
добавлены фигурные скобки.
if (Price<Level_2) измени знак if (Price > Level_2) выше верхнего
 
kosmos0975:

Если хочешь торговать по этим сигналам, то не стоит. Если учишься программировать, пиши правильно.


Благодарю за ответ.
 

Начал изучать работу с файлами. Встретился с термином хэндл. Вопрос возник после написания кода: 

int filehandle;
filehandle=FileOpen("news.csv",FILE_READ);
Print("Файл открыт успешно. Хендл файла=", filehandle);
filehandle=FileOpen("news150901.csv",FILE_READ);
Print("Файл открыт успешно. Хендл файла=", filehandle);

Открыв первый файл news.csv программа присвоила переменной filehandle значение 1. Далее, программа открыла второй файл news150901.csv и присвоила переменной filehandle значение 2. Получается, что в программе теперь осталось значение хэндла только от открытия второго файла. Иными словами, я убил значение хэндла для первого открытого файла. Т.е. обращаться к данным/контенту и закрыть я смогу только второй файл? Является-ли использование одной переменной для хранения хэндла открытого файла ошибкой? Переменную для хэндла нужно создавать к каждому открываемому файлу свою?

 
silachara:

Начал изучать работу с файлами. Встретился с термином хэндл. Вопрос возник после написания кода: 

Открыв первый файл news.csv программа присвоила переменной filehandle значение 1. Далее, программа открыла второй файл news150901.csv и присвоила переменной filehandle значение 2. Получается, что в программе теперь осталось значение хэндла только от открытия второго файла. Иными словами, я убил значение хэндла для первого открытого файла. Т.е. обращаться к данным/контенту и закрыть я смогу только второй файл? Является-ли использование одной переменной для хранения хэндла открытого файла ошибкой? Переменную для хэндла нужно создавать к каждому открываемому файлу свою?

Открыв файл, Вы получили "код доступа" к нему - хэндл. Пока Вы его не закрыли, можете работать с этим файлом через его хэндл, не зависимо открыты другие файлы или нет.

P.S. Не забывайте закрывать файлы (в примере они не закрыты).

 

Нuжен скрипт для исследования в экселе.
Описание.
За 30 дней с 8.00 до 12.00 каждый день отпечатать в файл csv отпечатать цены открытия и закрытия свеч в этом промежутке времени.Период - на каком поставлен индикатор но не больше часа.Сам индикатор не должен ничего отоброжать и сохронят в буфферах.

Как закрутить правильно циклы ?

extern int   DayMax     =30;     //количество дней для печати
extern int   DayStart   =1;      //начинаем с первого бара
extern int   HourStart  =10;     //время старта внутри дня
extern int   HourEnd    =12;     //время конца внутри дня
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int per=Period();  
   if(per>60)return;  //если период больше часа , прекращаем работу скрипта
   double c_o=0,ABS_o_c=0;

  
      for(int d=DayStart;d<=DayMax;d++)//перебираем дни от DayStart до DayMax, т.е с вчерашнего до 30
      {
          for(int h=0;h<60/per*24;h++) //перебираем бары с нолевого до последнего в сутках учитывая ТФ
          {
            if(Time[h]>HourStart && Time[h]<HourEnd)//проверка промежутка времени
            {
               //данные для печати и печать
               c_o=(Close[h]-Open[h])*Point;
               ABS_o_c=MathAbs(c_o);
               
               f_PrintToFile(DayOfWeek(),TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),Open[h],Close[h],c_o,ABS_o_c);
               Print(DayOfWeek(),TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),Open[h],Close[h],c_o,ABS_o_c);
            }
          }
      }      
  }
//+------------------------------------------------------------------+
// 1.  В файл                           
//+------------------------------------------------------------------+
 void f_PrintToFile(int   f_DayOfWeek=0,
                          string f_TimeCurrent="", 
                          double f_Open=0,
                          double f_Close=0,
                          double f_c_o=0,
                          double f_ABS_o_c=0)
{
   string fileName=StringConcatenate(Symbol()," M",Period()," Tyrimas");
   string FileType=".csv";
   int handle;
   handle=FileOpen(fileName+FileType,FILE_WRITE|FILE_READ,";");
   if(handle!=INVALID_HANDLE)
   {
      FileSeek(handle,0,SEEK_END);
      FileWrite(handle,f_DayOfWeek,f_TimeCurrent,f_Open,f_Close,f_c_o,f_ABS_o_c);
      FileClose(handle);
   }
}

 Вот сомневаюсь в строке, так ка к наверное этот цикл непонимает начало дня , а работает просто с нуливого бара

for(int h=0;h<60/per*24;h++)

 Помогите разобраться.