Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
может и подошли бы, но не выщло прикрутить, не разобрался с ними, в прочем как с массивами всеми. пока еще трудны для понимания. читаю, смотрю коды, пока туго
Если знаете как и не в тягость, подскажите, на конкретном рабочем примере может и понимание быстрее придет
Я не все вопросы просмотрел. Понял так, что ищешь в массиве, а так из файла конечно в цикле. Я чуток поправил свой пост пока ты отвечал не него.
 

mogul

Новичок форума
все так же: hi находит, lo = 0.
это штука у меня перед циклом стояла, не указал я почему то.

пробовал с массивами вот это сейчас,

max = cena; min=cena; double maxId=ArrayMaximum(max,WHOLE_ARRAY,0);
double minId=ArrayMaximum(min,WHOLE_ARRAY,0);
в результате вышло только, что самый большой элемент 64, т.е. верно посчитал колличество.
понимаю ,что не совсем должна быть эта штука сложная, но не выходит у меня и все.
если бы по барам то сделал бы сам, а тут из-вне, как и за что зацепится ума не приложу
спасибо за помощь и что откликнулись, но если придет мысль какая и будет не лениво, сообщите. просматриваю регулярно
 

AlexeyVik

Программист mql4 mql5
все так же: hi находит, lo = 0.
Ну и правильно... Писание "на коленке" редко бывает без ошибок.
Код:
double lo = 1000, hi = 0;
  for (i = 0; i < 480; i++) 
{
     optiontype = FileReadString(hFile);
     cena = StrToDouble(FileReadString(hFile));
    // Как я понял, то при каждой итерации цикла читается следующая строка файла...
     if (cena > hi) hi = cena;
     if (cena < lo) lo = cena;
 }
   // После выхода из цикла имеем hi и lo...
Попробуй так
 

mogul

Новичок форума
без изменений, hi есть, lo = 0

не знаю, обратил ли ты внимание или нет, но данные поступают не подряд от меньшего к большему или наоборот, а вперемешку, за меньшим может стоять большее, еще меньшее, большее и т.д, мешанина в общем.
если задать подряд, то у меня как то один раз вышло, но потом я забыл как, больше не получилось, но в общем то так и не надо, т. к. данные идут всегда в перемешку
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
пробовал с массивами вот это сейчас,

max = cena; min=cena; double maxId=ArrayMaximum(max,WHOLE_ARRAY,0);
double minId=ArrayMaximum(min,WHOLE_ARRAY,0);
в результате вышло только, что самый большой элемент 64, т.е. верно посчитал колличество.
понимаю ,что не совсем должна быть эта штука сложная, но не выходит у меня и все.
если бы по барам то сделал бы сам, а тут из-вне, как и за что зацепится ума не приложу
спасибо за помощь и что откликнулись, но если придет мысль какая и будет не лениво, сообщите. просматриваю регулярно

А если через массив, то надо загнать все прочитанные данные в один массив, или вообще поменять подход к этому вопросу и записывать данные сразу массивом FileWriteArray _http://docs.mql4.com/ru/files/filewritearray а потом читать так-же массивом FileReadArray _http://docs.mql4.com/ru/files/filereadarray.
И когда получил массив искать индекс максимального и минимального элемента по которым соответственно найдутся и сами значения.
 
Последнее редактирование:

ansol

Местный знаток
без изменений, hi есть, lo = 0

Отсюда следует, что где-то есть переменная cena со значением "0" или с пустым значением, что то же самое.
Присваивай cena (масив объяви) и потом
ArrayMax к ней и ArrayMin к ней же.
Заодно и распечатай весь массив, явно же присваивание стоит, раз ноль получился. значит, ноль где-то был.
 

Ugar

Гуру форума
Точно. Там явно читается не то из файла. При ошибке преобразования строки в число, возвращается 0.
Лучше разобраться с файлом, но можно просто добавить условие.
Код:
double lo = 0, hi = 0;   
for (i = 0; i < 480; i++)  
{      
optiontype = FileReadString(hFile);      
cena = StrToDouble(FileReadString(hFile));     
    if(cena > 0.000001)
{
if (cena > hi) hi = cena;     
 if (cena < lo || lo<0.000001) lo = cena; 
 }}
Возможно в конце файла лажа, или длина файла не соответствует циклу...
 
Последнее редактирование:

mogul

Новичок форума
вот такой результат получаю, в различных комбинациях
hilopng_6804400_14746066.png
 
Последнее редактирование модератором:

ansol

Местный знаток
Кстати, если строк в файле 479, а цикл идет до 480, то последнее значение, кажись, и будет нулевым, нет?
Цикл же никак не обрывается по окончании файла
 

AlexeyVik

Программист mql4 mql5
без изменений, hi есть, lo = 0

не знаю, обратил ли ты внимание или нет, но данные поступают не подряд от меньшего к большему или наоборот, а вперемешку, за меньшим может стоять большее, еще меньшее, большее и т.д, мешанина в общем.
если задать подряд, то у меня как то один раз вышло, но потом я забыл как, больше не получилось, но в общем то так и не надо, т. к. данные идут всегда в перемешку
Значит распечатай в цикле что читается из файла. И обрати внимание где объявлены hi и lo перед циклом...
По алгоритму получается так:

Объявили переменные с присвоением им значений
hi = 0, lo = 1000;
Читаем из файла первое значение cena = 1.2531;
Если cena больше hi(тоесть больше 0) то hi = 1.2531;
Если cena меньше lo(тоесть меньше 1000) то lo = 1.2531;
При следующей итерации
hi будет 1.2656; а lo останется 1.2531;
дальше hi = 1.2712; lo = 1.2531;
дальше hi = 1.2712; lo = 1.2418;
 

AlexeyVik

Программист mql4 mql5
Кстати, если строк в файле 479, а цикл идет до 480, то последнее значение, кажись, и будет нулевым, нет?
Цикл же никак не обрывается по окончании файла
Совершенно верно. Поэтому я зря убрал из условия проверку на > 0
 

mogul

Новичок форума
Фантастика. заработало с условием. Но я же 0 отбрасываю уловием

if (cena <1) i--;

это не верно? вместо 1 что то другое надо, как в условие поставили 0.00001
ну все равно, супер бесконечно благодарен, два месяца мозговал над этим.
21 век настал все таки
 

Ugar

Гуру форума
Фантастика. заработало с условием. Но я же 0 отбрасываю уловием

if (cena <1) i--;

это не верно? вместо 1 что то другое надо, как в условие поставили 0.00001
ну все равно, супер бесконечно благодарен, два месяца мозговал над этим.
21 век настал все таки
if (cena <1) i--;Это возвращает цикл назад. Должно вообще привести к зацикливанию.
Тогда уж лучше пропускать пустоту
if (cena <1) continue;
 

Александр_Стручков

Интересующийся
Опять взываю о помощи гуру MQL..

В начале текста советника объявлен массив.
PHP:
int orders [200][3];

Далее в функции On init пытаюсь заполнить его значениями, но выдает ошибку array out of range :(

PHP:
   for(q=199;i>=0;q--)
     {
      orders[q,0]=0;
      orders[q,1]=0;
      orders[q,2]=1;
     }
Что не так? :(
 

Ugar

Гуру форума
Опять взываю о помощи гуру MQL..

В начале текста советника объявлен массив.
PHP:
int orders [200][3];
Далее в функции On init пытаюсь заполнить его значениями, но выдает ошибку array out of range :(

PHP:
   for(q=199;i>=0;q--)
     {
      orders[q,0]=0;
      orders[q,1]=0;
      orders[q,2]=1;
     }
Что не так? :(
Переменную перепутал. for(q=199;q>=0;q--)
 

gince

Местный знаток
Здрастуйте.
Насколько я понимаю, то с этого индикатора взять данные невозможно.
Прав ли я ? Если неправ, то покажите как. Я пробовал так
y1 = iCustom(Symbol(),0 , "Nihilist_Ultra Trend_V2",3,1);
Print("y1=",y1);
y2 = iCustom(Symbol(),0 , "Nihilist_Ultra Trend_V2",4,1);
Print("y2=",y2);

получаю всегда
2014.11.21 15:42:10.859 **************GBPJPY,M1: y1=0.0
 

Вложения

  • Nihilist_Ultra_Trend_V2.ex4
    10,5 КБ · Просмотры: 22
Последнее редактирование:

gince

Местный знаток
Извеняюсь, сам ошибку сделал в названии индикатора
iCustom(Symbol(),0 , "Nihilist_Ultra_Trend_V2",3,1);
 

Yurkov

Почетный гражданин
Всем здрасте!
Сразу оговорюсь, я не программист.
Хочу добавить в свою сову функцию расчета лота. На 1000 единиц депозита лот 0.1

написал так:

double Getlots()
{
Lots= AccountBalance() / 1000*LotsFor1000;
Lots=MathMax(Lots, MarketInfo (Symbol(), MODE_MINLOT));
Lots=MathMin(Lots, MarketInfo (Symbol(),MODE_MAXLOT));
Lots=NormalizeDouble(Lots,2);
return(Lots);
}

В итоге советник расчитывает лот только разово. К примеру начальный депозит 2000, Советник пославит лот 0.2, но когда депозит становится 3000, лот по прежнему остается 0.2
Что не так? Где ошибка?
 
Верх