Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 926

 
Seric29:
Какой можно использовать оператор из которого можно вернуть 2 результата? Я использую оператор if для нахождения этого условия, но вернуть несколько результатов он не может в этом случае приходится 2 раза писать одно и то же условие поэтому я и пишу с таким вопросом. 

Не совсем понятно что за условия проверяются, но может вам подойдет switch. И при TRUE присваивайте нужные вам значения.

 
Существует ли функция для обмена значений двух переменных местами ?
 
pivomoe:
Существует ли функция для обмена значений двух переменных местами ?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.08.26 19:02

На английской части форума показали
// Обмен значениями между двумя числовыми переменными
#define SWAP(A, B) { A += B; B = A - B; A -= B; }

 
Artyom Trishkin:

Спасибо. Надо будет освоить эти дефины.

 
Здравствуйте! Почему у функции Bars() разные значения при вызове с индикатора и эксперта И КАК ДОБИТЬСЯ СООТВЕТСТВИЯ? 
 
Tango_X:
Здравствуйте! Почему у функции Bars() разные значения при вызове с индикатора и эксперта И КАК ДОБИТЬСЯ СООТВЕТСТВИЯ? 

Покажите код из советника и индикатора.

 
Alexey Viktorov:

Покажите код из советника и индикатора.

Просто вызов функции Bars(_Symbol,_Period)

 
Tango_X:

Просто вызов функции Bars(_Symbol,_Period)

А распечатку результата отдельно надо просить?

У меня разницы не бывает. Хотя в тестере такой вариант не исключён по причине доступности истории о которой я мало что знаю, только смутные воспоминания прочитанного когда-то. Ведь это получается общее количество доступных баров. Но если запрашивать от времени до времени, никакой разницы быть не может.

 
Alexey Viktorov:
Оператор if не возвращает никакого значения.

Для присвоения неким переменным значений в отдельной функции есть два варианта:

1. Переменные должны быть видны во всех частях программы. То-есть объявлены на уровне глобальных переменных (в начале кода).

2. Передавать переменные объявленные локально в пользовательскую функцию по ссылке. То-есть перед именем переменной поставить &

Имеется в виду если условие истинно то сделать 2 одинаковых действия например

        if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);
}

Переменные я объявил и ничего выполняет только либо это действие Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; либо это действие Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP]; как сделать так чтобы выполняло 2 одинаковых действия проводило и верхний и нижний уровни по условию. Может кто подскажет как это короче записать?

 
Konstantin Nikitin:

Не совсем понятно что за условия проверяются, но может вам подойдет switch. И при TRUE присваивайте нужные вам значения.

 if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);

Нужно выполнить Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; и Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];. 

Причина обращения: