Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2501


Так а NormalizeDouble чем не годится?



Есть ли такая функция которая позволяет не округлять а отбрасывать часть знаков после запятой? Или есть способ это как то реализовать?

Правильно сделать так, как написал JR, но можно и так:
double x = 123,456;
int y = (int)x; // результат: y = 123

Меня наверно не правильно поняли. Суть проблемы была найти ближайшие к цене круглые уровни. А для этого от цены допустим 1,12355 отбросить последние 3 цифры чтобы осталось 1,12000 Пришлось решать проблему чисто математически: цену 1,12355 делим на 0.00250 получаем 449,42, вот тут уже округляем до целого 449, умножаем на 0,00250 получаем 1,12250 и т.д. 1,12000, 1,12500
#2502


Пришлось решать проблему чисто математически: цену 1,12355 делим на 0.00250 получаем 449,42, вот тут уже округляем до целого 449, умножаем на 0,00250 получаем 1,12250 и т.д. 1,12000, 1,12500

level000 = NormalizeDouble(Bid,2);
level100 = NormalizeDouble(Bid,2) + 0.01;
#2503

Добрый день уважаемые программисты, возникла проблема...суть: хочу чтобы сов выводил через коммент минимальное значение осциллятора на конкретном временном промежутке...с 6 до 9 часов...попытался сам сделать ...не получилось....прошу помощи...
кусок кода:
int curtime = curhour * 60 + curmin;
int trade_start = OpenHour * 60 + OpenMin;
int trade_close = CloseHour * 60 + CloseMin;
if(curtime >= Start_calculation * 60 && curtime {
for(int i = 0; i {
bollinger = iCustom(Symbol(), PERIOD_M5, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
}
if(curtime == Finish_calc * 60)
{
double fgh = bollinger[ArrayMinimum(bollinger, 36, 0)];
}
}
Comment("минимальное значение = " + fgh);

#2504

хочу чтобы сов выводил через коммент минимальное значение осциллятора на конкретном временном промежутке...с 6 до 9 часов...

У Вас сова и индюк на одном ТФ или разных?
- если на одном ТФ, то начиная с старат_тайм по барам анализировать индюк выбирать миним. значение до енд_тайм.
- если на разных, то лучше по енд_тайм сделать цикл по барам другого ТФ и выбрать мин. значение индюка.
#2505


хочу чтобы сов выводил через коммент минимальное значение осциллятора на конкретном временном промежутке...с 6 до 9 часов...

У Вас сова и индюк на одном ТФ или разных?
- если на одном ТФ, то начиная с старат_тайм по барам анализировать индюк выбирать миним. значение до енд_тайм.
- если на разных, то лучше по енд_тайм сделать цикл по барам другого ТФ и выбрать мин. значение индюка.

у меня индюк и сова на однов ТФ(М5). только я не понял, т е мне надо делать 36 записей iCustom??Я Вас не понял...
#2506


у меня индюк и сова на однов ТФ(М5). только я не понял, т е мне надо делать 36 записей iCustom??Я Вас не понял...

Нет.
в сову приходят котировки и запускается процедура ОнТик()
Чтоб не вызывать индюк на каждом тике (может сильно подвесить сову) нужно отслеживать закрытие бара. Ранее выкладывал функцию IsNewBar(). Итак алгоритм:

static minBB = 0;
if ( Hour() > StartHour && Hour() {
if ( IsNewBar() )
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb }
}
else
{
if ( minBB > 0 ) Comment("Min BB =", NormalizeDouble(minBB,_Digits) );
minBB = 0;
}

Как-то так...
#2507

прошу прощения за назойливость, но где Вы выкладывали данную функцию...страниц 10-15 назад отматал...не нашел..

#2508

bool IsNewBar()
{
static datetime new_Bar;
if (new_Bar == Time[0]) return(false); //Если бар не закрыт - выход
new_Bar = Time[0]; return(true);
}

#2509

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

void OnTick()
{
int curhour = Hour();
int curmin = Minute();
int curtime = curhour * 60 + curmin;

static double minBB = 0;
if (curtime > Start_calculation * 60 && curtime {
if (IsNewBar())
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb }
}
else
{
if ( minBB > 0 )
{
Comment("Min BB = " + minBB);
minBB = 0;
}
}
}
//+------------------------------------------------------------------+
bool IsNewBar()
{
static datetime new_Bar;
if (new_Bar == Time[0]) return(false); //Если бар не закрыт - выход
new_Bar = Time[0]; return(true);
}

#2510
kempo чему равно Start_calculation и Finish_calc ?
#2511


kempo чему равно Start_calculation и Finish_calc ?


Start_calculation = 6;
Finish_calc = 9;
#2512

Должно работать. Ставьте Принты и отслеживайте ход выполнения программы по логу.

#2513


Должно работать. Ставьте Принты и отслеживайте ход выполнения программы по логу.


Увы но не работает....в журнале пишет ВВмин = 0...и больше ничего...ни ошибок, ни минимального значения...ничего
#2514



Должно работать. Ставьте Принты и отслеживайте ход выполнения программы по логу.


Увы но не работает....в журнале пишет ВВмин = 0...и больше ничего...ни ошибок, ни минимального значения...ничего
Принты вставляли? где?
Поясню перед IsNewBar() поставьте Print("Прошли тайм-фильтр");, после вставьте Print("Новый бар");, после вызова индюка вставьте Print("Значение ВВ = ", bb);, и т.д. Потом в "Экспертах" смотрите как отрабатывает, может Индюк не возвращает ничего...
#2515

В общем проставил везде принты, какая-то лажа получается:
1. время вообще не учитывается, в журнале действия происходят не по времени
2. он и должен каждый тик проверять???по идее он должен ведь однократно по закрытию свечи искать минимум
3. нашел ошибку с постановкой скобки
4. коммент он так и не выводит

void OnTick()
{
int curhour = Hour();
int curmin = Minute();
int curtime = curhour * 60 + curmin;

static double minBB = 0;
if (Hour() > Start_calculation && Hour() {
Print("время прошло");
if (IsNewBar())
{
Print("Новый бар");
double bb = iCustom(Symbol(), 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
Print("bb = " + bb);
if ( bb minBB = bb;
}

else
{
if ( minBB > 0 )
{
Comment("Min BB = " + minBB);
minBB = 0;
}
}
}
Print("Min BB = " + minBB);
}

#2516
kempo выложи журнал, а то не понятно ничего. индюк выдаёт что-то или нет?
#2517

Здравствуйте, может у меня простой вопрос, но
Как описать определение цвета индикатора HMA color? (Для меня там слишком много буферов)

#2518


kempo выложи журнал, а то не понятно ничего. индюк выдаёт что-то или нет?


2015.09.05 11:42:24 2015.02.02 09:41 dfgdf EURUSD,M5: Min BB = 0
2015.09.05 11:42:24 2015.02.02 09:41 dfgdf EURUSD,M5: Min BB = 0
2015.09.05 11:42:24 2015.02.02 09:41 dfgdf EURUSD,M5: Min BB = 0
2015.09.05 11:42:24 2015.02.02 09:41 dfgdf EURUSD,M5: Min BB = 0
выдает только это...меняется только время
#2519


2015.09.05 11:42:24 2015.02.02 09:41 dfgdf EURUSD,M5: Min BB = 0
выдает только это...меняется только время

Это Ваш последний принт, зачем он там? - на каждом тике спамит, потом в журнале найти ничего нельзя.
1. Надо определить работает-ли индюк. (принтом) если что - вытащить его из тайм-фильтра и проверить.
2. работа тайм-фильтра.
3. нахождение минимума в последнюю очередь.
Всё это делай последовательно, исключай ошибки по-шагово.


Как описать определение цвета индикатора HMA color? (Для меня там слишком много буферов)

Слишком много буферов не бывает - только 8. Посмотрите в МТ какой цвет Вам нужен и найдите номер буфера по цвету в шапке индюка. или сюда выкладывайте индюк.
#2520

для HMA color
Там два буфера красным, два зеленым цветом. Как написать что-то типа такого:
if (зелёный)
{
что-то сделать
}

if (красный)
{
что-то сделать
}

HMA_Color.mq48 скач.

Изменено 5 сентября, 2015 пользователем nik171978

#2521
nik171978
Когда Вы видите цветную линию(точку) значит в каком-то буфере есть значение = уровню цены в данной точке (для конкретного бара)
Значит будет выглядеть так:
1. double buf1 = iCustom(NULL, 0, "HMA Color", 20, 0, 3, TRUE, 2, 0, /*№буфера-*/ 1, /*№бара-*/ 1);
2. if ( buf1 > 0 ) { /*появилось значение (точка на экране) - выполняем команды*/ }
3. №буферов для зелёного 1 и 2, для красного - 3 и 4. жёлтый - 0. Какой буфер использовать - не знаю, пробуй.

ПС: имей в виду некоторые индюки рисуют - т.е. изменяют значения буферов на не 0-баре. В сове это выглядит так: открываешь сделку на 1-баре по значению индюка, потом смотришь на истории - сделки не могло быть, но это не так - сова не обманет...
#2522


nik171978
Когда Вы видите цветную линию(точку) значит в каком-то буфере есть значение = уровню цены в данной точке (для конкретного бара)
Значит будет выглядеть так:
1. double buf1 = iCustom(NULL, 0, "HMA Color", 20, 0, 3, TRUE, 2, 0, /*№буфера-*/ 1, /*№бара-*/ 1);
2. if ( buf1 > 0 ) { /*появилось значение (точка на экране) - выполняем команды*/ }
3. №буферов для зелёного 1 и 2, для красного - 3 и 4. жёлтый - 0. Какой буфер использовать - не знаю, пробуй.

ПС: имей в виду некоторые индюки рисуют - т.е. изменяют значения буферов на не 0-баре. В сове это выглядит так: открываешь сделку на 1-баре по значению индюка, потом смотришь на истории - сделки не могло быть, но это не так - сова не обманет...



Спасибо) Буду пробовать.
#2523

Я дико извеняюсь, но просмотрел 1 урок 5 раз. Ни нащёл где описана команда которая в " зависимости от заданной во внешних параметрах переменной X "( Это из дз) Полсмотрел курс 1.5 там сказано что команду Count мы с вами проходили. Полностью запутался.

#2524
Сахалинец в чём вопрос? то, что запутались это мы поняли...
#2525

Домашнее задание из урока 1 : "Напишите программу (советник), который в зависимости от заданной во внешних
параметрах переменной X, выведет информацию в виде сообщения " . В первом уроке нет описания как обратиться к внешней переменной. Например x = (Что то там) . А в советнике я выбираю чему равен х 1 или 2. Или я что то не так понял. Может курс урезанный т.к. скачивал со старонних источников с сайта не даёт ссылку.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025