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

 

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

Подскажите как оптимизировать код, чтобы всю инфу в файл вывести? У эксперта CandleCode_Scet.mq4. Второй файл - индикатор из которого он берет инфу.

Файлы:
 

Я понимаю, что нужно создать массив, и туда записать все.

А потом массив записать в файл.

Как записать следующие с троки в массив?

    if (CandleCode_1==0) Code_0++;
    if (CandleCode_1==1) Code_1++;
    if (CandleCode_1==2) Code_2++;
    if (CandleCode_1==3) Code_3++;
    if (CandleCode_1==4) Code_4++;
    if (CandleCode_1==5) Code_5++;
    if (CandleCode_1==6) Code_6++;
    if (CandleCode_1==7) Code_7++;
    if (CandleCode_1==8) Code_8++;
    if (CandleCode_1==9) Code_9++;
    if (CandleCode_1==10) Code_10++;
    if (CandleCode_1==11) Code_11++;
    if (CandleCode_1==12) Code_12++;
    if (CandleCode_1==13) Code_13++;
    if (CandleCode_1==14) Code_14++;
    if (CandleCode_1==15) Code_15++;
    if (CandleCode_1==16) Code_16++;
    if (CandleCode_1==17) Code_17++;
    if (CandleCode_1==18) Code_18++;
    if (CandleCode_1==19) Code_19++;
    if (CandleCode_1==20) Code_20++;
    if (CandleCode_1==21) Code_21++;
    if (CandleCode_1==22) Code_22++;
    if (CandleCode_1==23) Code_23++;
    if (CandleCode_1==24) Code_24++;
    if (CandleCode_1==25) Code_25++;
    if (CandleCode_1==26) Code_26++;
    if (CandleCode_1==27) Code_27++;
    if (CandleCode_1==28) Code_28++;
    if (CandleCode_1==29) Code_29++;
    if (CandleCode_1==30) Code_30++;
 
Alfa писал (а) >>

Я понимаю, что нужно создать массив, и туда записать все.

А потом массив записать в файл.

Как записать следующие с троки в массив?

как вариант объявим массив и затем

1

code [I] = code [I]+ 1;


еще можно так

2

code [I]++;


где I = CandleCode

---

приятно когда код из 30 строчек переливается в одну строку :-) ?

 
YuraZ писал (а) >>

как вариант объявим массив и затем

1

code [I] = code [I]+ 1;

еще можно так

2

code [I]++;

где I = CandleCode

---

приятно когда код из 30 строчек переливается в одну строку :-) ?

Спасибо! Вроде понял как массив создать.

А вот на запись в массив у меня компилятор ругается, что-то я не так делаю. Подскажите что?

//+------------------------------------------------------------------+
//|                                            CandleCode_Scet_3.mq4 |
//+------------------------------------------------------------------+
static datetime   PrevTime=0;
int Code[130];

int start()
{
  if (PrevTime!=Time[0]) 
  {
    PrevTime=Time[0];
    int CandleCode_1=iCustom(NULL,0,"to_ind_CandlCode_ICS",0,1); 
    Code[CandleCode_1]=Code[CandleCode_1]++;
  }
  return(0);
}
void TestWrite(string Array[],string FileName)
   {
   
   int handle=-1;
   int size=ArraySize(Array);
   if (size==0 || StringLen(FileName)==0) return;
   if (StringLen(FileName)==0)
      {
      Print("Не задано имя для отладочного файла!");
      return;
      }
//----
   handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
   if (handle==-1) 
      {
      Print("Не удалось открыть файл ",FileName);
      return;
      }
   if (handle>0) for (int i=0;i<size;i++) FileWrite(handle,Array[i]);
   if (handle>0) FileClose(handle);
//----
   return;
   }
 

Так, одну ошибку нашел, почему не компилировался советник.

Осталось одно предупреждение:

Function "TestWrite" is not referenced and will be removed from exp-file

Что в переводе означает:

Функция "TestWrite" не ссылалась на и будет удалена из экс-файла

Мне вот тут 'Статистику в файл', Rosh, подсказал как массив в файл записать, а я все никак не могу применить.

Подскажите, что надо сделать, чтоб в файл вывести массив?

//+------------------------------------------------------------------+
//|                                            CandleCode_Scet_3.mq4 |
//+------------------------------------------------------------------+
static datetime   PrevTime=0;
int Code[130];
int temp;

int start()
{
  if (PrevTime!=Time[0]) 
  {
    PrevTime=Time[0];
    int CandleCode_1=iCustom(NULL,0,"to_ind_CandlCode_ICS",0,1); 
    Code[CandleCode_1]++;
  }
  return(0);
}
void TestWrite(string Code[],string FileName)
   {
   
   int handle=-1;
   int size=ArraySize(Code);
   if (size==0 || StringLen(FileName)==0) return;
   if (StringLen(FileName)==0)
      {
      Print("Не задано имя для отладочного файла!");
      return;
      }
//----
   handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
   if (handle==-1) 
      {
      Print("Не удалось открыть файл ",FileName);
      return;
      }
   if (handle>0) for (int i=0;i<size;i++) FileWrite(handle,Code[i]);
   if (handle>0) FileClose(handle);
//----
   return;
   }
 
Alfa писал (а) >>

Так, одну ошибку нашел, почему не компилировался советник.

Осталось одно предупреждение:

Function "TestWrite" is not referenced and will be removed from exp-file

Что в переводе означает:

Функция "TestWrite" не ссылалась на и будет удалена из экс-файла

Мне вот тут 'Статистику в файл', Rosh, подсказал как массив в файл записать, а я все никак не могу применить.

Подскажите, что надо сделать, чтоб в файл вывести массив?

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

т к не нужна


Вы статистику как хотите собрать ? 130 тиков ?

и записать их ?

а когда прийдет еще 130 тиков старую статистику убивать будете ?

просто судя по коду вы именно так хотите

 
YuraZ писал (а) >>

Вы статистику как хотите собрать ? 130 тиков ?

и записать их ?

а когда прийдет еще 130 тиков старую статистику убивать будете ?

просто судя по коду вы именно так хотите

Извиняюсь, что долго не писал - уезжал.

Статистику я не по 130 тиков хочу собрать а по другому.

Алгоритм такой:

1. Появился 1 тик 0 свечи, значит 1 свеча сформировалась и изменяться не будет. Считываем значение индикатора to_ind_CandlCode_ICS на 1 свече т.е. цифровой код свечи.

2. Значение ячейки массива соответствующей коду свечи увеличиваем на еденицу. В итоге после прохода советником по истории, мы имеем массив с количеством свечей каждого кода.

3. Записываем массив в файл.

Пример:

1. Началась новая свеча. Считываю значение индикатора

int CandleCode_1=iCustom(NULL,0,"to_ind_CandlCode_ICS",0,1);

2. Предположим код 1-ой свечи 24, то значение 24 ячейки в массиве увеличиваем на 1 типа Code[24]++; в коде это я прописал как

Code[CandleCode_1]++;

С появлением новой свечи опять считываем ее код (предположим код новой свечи 68), то значение в 68 ячейке увеличиваем на 1 типа Code[68]++; как выглядит в коде я уже писал.

3. Записываем массив в файл.

Предполагаю, что должно получится типа:

4

8

23

...

38

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

 

Вот вроде бы то что Вам нужно, но реализовал в виде скрипта(на мой взгляд выгоднее советника), и индикатор у меня по другому называется.

extern datetime BeginDateCalc = D'2008.01.01';
extern datetime EndDateCalc = D'2008.05.01';

int Code[130];
int temp;
int i;

int start()
{
   for (i=Bars-3; i>0; i--) 
   {
      if (Time[i]>=BeginDateCalc && Time[i]<=EndDateCalc) 
      {
         int CandleCode_1=iCustom(NULL,0,"CandleCode",4,i); 
         Code[CandleCode_1]++;Print(CandleCode_1);
      }
   }
  TestWrite(Code,Symbol()+" "+Period()+".csv");
}
void TestWrite(int Code[],string FileName)
   {
   int handle=-1;
   int size=ArraySize(Code);
   if (size==0 || StringLen(FileName)==0) return;
   if (StringLen(FileName)==0)
      {
      Print("Не задано имя для отладочного файла!");
      return;
      }
   handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
   if (handle==-1) 
      {
      Print("Не удалось открыть файл ",FileName);
      return;
      }
   if (handle>0) for (int i=0;i<size;i++) FileWrite(handle,Code[i]);
   if (handle>0) FileClose(handle);
   return;
   }
Файлы:
 
StatBars писал (а) >>

Вот вроде бы то что Вам нужно, но реализовал в виде скрипта(на мой взгляд выгоднее советника), и индикатор у меня по другому называется.

Спасибо за помощь.

В коде твоего скрипта изменил дату начала теста и название индикатора

extern datetime BeginDateCalc = D'2001.01.01';
...
int CandleCode_1=iCustom(NULL,0,"to_ind_CandlCode_ICS",0,1);

А можешь подсказать как сделать чтоб при старте запрашивал дату начала теста?

Скрипт файл пишет, но в файле:

0
0
0
0
0
1918
0
0
0
0
0
0
0

Такое впечатление, что в шестую ячейку скрипт записал все колическво свечей с начала теста.

Ну это дело техники, буду разбираться.

 
Alfa писал (а) >>

Спасибо за помощь.

В коде твоего скрипта изменил дату начала теста и название индикатора

А можешь подсказать как сделать чтоб при старте запрашивал дату начала теста?

Скрипт файл пишет, но в файле:

0
0
0
0
0
1918
0
0
0
0
0
0
0

Такое впечатление, что в шестую ячейку скрипт записал все колическво свечей с начала теста.

Ну это дело техники, буду разбираться.

Не правильный индекс у функции!

int CandleCode_1=iCustom(NULL,0,"to_ind_CandlCode_ICS",0,i);
В коде дату менять не обязательно, при запуске скрипта её можно установить...
Файлы:
 
StatBars писал (а) >>

Не правильный индекс у функции!

В коде дату менять не обязательно, при запуске скрипта её можно установить...

StatBars, спасибо. Как только заменил 1 на i так все прекрасно в файл записалось.

А вот установить дату при запуске скрипта, он мне не предлагает. Хоть я перетаскиваю скрипт на график, хоть в контекстном меню выбираю "Исполнить на графике".

Ну это мелочи. Главное все работает. Еще раз - спасибо!!!

Причина обращения: