Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2180

 
Deeztar #:

Не роботает тестер выбивает: 2023.04.20 17:20:30.885 Tester no optimized parameter selected, please check input(s) to be optimized and set start, step and stop values

                                                2023.04.20 16:03:08.754 Tester Cloud servers switched off

Есть решение или это мт5 лагает?



 либо выключите оптимизацию, либо настройте ее корректно. Если не знаете как или что это такое - то просто выключите и тестируйте в обычном режиме 

 
ANDREY #:

Я сделал массив статическим

моя переменная a - это Ваша G, поэтому избавимся от нее

int b=-1,B=-1;
input int G=0;
double My[366];
ArrayInitialize(My,0);

void OnTick()
{
if(Bid==iOpen(NULL ,PERIOD_D1,0)&&DayOfWeek()==G &&B!=Day())
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+150*Point,Ask-70*Point,"310",5);
B=Day();
b++;
My[b]=Bid;
}
}   
double OnTester()
   {
   string eName="My_"+(string)G+".csv";
   if(FileIsExist(eName)) FileDelete(eName); 
   int eHandle=FileOpen(eName,FILE_CSV|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ,";");
   if(eHandle!=INVALID_HANDLE)
      {
      for(int i=0; i<=365; i++)
         {
         FileWrite(eHandle,DoubleToString(My[i],Digits));
         }
      }
      FileClose(eHandle);
      return(0);
   }

В результате у Вас должно появиться 5 файлов (на каждый день недели).

В тех случаях, когда Вы объявили переменную и далее производите с этой переменной сравнение или действия кроме присвоения, необходимо первоначально присвоить ей нужное значение. По умолчанию, в инициализированной переменной не обязательно будет ноль, то же самое касается элементов массива. Так неправильно:

int b,B;
double My[366];


if(B!=Day()) ...; //в первый раз B имеет неизвестное значение
b++; //начали увеличивать неизвестное значение
FileWrite(eHandle,DoubleToString(My[i],Digits)); //ранее в OnTick() не все элементы массива могли быть заполнены, поэтому в файл может быть выведен мусор вместо нулей

Используйте #property strict в начале кода, он будет указывать Вам на подобные неточности.

В OnTick() может быть больше сделок, чем 366, и произойдет ошибка выхода за пределы массива.
 
Aleksei Stepanenko #:

моя переменная a - это Ваша G, поэтому избавимся от нее

В результате у Вас должно появиться 5 файлов (на каждый день недели).

В тех случаях, когда Вы объявили переменную и далее производите с этой переменной сравнение или действия кроме присвоения, необходимо первоначально присвоить ей нужное значение. По умолчанию, в инициализированной переменной не обязательно будет ноль, то же самое касается элементов массива. Так неправильно:

Используйте #property strict в начале кода, он будет указывать Вам на подобные неточности.

В OnTick() может быть больше сделок, чем 366, и произойдет ошибка выхода за пределы массива.

Огромное Вам спасибо за ценную информацию А есть техническая возможность содержимое всех 5 файлов объединить в 1. Я знаю как это сделать средствами екселя. А mql4  по завершении всех 5 прогонов может содержимое 5 файлов положить в 1 файл? Если может буду Вам очень признателен, если продемонстрируйте мне это в коде.
Еще раз большое спасибо за помощь.

Компилятор не разрешил на глобальном уровне заполнить массив нулями при помощи функции  ArrayInitialize  . Я вообще удалил эту функцию из кода, то есть не стал заполнять массив нулями вообще. Программа этого даже не заметила и действительно создала 5 файлов и положила в них все что мне нужно. Мне бы теперь объединить в программе 5 в 1.

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

ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
ANDREY #:

Огромное Вам спасибо за ценную информацию А есть техническая возможность содержимое всех 5 файлов объединить в 1. Я знаю как это сделать средствами екселя. А mql4  по завершении всех 5 прогонов может содержимое 5 файлов положить в 1 файл? Если может буду Вам очень признателен, если продемонстрируйте мне это в коде.
Еще раз большое спасибо за помощь.

Компилятор не разрешил на глобальном уровне заполнить массив нулями при помощи функции  ArrayInitialize  . Я вообще удалил эту функцию из кода, то есть не стал заполнять массив нулями вообще. Программа этого даже не заметила и действительно создала 5 файлов и положила в них все что мне нужно. Мне бы теперь объединить в программе 5 в 1.

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

Это написано на mql5, но в mql4 всё точно так-же.

Помогите объединить несколько массивов в один. - Хорошо, что получилось.
Помогите объединить несколько массивов в один. - Хорошо, что получилось.
  • 2023.04.17
  • www.mql5.com
Ничего не понял объединение двух сортированных массивов применяй. ---- если были-бы указатели как C можно было-бы писать быструю функцию объединения многих массивов. Поэтому мне нужно все массивы с временем объединить в один
 
Alexey Viktorov #:

Это написано на mql5, но в mql4 всё точно так-же.

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

Если я правильно Вас понял еще не читая материал по ссылке, Вы предлагаете для моего случая объединять массивы. Но не объединять содержимое файлов сvs. По ссылке речь идет об объединении НЕСКОЛЬКИХ массивов в один. А у меня только один массив Му[ ]

 
ANDREY #:

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

Если я правильно Вас понял еще не читая материал по ссылке, Вы предлагаете для моего случая объединять массивы. Но не объединять содержимое файлов сvs. По ссылке речь идет об объединении НЕСКОЛЬКИХ массивов в один. А у меня только один массив Му[ ]

Ну так прочтите первый файл в результирующий массив, затем прочтите второй файл во временный массив. Объедините эти два массива, прочтите третий в тот-же временный массив, не забыв изменить его размер до нуля и так далее пока не кончатся массивы. Потом запишите результирующий массив в файл.

Аааа… А зачем вам файл .csv если можно записать массив в .bin файл одним движением мизинца… Конечно все советчики тут имеют свой опыт и каждый по своему понимает алгоритм. Кому-то очень надо после записи такого массива увидеть результат в Excell но если глазами смотреть нет необходимости, то и писать надо так как проще выполнить операцию кастрации…

Второй вариант, дописывать в готовый файл каждый следующий массив. Так тоже можно…

 
Alexey Viktorov #:

Ну так прочтите первый файл в результирующий массив, затем прочтите второй файл во временный массив. Объедините эти два массива, прочтите третий в тот-же временный массив, не забыв изменить его размер до нуля и так далее пока не кончатся массивы. Потом запишите результирующий массив в файл.

Аааа… А зачем вам файл .csv если можно записать массив в .bin файл одним движением мизинца… Конечно все советчики тут имеют свой опыт и каждый по своему понимает алгоритм. Кому-то очень надо после записи такого массива увидеть результат в Excell но если глазами смотреть нет необходимости, то и писать надо так как проще выполнить операцию кастрации…

Второй вариант, дописывать в готовый файл каждый следующий массив. Так тоже можно…

Мне нужно смотреть глазами....и как я понял в  .bin мои глаза увидят но ум не поймет...
А вот второй вариант был бы для меня оптимальным...как мне кажется. Если Вам не сложно не могли бы Вы внести изменения в последнюю версию моего кода в соответствии со вторым вариантом. Так я усвою новую для меня информацию намного быстрее .А если внесете в мой код изменения и в соответствии с первым вариантом , то  еще больше обогатите меня новой инфой по mql4 ... и моя благодарность Вам не будет знать никаких границ.....

А правильно я понял, что прочесть файл в массив - это значит записать содержимое файла в массив?

А изменять до нуля нужно размер третьего файла или временного массива?

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

 
ANDREY #:

Мне нужно смотреть глазами....и как я понял в  .bin мои глаза увидят но ум не поймет...
А вот второй вариант был бы для меня оптимальным...как мне кажется. Если Вам не сложно не могли бы Вы внести изменения в последнюю версию моего кода в соответствии со вторым вариантом. Так я усвою новую для меня информацию намного быстрее .А если внесете в мой код изменения и в соответствии с первым вариантом , то  еще больше обогатите меня новой инфой по mql4 ... и моя благодарность Вам не будет знать никаких границ.....

А правильно я понял, что прочесть файл в массив - это значит записать содержимое файла в массив?

А изменять до нуля нужно размер третьего файла или временного массива?

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

Я говорил о размере временного массива.

Когда-то я пытался разобраться с местом указателя файла, но как-то так получилось, что длина одной строки отличается от другой и соответственно точно попасть в конец строки у меня не получилось. На том я и бросил это занятие, решил что писать массивы в .bin дешевле. Хотя у вас другая ситуация… Вам нужно не конец строки в середине файла, а самый конец файла, это проще, но я этим не занимался. Следовательно, чтобы вам написать несколько строк, я должен написать, проверить перепроверить, а мне лениво… Не обессудьте…

ArrayFree - Операции с массивами - Справочник MQL4
ArrayFree - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayFree - Операции с массивами - Справочник MQL4
 
Alexey Viktorov #:

Я говорил о размере временного массива.

Когда-то я пытался разобраться с местом указателя файла, но как-то так получилось, что длина одной строки отличается от другой и соответственно точно попасть в конец строки у меня не получилось. На том я и бросил это занятие, решил что писать массивы в .bin дешевле. Хотя у вас другая ситуация… Вам нужно не конец строки в середине файла, а самый конец файла, это проще, но я этим не занимался. Следовательно, чтобы вам написать несколько строк, я должен написать, проверить перепроверить, а мне лениво… Не обессудьте…

Понял. Спасибо за ценную информацию. Объясните мне пожалуйста такой момент 

int b=-1,B=-1;
input int G=0;
double My[366];
ArrayInitialize(My,0);

void OnTick()
{
if(Bid==iOpen(NULL ,PERIOD_D1,0)&&DayOfWeek()==G &&B!=Day())
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+150*Point,Ask-70*Point,"310",5);
B=Day();
b++;
My[b]=Bid;
}
}   
double OnTester()
   {
   string eName="My_"+(string)G+".csv";
   if(FileIsExist(eName)) FileDelete(eName); 
   int eHandle=FileOpen(eName,FILE_CSV|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ,";");
   if(eHandle!=INVALID_HANDLE)
      {
      for(int i=0; i<=365; i++)
         {
         FileWrite(eHandle,DoubleToString(My[i],Digits));
         }
      }
      FileClose(eHandle);
      return(0);
   }

Если я не ошибаюсь управление  в выделенную строку попадает на каждом тике. Для чего на каждом тике делать 365 итераций. Например, на  тике N в первую (0) ячейку массива записалось значение. А 355 ячеек - пустые, без значений. Для чего нужно по пустым ячейкам массива прогонять заголовок цикла с последующими итерациями? Почему нельзя вообще обойтись без цикла и в функции  FileWrite(eHandle,DoubleToString(My[i][1],Digits)); вместо   [i][ всегда ставить  [b] Я убирал цикл и делал так как я здесь написал. Почему то в этом случае в файл ничего не писалось.... 

Спасибо

 
Думаю так: создать двумерный массив 5х366. Перед началом прогона загружать из файла всё имеющиеся колонки. В момент прогона заполнить нужный столбец из пяти. По окончании выгрузить весь массив целиком заменив предыдущий файл. Но такое писать не пять минут. Не обещаю, что смогу быстро сделать. Сами тоже попробуйте писать.