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

Александр К

Интересующийся
Странности оператора IF
if (func1) Func2;
else
if (func3) Func4;
else
if (func5) Func6;
Почему то срабатывают все строки хотя условий нет. Почему?
 

qqmber

Почетный гражданин
Странности оператора IF
if (func1) Func2;
else
if (func3) Func4;
else
if (func5) Func6;
Почему то срабатывают все строки хотя условий нет. Почему?

Если все Func* исполняются, однозначно func* == true, все три. Покажите реальный код, возможно у вас {} скобки неправильно расставлены.
 

Александр К

Интересующийся
if (R1>=R23 && OrderStopLoss()<R33)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_2*Point),OrderTakeProfit(),OrderExpiration());}
else
if (R1>=R22 && OrderStopLoss()<R32)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_1*Point),OrderTakeProfit(),OrderExpiration());}

else
if (R1>=R21 && OrderStopLoss()<R31)
{
Print ("R1= ",R1," R21= ",R21," OrderStopLoss()= ",DoubleToStr(OrderStopLoss(),5)," R31= ",DoubleToStr(R31,5));
OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + 1*Point),OrderTakeProfit(),OrderExpiration());}
}
Я вводил печать условий, они не совпадают. Это перевод СЛ на предыдущий уровень, при достижении текущего уровня (трал по Баришпольцу)
 
Последнее редактирование:

alexshell

Элитный участник
if (R1>=R23 && OrderStopLoss()<R33)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_2*Point),OrderTakeProfit(),OrderExpiration());}
else
if (R1>=R22 && OrderStopLoss()<R32)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_1*Point),OrderTakeProfit(),OrderExpiration());}

else
if (R1>=R21 && OrderStopLoss()<R31)
{
Print ("R1= ",R1," R21= ",R21," OrderStopLoss()= ",DoubleToStr(OrderStopLoss(),5)," R31= ",DoubleToStr(R31,5));
OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + 1*Point),OrderTakeProfit(),OrderExpiration());}
}
Я вводил печать условий, они не совпадают. Это перевод СЛ на предыдущий уровень, при достижении текущего уровня (трал по Баришпольцу)
уберите else они там не нужны.
 

AlexeyVik

Программист mql4 mql5
уберите else они там не нужны.
В этом ты очень не прав.
if (R1>=R23 && OrderStopLoss()<R33)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_2*Point),OrderTakeProfit(),OrderExpiration());}
else
if (R1>=R22 && OrderStopLoss()<R32)
{OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + pf_level_1*Point),OrderTakeProfit(),OrderExpiration());}

else
if (R1>=R21 && OrderStopLoss()<R31)
{
Print ("R1= ",R1," R21= ",R21," OrderStopLoss()= ",DoubleToStr(OrderStopLoss(),5)," R31= ",DoubleToStr(R31,5));
OrderModify(ticket,OrderOpenPrice(),(OrderOpenPrice() + 1*Point),OrderTakeProfit(),OrderExpiration());}
}
Я вводил печать условий, они не совпадают. Это перевод СЛ на предыдущий уровень, при достижении текущего уровня (трал по Баришпольцу)
Александр, дополни все if() строкой Print() и покажи распечатку.
Или обрати внимание, на вероятность или очерёдность возможности выполнения условия для OrderModify()
Вероятно происходит выполнение не на одном тике. То-есть сначала выполнено первое условие и OrderModify(), потом на следующем тике вторая часть условия уже не пускает... а else пожалуйста... условие true
Посмотри не надо-ли дополнить
else
if (R1>=R22 && OrderStopLoss()<R32 && OrderStopLoss()<R33)
и соответственно следующее else if()
 

alexshell

Элитный участник
уберите else они там не нужны.

В этом ты очень не прав.

Неправ в чём? Что в операторе if() можно не использовать else? Или что условия неправильно понял? Судя по ответу спасибо всё таки у Александра К заработало всё как надо.
 

gold_traid

Новичок форума
Подскажите Пожалуйста

Доброго времени суток подскажите пожалуйста вот есть индикатор я его в код советника вставляю вот так
Код:
Expand Collapse Copy
double Buy1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Buy1_2 = iCustom(NULL, 0, "100pipsdayscalper5~", 1, Current + 36);

double Sell1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Sell1_2 = iCustom(NULL, 0, "100pipsdailyscalper5~", 1, Current + 36);
может не правильное сравнение?работает криво или праметры не верные задаю?подскажите пожалуйста
и еще в тестере постоянно вылазит 2013.03.31 22:38:33 2013.02.12 11:08 Cannot open file 'C:\Program Files (x86)\InstaTrader\experts\indicators\100pipsdayscalper5~.ex4' on the EURUSD,M5 хотя он там есть
 

Вложения

Последнее редактирование:

Ugar

Гуру форума
Доброго времени суток подскажите пожалуйста вот есть индикатор я его в код советника вставляю вот так
Код:
Expand Collapse Copy
double Buy1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Buy1_2 = iCustom(NULL, 0, "100pipsdayscalper5~", 1, Current + 36);

double Sell1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Sell1_2 = iCustom(NULL, 0, "100pipsdailyscalper5~", 1, Current + 36);
может не правильное сравнение?работает криво или праметры не верные задаю?подскажите пожалуйста
и еще в тестере постоянно вылазит 2013.03.31 22:38:33 2013.02.12 11:08 Cannot open file 'C:\Program Files (x86)\InstaTrader\experts\indicators\100pipsdayscalper5~.ex4' on the EURUSD,M5 хотя он там есть
1. убери терминал из папки C:\Program Files (x86). Установи в специально созданную папку, например c:\Terminals
2. О каком сравнении пишешь. Здесь привёл только вызов индикатора. При том дважды вызываешь одно и то же. Это даёт лишнюю нагрузку.
3. Зачем так далеко в историю глядишь? Current + 36
4. Ошибка в имени файла в второй строке.
 
Последнее редактирование:

gold_traid

Новичок форума
1. убери терминал из папки C:\Program Files (x86). Установи в специально созданную папку, например c:\Terminals
2. О каком сравнении пишешь. Здесь привёл только вызов индикатора. При том дважды вызываешь одно и то же. Это даёт лишнюю нагрузку.
3. Зачем так далеко в историю глядишь? Current + 36
*if (Buy1_1 < Buy1_2) Order = SIGNAL_BUY;
*if (Sell1_1 > Sell1_2) Order = SIGNAL_SELL; вот это сранение
ну должно быть так синий индикатор и цена выше него покупаем красный наоборот
 
Последнее редактирование:

Ugar

Гуру форума
*if (Buy1_1 < Buy1_2) Order = SIGNAL_BUY;
*if (Sell1_1 > Sell1_2) Order = SIGNAL_SELL; вот это сранение
ну должно быть так синий индикатор и цена выше него покупаем красный наоборот
1. Прежде чем использовать индикатор надо разобраться в буферах. Какие именно тебе нужны. Например, в это индикаторе 6 буферов.
Ты вызываешь 0 и 1 буферы на Current + 36 баре.
А ты уверен что данные которые тебе нужны находятся в этих буферах?
2. По твоему описанию индикатор должен сравниваться с ценой, а в коде сравниваешь один буфер с другим.
 

gold_traid

Новичок форума
1. Прежде чем использовать индикатор надо разобраться в буферах. Какие именно тебе нужны. Например, в это индикаторе 6 буферов.
Ты вызываешь 0 и 1 буферы на Current + 36 баре.
А ты уверен что данные которые тебе нужны находятся в этих буферах?
2. По твоему описанию индикатор должен сравниваться с ценой, а в коде сравниваешь один буфер с другим.
буфера проверял 0 синий 1 красный не понятно как задать те параметры которые вылазят в алерте цена и стоп что по ним ставились
 

gold_traid

Новичок форума
буфера проверял 0 синий 1 красный не понятно как задать те параметры которые вылазят в алерте цена и стоп что по ним ставились
совтник должен работь вот по этим сигналам
if (ad_24 != 0.0) ls_48 = " at price " + DoubleToStr(ad_24, 4);
else ls_48 = "";
if (ad_8 != 0.0) ls_40 = ", TakeProfit on " + DoubleToStr(ad_8, 4);
 

AlexeyVik

Программист mql4 mql5
Неправ в чём? Что в операторе if() можно не использовать else? Или что условия неправильно понял? Судя по ответу спасибо всё таки у Александра К заработало всё как надо.
Не прав в том, что else там не нужны. Такой подход к решению вопроса похож на "попал - не попал"
Конечно else можно не использовать, а иногда, при неправильном их использовании, они даже приводят к неправильной работе кода. Но чаще всего использование else предотвращает от бесполезных проверок других условий и сокращает время исполнения кода.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Доброго времени суток подскажите пожалуйста вот есть индикатор я его в код советника вставляю вот так
Код:
Expand Collapse Copy
double Buy1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Buy1_2 = iCustom(NULL, 0, "[B][COLOR=Red]100pipsdayscalper5[/COLOR][/B]~", 1, Current + 36);

double Sell1_1 = iCustom(NULL, 0, "100pipsdailyscalper5~", 0, Current + 36);
double Sell1_2 = iCustom(NULL, 0, "100pipsdailyscalper5~", 1, Current + 36);
может не правильное сравнение?работает криво или праметры не верные задаю?подскажите пожалуйста
и еще в тестере постоянно вылазит 2013.03.31 22:38:33 2013.02.12 11:08 Cannot open file 'C:\Program Files (x86)\InstaTrader\experts\indicators\100pipsdayscalper5~.ex4' on the EURUSD,M5 хотя он там есть
А грамматическую ошибку не смог найти??? Даже несоответствие длины двух одинаковых строк не заметил???
 

smartmans

Активный участник
Приветствую.
Есть индикатор X, обновляется только при смене таймфрейма или при перезапуске терминала.
Подскажите, что нужно вставить, чтобы обновлялся (перестраивался) в необходимое время терминала, скажем 00:00?
То есть не каждый бар/тик, а только в назначенное время.
 

svitanak

Почетный гражданин
здравствуйте уважаемые программисты. есть такой вопрос. может кто подскажет как приписать мысль в советнике или покажет советник который выполняет такую функцию -
- по сигналу индикатора открывается ордер и если он в минусе при противоположном сигнале, он не закрывается, а при следующем сигнале открывается увеличенный. типа мартина, но только не через количество пунктов, а при следующем сигнале индикатора в том же направлении, что и минусовой
- надо чтобы сова расчитывала ближние прибыльные ордера и закрывала только те что при противоположном сигнале будут в общем в плюсе.
пример - селл 1 лот , бай закрывается в + и открывается новый селл 1*2=2лота, снова селл в минусе и открывается новый бай, который снова в плюсе и снова открывается селл 1*3=3лота. 2 последних ордера (один +20пп второй -10пп) в сумме дают +10. надо прописать чтобы закрывались только они потому что с первым лотом(-30пп) будет общий минус.

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

hoz

Активный участник
здравствуйте уважаемые программисты. есть такой вопрос. может кто подскажет как приписать мысль в советнике или покажет советник который выполняет такую функцию -
- по сигналу индикатора открывается ордер и если он в минусе при противоположном сигнале, он не закрывается, а при следующем сигнале открывается увеличенный. типа мартина, но только не через количество пунктов, а при следующем сигнале индикатора в том же направлении, что и минусовой
- надо чтобы сова расчитывала ближние прибыльные ордера и закрывала только те что при противоположном сигнале будут в общем в плюсе.
пример - селл 1 лот , бай закрывается в + и открывается новый селл 1*2=2лота, снова селл в минусе и открывается новый бай, который снова в плюсе и снова открывается селл 1*3=3лота. 2 последних ордера (один +20пп второй -10пп) в сумме дают +10. надо прописать чтобы закрывались только они потому что с первым лотом(-30пп) будет общий минус.

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

1. По сигналу индикатора открываешь ордер.
2. Мониторишь посредством выборки ордеров в режиме MODE_HISTORY профитность ордера предыдущего, если он достиг убытка заданного, то...
3. Открываешь ордер по следующему сигналу.

Да и вообще ты тут не вопрос задал, а чуть ли ни ТЗ для написания эксперта. С такой просьбой тебе в другую ветку нужно..
 

Алекc1234

Местный житель
Привет всем. Подскажите, как написать - "если ордер закрыт и профит в плюсе, то после этого закрытые в минус ордера......." Начало и конец мне ясны if(OrderClose() > 0 && OrderProfit() > 0) вот тут нужно вписать - после этого - и дальше тоже понятно if(OrderClose() > 0 && OrderProfit() < 0)
 

Алекc1234

Местный житель
Привет всем. Подскажите, как написать - "если ордер закрыт и профит в плюсе, то после этого закрытые в минус ордера......." Начало и конец мне ясны if(OrderClose() > 0 && OrderProfit() > 0) вот тут нужно вписать - после этого - и дальше тоже понятно if(OrderClose() > 0 && OrderProfit() < 0)

Никто не ответил. Видать, слишком сложно написать такое...
 
Верх