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

Milord

Местный знаток
Как на счёт вот такого варианта?
if(MathAbs(High[1]-High[2])<10.5*Point)
Спасибо Ugar, ваш вариант более компактен!)
но неясно почему 10.5?
и чем будет отличаться логика работы вашего варианта, и вот такого:
if(MathAbs(High[1]-High[2])<=10*Point)
 

Ugar

Гуру форума
Спасибо Ugar, ваш вариант более компактен!)
но неясно почему 10.5?
и чем будет отличаться логика работы вашего варианта, и вот такого:
if(MathAbs(High[1]-High[2])<=10*Point)
Если так сильно нравится знак <=, тогда уж лучше вот так:
if(MathRound(MathAbs(High[1]-High[2])/Point)<=10)
 

ansol

Местный знаток
Если так сильно нравится знак <=, тогда уж лучше вот так:
if(MathRound(MathAbs(High[1]-High[2])/Point)<=10)

Я себе плохо представляю валютную пару, у которой разница цен может быть 10! :not-good:
Вот разница 10*Point , то бишь, 10 пунктов, вполне реальна, а как, скажем, у евробакса может быть разница 10, когда он сам "весит" 1.35? o_o
 

Ugar

Гуру форума
Я себе плохо представляю валютную пару, у которой разница цен может быть 10! :not-good:
Вот разница 10*Point , то бишь, 10 пунктов, вполне реальна, а как, скажем, у евробакса может быть разница 10, когда он сам "весит" 1.35? o_o
if(MathRound(MathAbs(High[1]-High[2])/Point)<=10)
Выделенная красным часть, это разница в целых пунктах.
 

matro3

Почетный гражданин
Почему-то не могу получить значения буферов FastTMALine.
PHP:
int nResult = iCustom(NULL, PERIOD_TF, "FastTMALine",
                                          TimeFrame,
                                          TMAPeriod,
                                          Price,
                                          ATRMultiplier,
                                          ATRPeriod,
                                          TrendThreshold,
                                          ShowCenterLine,
                                          alertsOn,
                                          alertsMessage,
                                          alertsSound,
                                          alertsEmail,
                                          MoveEndpointEveryTick,
                                          MaxBarsBack, buffer, pos);
Первые три дают единицу, последние три бредовое число.
Я где-то затупил так, что не могу увидеть где )
Помогите.
_http://rghost.ru/51583057
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Почему-то не могу получить значения буферов FastTMALine.
PHP:
int nResult = iCustom(NULL, PERIOD_TF, "FastTMALine",
                                          TimeFrame,
                                          TMAPeriod,
                                          Price,
                                          ATRMultiplier,
                                          ATRPeriod,
                                          TrendThreshold,
                                          ShowCenterLine,
                                          alertsOn,
                                          alertsMessage,
                                          alertsSound,
                                          alertsEmail,
                                          MoveEndpointEveryTick,
                                          MaxBarsBack, buffer, pos);
Первые три дают единицу, последние три бредовое число.
Я где-то затупил так, что не могу увидеть где )
Помогите.
_http://rghost.ru/51583057
Думаю, тут уместнее double nResult = iCustom();
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Я имею в виду вот так
PHP:
if((High[1]<=High[2]+10*Point)&&(High[1]>=High[2]-10*Point))
{
ваше действие;
}
High[1] находится в полосе +- 10п. от High[2].

Это будет самый, самый вариант. Никогда условие не будет выполнено.
Потому, что High[1] никогда не может и выше и ниже High[2] одновременно.*hi*
 

AlexeyVik

Программист mql4 mql5
Я имею в виду вот так
PHP:
if((High[1]<=High[2]+10*Point)&&(High[1]>=High[2]-10*Point))
{
ваше действие;
}
High[1] находится в полосе +- 10п. от High[2].
Ну так это-же совсем другое условие.
Это не просто заменить или на и
В том варианте было наоборот "не работать в диапазоне +-10"
 

qqmber

Почетный гражданин
Ну так это-же совсем другое условие.
Это не просто заменить или на и
В том варианте было наоборот "не работать в диапазоне +-10"

Ты, видать, начало пропустил.
Наш молчаливый друг спрашивает
Доброе время суток товарищи. Подскажите пожалуйста как закодить такое условие: появился новый дневной хай(мах), если этот новый хай в пределах 10пунктов от старого хая - то производится какое-то действие.

Милорд отвечает почти правильно, только И/ИЛИ путает.

неточный вопрос,выше или ниже на 10 пунктов???
если допускается вниз 10 пунктов и вверх 10 пунктов,то я бы написал так:

PHP:
if((High[1]<=High[2]+10*Point)||(High[1]>=High[2]-10*Point))
{
ваше действие;
}

Я говорю, поменять операции

Вместо || (или) надо && (и) использовать.

Получится правильно

PHP:
if((High[1]<=High[2]+10*Point)&&(High[1]>=High[2]-10*Point))
{
ваше действие;
}
High[1] находится в полосе +- 10п. от High[2].

Впрочем, это все равно мимо, поскольку вопрос был с картинкой, на которой нарисован M15 и пара максимумов часах в трех друг от друга. High[1] и High[2] тут не причем, очевидно.
 

AlexeyVik

Программист mql4 mql5
Ну так вот если-бы ты так расписал сразу, то и вопросов не возникло-бы ни у кого.*hi* Даже у Бекингема.:D
 

Milord

Местный знаток
... в момент открытия бара Open[0] = High[0] = Low[0] = Close[0] а потом они начинают расходиться...

тогда можно написать такой код для открытия ордера на начале бара:

PHP:
if(Open[0]==Close[0]&&High[0]==Low[0])
 {
  OrderSend(...);
 }

или можно наверно ограничиться таким кодом:

PHP:
if(Open[0]==Close[0])
 {
  OrderSend(...);
 }

вопрос ко всем программерам - будет ли такой код работать как надо, если нет, то подкорректируйте плиз его, или приведите свои варианты короткого куска кода открывающего ордер на Open[0]
 

AlexeyVik

Программист mql4 mql5
тогда можно написать такой код для открытия ордера на начале бара:

PHP:
if(Open[0]==Close[0]&&High[0]==Low[0])
 {
  OrderSend(...);
 }
или можно наверно ограничиться таким кодом:

PHP:
if(Open[0]==Close[0])
 {
  OrderSend(...);
 }
вопрос ко всем программерам - будет ли такой код работать как надо, если нет, то подкорректируйте плиз его, или приведите свои варианты короткого куска кода открывающего ордер на Open[0]
Это очень опасно. Дело в том, что если в МТ присутствует тяжёлый индикатор и он загрузит комп так что проскочит первый тик мимо советника, то на новом баре может уже не быть такого равенства. Это для первого варианта
Да и Open[0] останется неизменным, а вот Close[0] в любой момент и несколько раз подряд может быть равен цене открытия бара. А это для второго.
 
Последнее редактирование:

qqmber

Почетный гражданин
тогда можно написать такой код для открытия ордера на начале бара:
вопрос ко всем программерам - будет ли такой код работать как надо, если нет, то подкорректируйте плиз его, или приведите свои варианты короткого куска кода открывающего ордер на Open[0]
Есть много способов детектировать появление нового бара, и через Volume, и через Bars, через равенство OHLC, через TimeCurrent(), но из них один только один надежный - изменение Time[0]. Все остальное на быстром рынке может не сработать.
 
Верх