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

Leonup

Новичок форума
Как по мне, визуально, все совпадает...
Простите, пожалуйста, увидев Ваш скриншот, понял, что допустил грубую оплошность. Не сказал, что скрипт выполняется сначала на D1, и затем нужно вручную переключить на Н1. Именно так должен работать и советник. А он только строит линии на D1, но не переключается на другой таймфрейм.
Вопрос: как программно переключить таймфрейм с D1 на другой таймфрейм?
Видимо, тут нужен chart_id. Как это сделать, не могу понять.
 

mobidik

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

Ups, такое впечатление, что Вы сами до конца не понимаете что сделали - Ваш результат расчета не зависит от рабочего ТФ, весь расчет происходит только по D1, т.е., все привязано к D1 и при любых переключениях рабочего ТФ - результат не меняется. Но, есть нюанс по построению линии Ганна - у неё не задается значение второй точки привязки по цене, есть только время второй точки. Вместо значения цены задается значение угла или масштаба. С углом тут все понятно, угол есть угол, а масштаб определяется как количество пипсов на бар, при этом справка умалчивает как это происходит. Скорее всего, расчет масштаба происходит по бару указанной второй точки привязки по времени и размеру бара, соответствующего данному времени. Вы используете как раз масштаб - OBJPROP_SCALE - вот тут и происходит изменение угла линий при переключении ТФ, т.к. в одно и то же время, размер бара на разных ТФ будет разным. Если вместо масштаба использовать угол, OBJPROP_ANGLE, то наклон линий не измениться при переключении ТФ, но, значение данного параметра нужно определить заранее.

Вопрос: как программно переключить таймфрейм с D1 на другой таймфрейм?

ChartSetSymbolPeriod(0,NULL,задать ТФ) ;
 

dreamorder

Прохожий
Привет дорогие форумчане.
Есть у меня парочка вопросов о mql4.
Даже в примитивном калькуляторе можно выполнить то что нужно трейдеру, а в mql4 это "танцы с бубном" и не всегда с положительным результатом! Почему в яп есть куча совершенно не нужных, математических функций, но нет элементарных? К примеру как сравнивать отрицательные и положительные числа типа double? Как вообще проводить математические операции с отрицательными и положительными числами???

Есть некоторый код:
Код:
// получаю данные буферов индикатора, которые могут быть
// как положительные так и отрицательные!
double Buffer0 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,0,0);
double Buffer1 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,2,0);

// теперь требуется определить разницу между данными буферов
// искомый порог этой разницы к примеру 0.8 или -0.8
double diff = 0.0;
    if ( diff == 0.0 ) diff += _GBRUSD_DUBLES_Buffer0; else diff -= _GBRUSD_DUBLES_Buffer0;
    if ( diff == 0.0 ) diff += _GBRUSD_DUBLES_Buffer1; else diff -= _GBRUSD_DUBLES_Buffer1;
// с этим можно справиться вот этой функцией
if(MathAbs(diff) >= 0.8) { ... }
if(MathAbs(diff) <= 0.8) { ... }

// но теперь требуется определить большее или меньшее число
// если числа обоих буферов положительные, определить какое число больше возможно
// но когда одно число положительное, а второе отрицательное или оба отрицательные, я не знаю как это сделать =(
// потому что элементарное <> == не работает в mql4 !!!
// я вообще не уверен что mql4 знает об отрицательных значениях =)

В конце-концов mql4 это компьютерный инструмент, почему он хуже калькулятора прошлого века? Я знаю. Это сговор "форекс кухонь", поставщиков ликвидности и разработчика mql4 =) Хотя это не смешно вообще то.
Для серверов мт5 есть антискальперские плагины, в которых можно любого пользователя терминала мт5 ограничить в чём то! И самый известный Аль...и использует такое по.

Помогите пожалуйста сравнивать отрицательные и положительные числа, а так же выполнять с ними элементарные математические действия (сложение, вычитание и т.д.)

Спасибо!
 

Ugar

Гуру форума
как сравнивать отрицательные и положительные числа типа double? Как вообще проводить математические операции с отрицательными и положительными числами???
Всё просто. Математика обычная как и с целыми числами. Нужно учитывать погрешности хранения и вычисления чисел с плавающей точной. 1, 2 единицы в 15 знаке после запятой.
double diff = 0.0;
if ( diff == 0.0 )...
Так делать нельзя. Нужно использовать то что вычисленные значения гораздо больше погрешности. Например
if(a-b>_Point)
Или нормировать при сравнении
if(NormalizeDouble(...) == NormalizeDouble(...))
 

MrGreen86

Гуру форума
Привет дорогие форумчане.
Есть у меня парочка вопросов о mql4.
Даже в примитивном калькуляторе можно выполнить то что нужно трейдеру, а в mql4 это "танцы с бубном" и не всегда с положительным результатом! Почему в яп есть куча
mql4 очень примитивный для понимания язык, и он точно лучше калькулятора.
Если вы только начали и чего то не поняли, не стоит сразу обвинять во всем всех вокруг.
У MetaQuotes очень много косяков и их есть за что поносить, но явно не за это )
Такие простые элементы они реализовали и работают они без сюрпризов.

Разница между двумя числами считается так же как и на калькуляторе.
одно минус другое по модулю. для модуля есть функция MathAbs.
double a = 0.8
double b = -0.8
double raznica = MathAbs(a-b).
если переменные a и b поменять местами результат будет всегда правильным - 1.6

пороговое значение.
числа с плавающей точкой (double, float и остальные) в любом ЯП хранятся не в виде десятичного числа, а грубо говоря в виде дроби (очень грубо говоря, хотите разобраться, читайте википедию "число двойной точности"). Это сделано с целью экономии и производительности.
Проведите такой эксперимент,
double a = 0.0;
for(i=0;i<10;i++) {
a+=0.1;
Print(a);
}
посмотрите что будет в журнале. на всякий случай прикрепил скрипт 123.
вместо 0.8 у вас будет 0.79999999999999999
вместо 0.9 у вас будет 0.89999999999999999
как в таких условиях делать сравнение? нельзя, нужно предварительно округлить число. сравнивать можно только с нулем. для округления есть функция нормализации, NormalizeDouble. Она округляет число до указанного количества знаков за запятой, подготавливая к сравнению.
if(NormalizeDouble(raznica,1) > NormalizeDoubler(0.8,1)) { ....
но это вариант для новичков, так как сама функция NormalizeDouble тяжелая, желательно уменьшить количество ее вызовов. Для этого есть такой прием:
if(NormalizeDouble(raznica - 0.8,1) > 0.0)
мы от разницы вычитаем пороговое значение и сравниваем с нулем.
если разница больше порогового значения, очевидно что результат вычитания будет больше 0.0
 

Вложения

  • 123.mq4
    929 байт · Просмотры: 19

eevviill2

Местный знаток
У кого ещё есть проблемы с iBars()
?
Если брать с другого символа то не правильное число выдаёт.
 

dreamorder

Прохожий
Спасибо за ответ, но ... .
Почему тогда не работает вот этот код -

Код:
double Buffer0 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,0,0);
double Buffer1 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,2,0);

double mM1=Buffer0;
double mM2=Buffer1;


          if((mM2 < 0 && mM1 > 0) || ((mM2 > 0) < (mM1 > 0)) || ((mM2 < 0) < (mM1 < 0)))
          {
          Start_Buy = 1;
          }
          else
          Start_Buy = 0;

?
Ведь в нём сравнение только с 0.0.
 
Последнее редактирование:

_SERG_

Активный участник
Спасибо за ответ, но ... .
Почему тогда не работает вот этот код -

Код:
double Buffer0 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,0,0);
double Buffer1 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,2,0);

double mM1=Buffer0;
double mM2=Buffer1;


          if((mM2 < 0 && mM1 > 0) || ((mM2 > 0) < (mM1 > 0)) || ((mM2 < 0) < (mM1 < 0)))
          {
          Start_Buy = 1;
          }
          else
          Start_Buy = 0;

?
Ведь в нём сравнение только с 0.0.
А что в буферах находится на момент сравнения, это чтобы не ванговать, а просто с 0.0 сравнивать?
 
Последнее редактирование:

Ugar

Гуру форума
Ведь в нём сравнение только с 0.0.
0.0 может только казаться нулём, на самом деле он от -0.000000000000002 до 0.000000000000002.
Если надо сравнивать значения индикатора, в котором пустое значение 0, а показание 0.1 определить можно
if(ind>0.05)
Но сначала надо определить какое именно у индикатора пустое значение, ведь оно может быть и не нулевым.
 

vlad_123

Местный знаток
// но теперь требуется определить большее или меньшее число // если числа обоих буферов положительные, определить какое число больше возможно // но когда одно число положительное, а второе отрицательное или оба отрицательные, я не знаю как это сделать =(
А зачем тогда сравнение с 0 вообще???
Или определяешь больше/меньше обычным сравнением x1<x2, или если такая озабоченность про положительные/отрицательные -сравнивать MathAbs(x1)<MathAbs(x2).
 

MrGreen86

Гуру форума
Спасибо за ответ, но ... .
Почему тогда не работает вот этот код -

Код:
double Buffer0 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,0,0);
double Buffer1 = iCustom(NULL,0,"_GBPUSD_DUBLES",0.8,2,0);

double mM1=Buffer0;
double mM2=Buffer1;


          if((mM2 < 0 && mM1 > 0) || ((mM2 > 0) < (mM1 > 0)) || ((mM2 < 0) < (mM1 < 0)))
          {
          Start_Buy = 1;
          }
          else
          Start_Buy = 0;

?
Ведь в нём сравнение только с 0.0.
потому что код не верный.
подркепляйте свои сообщения комментарием, что вы вообще пытались прописать в коде.

1) вот это условие, продублированное зачем то дважды, гарантированно ошибочное:
((mM2 > 0) < (mM1 > 0))
mM2 > 0 результат этой операции либо true, либо false
mM1 > 0 аналогично, либо true, либо false
и теперь вы сравниваете эти 2 логики true и false ? зачем?
выполняться будет если mM2 <= 0 и mM1 > 0
так как false < true.
но у вас почти тоже самое прописано в первом условии:
mM2 < 0 && mM1 > 0

2) почему сравниваете с нулем?
а) это подвальный индикатор с горизонтальной нулевой линией ? тогда почему сравниваете 2 разных буфера, и почему одно условие > а второе <, тогда как должно быть > и <= или < и >= ?
б) это индикатор с пустыми значениями? почему тогда < 0? крайне редко встречаются индикаторы у которых пустое значение меньше 0. как правило оно либо EMPTY_VALUE, либо DBL_MAX

3) почему данные берете с нулевой свечи? не смущает перерисовка? вы уверены что индикатор вообще что либо рисует на 0 свече?

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

west100

Активный участник
У кого ещё есть проблемы с iBars()
?
Если брать с другого символа то не правильное число выдаёт.
Может, потому что история не подгружена? У меня такое было при запуске мультивалютного советника. Лечилось тем, что сначала подгружалась история по нужным инструментам, а потом уже включалась логика в работу.
 

eevviill2

Местный знаток
Может, потому что история не подгружена? У меня такое было при запуске мультивалютного советника. Лечилось тем, что сначала подгружалась история по нужным инструментам, а потом уже включалась логика в работу.
Она подгрузилась и я не выключал VPS.
Мултивалютный советник проверял iBars("EURGBP",PERIOD_H1) на графике AUDUSD.
Так он каждый бар выдавал то 0 то 213 то 2 то...
 

_SERG_

Активный участник
Логику желательно упрощать
mM2 mM1 result
- - 1
- + 1
+ - 0
+ + 1


result = (mM2 > 0 && mM1 < 0) ? 0 : 1;
Этщ для аффтора вопроса (dreamorder), чтобы понял(а) с чем работает, ну и как следствие почему не работает.
А там уж, само собой, возникнет желание упростить логику.
Народ копипастит не думая, поэтому по граблям и бежит.
 

vlad_123

Местный знаток
// теперь требуется определить разницу между данными буферов
// искомый порог этой разницы к примеру 0.8 или -0.8
double diff = 0.0;
if ( diff == 0.0 ) diff += _GBRUSD_DUBLES_Buffer0; else diff -= _GBRUSD_DUBLES_Buffer0;
if ( diff == 0.0 ) diff += _GBRUSD_DUBLES_Buffer1; else diff -= _GBRUSD_DUBLES_Buffer1;
// с этим можно справиться вот этой функцией
double diff = MathAbs(buf0)-MathAbs(buf1);

// но теперь требуется определить большее или меньшее число
// если числа обоих буферов положительные, определить какое число больше возможно
// но когда одно число положительное, а второе отрицательное или оба отрицательные, я не знаю как это сделать =(
// потому что элементарное <> == не работает в mql4 !!!
// я вообще не уверен что mql4 знает об отрицательных значениях =)
О, мини-Перельман, а ведь в Метаквоте дошколята программят, и сотни тысяч пользователей не заметили такой косяк. Или в консерватории что-то подкрутить?

// но теперь требуется определить большее или меньшее число
// если числа обоих буферов положительные, определить какое число больше возможно
if (MathAbs(buf0) > MathAbs(buf1)) {
if (MathAbs(buf0)>0.8)
} else {
if (MathAbs(buf1)>0.8)
}
 

Кузя

Интересующийся
Ребята.Мне написали советник.Работает так,как надо.Но есть в нём пара вещей,которые надо исправить.Первое.Он на реале,да и на демо тоже,рисует значки-места покупок,продаж,стопа,тренда.Рисует так же,как в тестере.Они мешают.Главное,чтобы на реале не рисовал.Я сделал,чтобы по закрытию сделок они удалялись.Но это неудобно,т.к. они удаляются и вместе с ними удаляются кнопки.Приходится опять заходить в свойства советника,нажимать ок-тогда кнопки опять появляются.
Второе.Когда мышку наводишь на линию стопа или тейка,для перемещения,часто цепляется к ней стоп или тейк.А надо,чтобы цеплялась только эта линия(без вариантов).А сейчас приходится мышку ставить чуть ниже линии.Подкорректируйте,пожалуйста.Или подскажите,как исправить.
 

Вложения

  • Doliv2 (2).mq4
    23,5 КБ · Просмотры: 17
  • Screenshot_4.png
    Screenshot_4.png
    5,9 КБ · Просмотры: 65
  • Screenshot_5.png
    Screenshot_5.png
    8 КБ · Просмотры: 65

_SERG_

Активный участник
double diff = MathAbs(buf0)-MathAbs(buf1);


О, мини-Перельман, а ведь в Метаквоте дошколята программят, и сотни тысяч пользователей не заметили такой косяк. Или в консерватории что-то подкрутить?

// но теперь требуется определить большее или меньшее число
// если числа обоих буферов положительные, определить какое число больше возможно
if (MathAbs(buf0) > MathAbs(buf1)) {
if (MathAbs(buf0)>0.8)
} else {
if (MathAbs(buf1)>0.8)
}
Спроси ещё, что такое теорема Пуанкаре, и какое отношение к ней имеет Гриша Перельман.
Народ с арифметикой не дружит, а ты ...., Прям не знаю что сказать. )))))
 
Верх