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

 
подскажите пожалуйста как определить сколько элементов находится в перечислении (enum)?
 
CJIeCaPb:

Предварительно выбрав ордер OrderSelect (Тикет_первого_ордера, SELECT_BY_TICKET);

     if(OrderOpenPrice()+10*Point==Ask)

 OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

А как определить Тикет_первого_ордера?
[Eliminado]  

ПО-МОЕМУ РАБОЧАЯ ВЕТКА...упсс сори

 

 Доброй всем ночи!!! С новым годом! 

 

Решил сохранить данные буферов через файл. Создать файл и записать в него проблем особых нет, а вот прочитать из него сложности.

Вот пробная программка. Помогите пож. Проблема в том, что либо идет лишняя запись в файл, либо она не читается из файла. Хочу просто читать по списку из файла в , например, массивы... ЕСли лень писать прошу ссылку на похожий материал, а нашел только учебник... НО ЛУЧШЕ ГОТОВЫЙ ВАРИАНТ НА САЙТЕ))):

 ЗАРАНЕЕ СПАСИБО В ЛЮБОМ СЛУЧАЕ!!!))):

//+------------------------------------------------------------------+
//|                                                   Proba file.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql4.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
extern int ind=0;   //--- выберем случайно номер строки
extern string СдвигДаты  = "30.12.2014  00:00";
extern bool   ВыключательСдвигаДаты = false; 
extern bool   ЗаписьФайла = true;
//--- глобальные переменные
int    Tm,hr,shift,shiftbar,size,InpFileName;
double H_buff[];
double L_buff[];
double C_buff[];
ulong  pos[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string  T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {  
//--- привязка массива к индикаторному буферу с номером индекса
   SetIndexBuffer(0,H_buff);
   SetIndexBuffer(1,L_buff);
   SetIndexBuffer(2,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
   SetIndexEmptyValue(0,EMPTY);
   SetIndexEmptyValue(1,EMPTY);
   SetIndexEmptyValue(2,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexStyle(1,DRAW_LINE,0,1);
   SetIndexStyle(2,DRAW_LINE,1,1);
//---- устанавить формат точности (количество знаков после десятичной точки
   IndicatorDigits(Digits);
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии 
   SetIndexDrawBegin(0,2);
//---
    return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//----  Функия расчета ключевых точек 
if (ВыключательСдвигаДаты==true) 
    shiftbar  = iBarShift(Symbol(),PERIOD_D1, StrToTime(СдвигДаты), false); 
      else 
    shiftbar = 1; 
     hr=iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,shiftbar));   // бервый бар дня для прорисовки уровней
     if(hr>=8)   shift= hr-4;
    HIGH= iHigh(Symbol(),PERIOD_H1,shift);
    LOW=  iLow(Symbol(),PERIOD_H1,shift);
    CLOSE= iClose(Symbol(),PERIOD_H1,shift);
//----  Функция проверки баров утренней сессии
    
   int limit=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar));   // бервый бар дня для прорисовки уровней
   int end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar-1));

     if(Period()==PERIOD_H1 && hr>=8 && (TimeDayOfWeek(Time[0])<6 && TimeDayOfWeek(Time[0])>0))
      {
   for(int i=limit; i>=end; i--)
     {
     if (High[i+1]>LastHigh) LastHigh=High[i+1];
        if (Low[i+1]<LastLow) LastLow=Low[i+1];
         pr = TimeDay(Time[i]); 
      pr_1 = TimeDay(Time[i+1]);
     if (pr!=pr_1)
        {
         H_buff[i+1] = EMPTY;
         L_buff[i+1] = EMPTY;
         C_buff[i+1] = EMPTY;
        }
//----  Функция прорисовки уровней ZigZag на графике
         H_buff[i]=HIGH;
         L_buff[i]=LOW;
         C_buff[i]=CLOSE;
        }
       }
////////////////////////////////////////////////      ЭТО  БЫЛО   ВСТУПЛЕНИЕ   ДЛЯ   РАБОЧЕГО   ПОНИМАНИЯ    \\\\\\\\\\\\\\\\\\ 
   
//-----  Функция открытия и чтения значений из файла  
      ResetLastError();
//--- откроем файл
      if(ЗаписьФайла==true)
      InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_TXT);
   if(InpFileName!=INVALID_HANDLE)
     {
      GetStringPositions(InpFileName,pos);                    //--- получим позицию начала для каждой строки в файле
      size=ArraySize(pos);                                    //--- определим сколько всего строк в файле   
      if(!size)                                               //--- если в файле нет строк, то завершаем работу
     FileClose(InpFileName);

      if(FileSeek(InpFileName,pos[ind],SEEK_SET)==true)       //--- сдвинем позицию на начало этой строки
        {
      Print("Текст строки с номером    ",ind,"   ",FileReadString(InpFileName),"  size  ",size);  //--- прочитаем и распечатаем строку с номером ind
      file_buffer=FileReadString(InpFileName);    // чтение строки из файла
      T1=StringSubstr(file_buffer,0,2+Digits);    // Извлекаем первые 7 символов
      T2=StringSubstr(file_buffer,7,2+Digits);    // Извлекаем вторые 7 символов
      T3=StringSubstr(file_buffer,14,2+Digits);   // Извлекаем третьи 7 символов
      T4=StringSubstr(file_buffer,21);            // Извлекаем остаток символов
        }
      FileClose(InpFileName);
     }
   
      if(ЗаписьФайла==true) {
       Comment("ЗАПИСЬ  В ФАЙЛ: IND ",ind,"  SIZE  ",size,"  T1:  ",StrToDouble(T1)," ||| T2:  ",StrToDouble(T2)," ||| T3:   ",StrToDouble(T3),"  |||  shift  ",StrToInteger(T4));   
        
        if(StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)
        WRITEfile(); } else Comment("ЗАПИСЬ  ВЫКЛЮЧЕНА !");

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
  
   int i,def_size=127;           //--- размер массива по умолчанию
   ArrayResize(arr,def_size);    //--- выделим память для массива
   if(!FileIsEnding(handle))     //--- если не конец файла, то есть хотя бы одна строка
     {
      arr[i]=FileTell(handle);
      i++;                       //--- счетчик строк
     }
   else
      return;                       // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   
   if(FileGetInteger(handle,FILE_IS_TEXT))
   while(!FileIsEnding(handle))  //--- в цикле перебираем строки до конца файла
     {
      FileReadString(handle);    //--- читаем строку
      if(!FileIsEnding(handle))  //--- проверка на конец файла
        {
         arr[i]=FileTell(handle)+1;   //--- запомним позицию следующей строки
         i++;
         if(i==def_size)         //--- увеличим размер массива, если он переполнен
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break;               // конец файла, выходим
     }
   ArrayResize(arr,i);     //--- установим истинный размер массива
  } 
//+------------------------------------------------------------------+
void WRITEfile()   // запись в файл и его создание если его нет
  { 
//--- сбросим код ошибки
   ResetLastError();
//--- правильный способ работы в "файловой песочнице"
   InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_WRITE|FILE_TXT);   // Имя файла
   if(InpFileName!=INVALID_HANDLE)
     {
   FileSeek(InpFileName,0,SEEK_END);
   FileWrite(InpFileName,DoubleToStr(HIGH,Digits),DoubleToStr(LOW,Digits),DoubleToStr(CLOSE,Digits),IntegerToString(shift,0));
    FileFlush(InpFileName);  
     }
   FileClose(InpFileName);           
  return;
  }
//+------------------------------------------------------------------+
[Eliminado]  

Увы, с ЗАПИСЬЮ в файле не все так просто!!!(((

А казалось ...наоборот.

С чтением благодаря учебным примерам разобрался,а вот ЗАПИСЬ в файл требует более сложного кода. Короче придурел уже... А как двигать запись согласуя с Чтением из файла не соображу.

Исправил установку уровней для баров дня и для истории (исходные буферные данные).

 

ВОПРОС ТОТ ЖЕ. ПРОШУ НАМЕКНУТЬ, ЕСЛИ МНОГО ПИСАНИНЫ, НА ТО КАК ЛУЧШЕ ЗАПИСЫВАТЬ ДАННЫЕ БУФЕРОВ В ФАЙЛ.

СИПРАВЛЕННЫЙ КОД ПРОГИ

//+------------------------------------------------------------------+
//|                                                   Proba file.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
extern int ind=0;   //--- выберем случайно номер строки
extern string СдвигДаты  = "06.01.2015  00:00";
extern bool   ВыключательСдвигаДаты = false; 
extern bool   ЗаписьФайла = true;
//--- глобальные переменные
int    Tm,hr,shift,shiftbar,size,sizew,InpFileName,limit,end;
double H_buff[];
double L_buff[];
double C_buff[];
ulong  pos[],arrw[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string  T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {  
//--- привязка массива к индикаторному буферу с номером индекса
   SetIndexBuffer(0,H_buff);
   SetIndexBuffer(1,L_buff);
   SetIndexBuffer(2,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
   SetIndexEmptyValue(0,EMPTY);
   SetIndexEmptyValue(1,EMPTY);
   SetIndexEmptyValue(2,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexStyle(1,DRAW_LINE,0,1);
   SetIndexStyle(2,DRAW_LINE,1,1);
//---- устанавить формат точности (количество знаков после десятичной точки
   IndicatorDigits(Digits);
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии 
   SetIndexDrawBegin(0,2);
//---
    return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//----  Функия расчета ключевых точек 
if (ВыключательСдвигаДаты==true) 
    shiftbar  = iBarShift(Symbol(),PERIOD_D1, StrToTime(СдвигДаты), false); 
      else 
    shiftbar = 0; 
     hr=iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,shiftbar));   // бервый бар дня для прорисовки уровней
     if(hr>=9)   shift= hr-8;
    HIGH= iHigh(Symbol(),PERIOD_H1,shift);
    LOW=  iLow(Symbol(),PERIOD_H1,shift);
    CLOSE= iClose(Symbol(),PERIOD_H1,shift);
//----  Функция проверки баров утренней сессии
    
    if(ВыключательСдвигаДаты==true) 
     {
       limit=shift;
       end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar))-23;
       }
        else 
       {
       limit=shift;
       end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar))-hr;
        }
     if(Period()==PERIOD_H1 && hr>=8 && (TimeDayOfWeek(Time[0])<6 && TimeDayOfWeek(Time[0])>0))
      {
   for(int u=limit; u>=end; u--)
     {
     if (High[u+1]>LastHigh) LastHigh=High[u+1];
        if (Low[u+1]<LastLow) LastLow=Low[u+1];
         pr = TimeDay(Time[u]); 
      pr_1 = TimeDay(Time[u+1]);
     if (pr!=pr_1)
        {
         H_buff[u+1] = EMPTY;
         L_buff[u+1] = EMPTY;
         C_buff[u+1] = EMPTY;
        }
//----  Функция прорисовки уровней  на графике
         H_buff[u]=HIGH;
         L_buff[u]=LOW;
         C_buff[u]=CLOSE;
        }
       }
/////////////////////////////////////////////////////////////////////////  
   
//-----  Функция открытия и чтения значений из файла  
      ResetLastError();
//--- откроем файл
      if(ЗаписьФайла==true)
      InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_TXT);
   if(InpFileName!=INVALID_HANDLE)
     {
      GetStringPositions(InpFileName,pos);                    //--- получим позицию начала для каждой строки в файле
      size=ArraySize(pos);                                    //--- определим сколько всего строк в файле   
      if(!size)                                               //--- если в файле нет строк, то завершаем работу
     FileClose(InpFileName);

      if(FileSeek(InpFileName,pos[ind],SEEK_SET)==true)       //--- сдвинем позицию на начало этой строки
        {
      Print("Текст строки с номером ",ind,"  ",FileReadString(InpFileName)," size  ",size);  //--- прочитаем и распечатаем строку с номером ind
      file_buffer=FileReadString(InpFileName);    // чтение строки из файла
      T1=StringSubstr(file_buffer,0,2+Digits);    // Извлекаем первые 7 символов
      T2=StringSubstr(file_buffer,7,2+Digits);    // Извлекаем вторые 7 символов
      T3=StringSubstr(file_buffer,14,2+Digits);   // Извлекаем третьи 7 символов
      T4=StringSubstr(file_buffer,21);            // Извлекаем остаток символов
        }
      FileClose(InpFileName);
     }
         if(ЗаписьФайла==true) {
        Comment("ЗАПИСЬ  В ФАЙЛ: IND ",ind,"  SIZE  ",size,"  T1:  ",StrToDouble(T1)," ||| T2:  ",StrToDouble(T2)," ||| T3:   ",StrToDouble(T3),"  |||  shift  ",StrToInteger(T4));   
          
   if(StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)  
      WRITEfile(); } else 
     Comment("ЗАПИСЬ  ВЫКЛЮЧЕНА !");

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {  
   int j,def_size=127;           //--- размер массива по умолчанию
   ArrayResize(arr,def_size);    //--- выделим память для массива
   if(!FileIsEnding(handle))     //--- если не конец файла, то есть хотя бы одна строка
     {
      arr[j]=FileTell(handle);
      j+=1;                       //--- счетчик строк
     }
   else
      return;                       // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   
   //if(FileGetInteger(handle,FILE_IS_TEXT))
   while(!FileIsEnding(handle))  //--- в цикле перебираем строки до конца файла
     {
      FileReadString(handle);    //--- читаем строку
      if(!FileIsEnding(handle))  //--- проверка на конец файла
        {
         arr[j]=FileTell(handle)+1;   //--- запомним позицию следующей строки
         j+=1;
         if(j==def_size)         //--- увеличим размер массива, если он переполнен
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break;               // конец файла, выходим
     }
   ArrayResize(arr,j);     //--- установим истинный размер массива
  } 
//+------------------------------------------------------------------+
void WRITEfile()   // запись в файл и его создание если его нет
  { 
  InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_WRITE|FILE_TXT);
   if(InpFileName!=INVALID_HANDLE)
     {   
     FileWrite(InpFileName,"Начало файловой записи.Проба");
  while(!FileIsEnding(InpFileName))  //--- в цикле перебираем строки до конца файла
     FileReadString(InpFileName);    //--- читаем строку
     FileSeek(InpFileName,0,SEEK_END);   // конец файла, пишем
   FileWrite(InpFileName,DoubleToStr(HIGH,Digits),DoubleToStr(LOW,Digits),DoubleToStr(CLOSE,Digits),IntegerToString(shift,0));
    FileFlush(InpFileName);      
        } 
    FileClose(InpFileName); 
   }   
//+------------------------------------------------------------------+
[Eliminado]  

САМ НАШЕЛ ГДЕ ИСКАТЬ ОТВЕТЫ НА МОИ ВОПРОСЫ...О ФАЙЛОВЫХ ОПЕРАЦИЯХ))): 

СКРИПТЫ ПО ВЫВОДУ ИНФОРМАЦИИ ИЗ ФАЙЛА НА ГРАФИК. 

ИСТОРИИ БЕСПЛАТНЫХ КОДОВ МТ4 ЕСТЬ ВАРИАНТЫ ПЕРЕНОСА ДАННЫХ В ФАЙЛ, ТАК И ОБРАТНАЯ ОПЕРАЦИЯ.

ВСЕМ СПАСИБО, ВСЕМ ЧАО)))): 

 

Есть большой файл в котором даты в таком виде "20141231". Чтобы преобразовать строку в формат datetime нужны точки "YYYY.MM.DD"  между годом, месяцем и числом.

Как можно это сделать? 

[Eliminado]  
Всем привет, хочу что бы советник находил самый высокий хай или низкий лоу за 100 баров, подскажите где, что прочитать?
 
zhezheria:
Всем привет, хочу что бы советник находил самый высокий хай или низкий лоу за 100 баров, подскажите где, что прочитать?

Читать можно справку, там всё есть, с примерами.

High[iHighest(NULL,0,MODE_HIGH,100,0]

Low[iLowest(NULL,0,MODE_LOW,100,0]
[Eliminado]  
evillive:

Читать можно справку, там всё есть, с примерами.


Спасибо
 

Возникла идея нарисовать из данных файла индикатор.

Взял пример из учебника. Переделал скрипт под себя:

int start()                            // Спец. функция start
  {
//--------------------------------------------------------------- 2 --
   int Handle,                         // Файловый описатель
       shift,Text;                            // Стиль вертикальной линии
   string File_Name="News.csv",        // Имя файла
          Obj_Name,                    // Bмя объекта
          Instr,                       // Название валюты
          One,Two,                     // 1я и 2я чать названия инстр.
          Str_DtTm;                    // Дата и время события(строка)
   datetime Dat_DtTm;                  // Дата и время события(дата)
//--------------------------------------------------------------- 3 --
   Handle=FileOpen(File_Name,FILE_CSV|FILE_READ,";");// Открытие файла
   if(Handle<0)                        // Неудача при открытии файла
     {
      if(GetLastError()==4103)         // Если файла не существует,..
         Alert("Нет файла с именем ",File_Name);//.. извещаем трейдера 
      else                             // При любой другой ошибке..
         Alert("Ошибка при открытии файла ",File_Name);//..такое сообщ
      PlaySound("Bzrrr.wav");          // Звуковое сопровождение
      return(0);                          // Выход из start()      
     }
//--------------------------------------------------------------- 4 --
   while(FileIsEnding(Handle)==false)// До тех пор, пока файловый ..
     {                                // ..указатель не в конце файла
      //--------------------------------------------------------- 5 --
      Str_DtTm =FileReadString(Handle);// Дата и время события(дата)
      Text     =FileReadString(Handle);// Текст описания события
      //--------------------------------------------------------- 6 --
      Dat_DtTm =StrToTime(Str_DtTm);   // Преобразование типа данных
      //--------------------------------------------------------- 7 --
      shift=iBarShift(NULL,0,Dat_DtTm);
      Alert("Время=",TimeToString(Time[shift]),"Text=",Text); 
      if(FileIsEnding(Handle)==true)   // Файловый указатель в конце
      break;                        // Выход из чтения и рисования
     }
//--------------------------------------------------------------- 8 --
   FileClose( Handle );                // Закрываем файл
   return(0);                             // Выход из start()
  }
//--------------------------------------------------------------- 9 --

Строку с «Alert» можно убрать.

По логике нужно получать дату в индикаторе и сравнивать с файлом и  при совпадении присваивать значение буферу.

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

Вопрос как в индикаторе фиксировать обработанные строки файла и начинать поиск после них?