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

volodymyr67

Гуру форума
Уважаемые програмисты !
Подскажите пожалоста есть ли такая функцыя которая обновляет индикатор , чтоб можно было прикрутить к индикатору и он себя сам постояно обновлял .
 

vadynik

Активный участник
Подскажите замучался уже, хочу открыть ордера по разным валютам, но срабатывают ордера только на продажу, почему так?

if((1==true)&&(2==true)&&(3==true)&&(4==true)&&(Ask>MA1)&&(Ask>MA2)&&(Volume[0]<15)&&(USDJPYKOLPOS()<=0)){
OrderSend("USDJPY",OP_BUY,Lots(),Ask,50,0,0,"USDJPY-MultiJPY",Magic,0,Blue);
OrderSend("GBPJPY",OP_BUY,Lots(),Ask,50,0,0,"GBPJPY-MultiJPY",Magic,0,Blue);
}

if((5==true)&&(6==true)&&(7==true)&&(7==true)&&(Bid<MA1)&&(Bid<MA2)&&(Volume[0]<15)&&(USDJPYKOLPOS()<=0)){
OrderSend("USDJPY",OP_SELL,Lots(),Bid,50,0,0,"USDJPY-MultiJPY",Magic,0,Red);
OrderSend("GBPJPY",OP_SELL,Lots(),Bid,50,0,0,"GBPJPY-MultiJPY",Magic,0,Red);
}
условия на покупку выполняются точно, но ордера не идут((

на продажу сигнал перевертыш,

в тестере не потестишь...
 

Milord

Местный знаток
Вопрос для профи???

в чем будет разница между кусками кода функционально?
PHP:
Expand Collapse Copy
for(i=0;i<array_size;i++)
  if(array[i]==0)
    break;
//--------------------------------
for(i=0;i<array_size;i++)
  if(array[i]==0)
    return;
//---------------------------------
for(i=0;i<array_size;i++)
  if(array[i]==0)
    return(0);

ответьте плиз подробно..
ЗАРАНЕЕ СПАСИБО!
 

AlexeyVik

Программист mql4 mql5
в чем будет разница между кусками кода функционально?
PHP:
Expand Collapse Copy
for(i=0;i<array_size;i++)
  if(array[i]==0)
    break;
//--------------------------------
for(i=0;i<array_size;i++)
  if(array[i]==0)
    return;
//---------------------------------
for(i=0;i<array_size;i++)
  if(array[i]==0)
    return(0);
ответьте плиз подробно..
ЗАРАНЕЕ СПАСИБО!
А справку почитать слабо?
Только вот примеры твои написаны с ошибкой. Оператор for() обязательно должен сопровождаться фигурными скобками {} тогда как оператор if() можно использовать и без {} если после условия есть только 1 оператор.
Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while или for. Управление передается оператору, следующему за заканчиваемым. Одно из назначений этого оператора - закончить выполнение цикла при присваивании некоторой переменной определенного значения.
Это означает, что работа функции продолжится если после цикла есть другие операторы.
Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Использование return(выражение); прекращает выполнение текущей функции с передачей результата. Выражение оператора заключается в круглые скобки и не должно содержать оператор присваивания.
Это означает, что оператор return прекращает выполнение функции не закончив её, если такое заложено в алгоритме. Применяется для досрочного выхода из функции, если например получен необходимый результат.
Оператор return можно использовать только в функциях типа void которые не возвращают результата. И даже можно совсем его опустить.
В функциях int, double, bool оператор return применять не допустимо, т.к. такие функции должны возвращать какое либо значение. В них обязательно использовать return(выражение).
 
Последнее редактирование:

Маруся2014

Заблокирован
Ребята подскажите!
У меня на индикаторе линия раскрашена в два цвета. Индикатор разложен на несколько таймфреймов. Есть звуковой сигнал смены цвета. Чтобы увидеть где произошла смена цвета по сигналу, - хотелось бы вывести на индикаторе где нибудь в уголке цифры, о количестве баров равных последней смене цвета. И в случае смены цвета обнуление баров и новый подсчет баров по цвету индикатора. Если я буду находить нулевой бар на одном из индикаторов обозначенный цифрой ноль, то буду точно знать где произошла смена цвета. Нужна сама функция. Значение я сама смогу вывести в уголке.
 
Последнее редактирование:

eevviill

Заблокирован
Ребята подскажите!
У меня на индикаторе линия раскрашена в два цвета. Индикатор разложен на несколько таймфреймов. Есть звуковой сигнал смены цвета. Чтобы увидеть где произошла смена цвета по сигналу, - хотелось бы вывести на индикаторе где нибудь в уголке цифры, о количестве баров равных последней смене цвета. И в случае смены цвета обнуление баров и новый подсчет баров по цвету индикатора. Если я буду находить нулевой бар на одном из индикаторов обозначенный цифрой ноль, то буду точно знать где произошла смена цвета.
Надо перебирать показания индикатора, там где он поменяет цвет.

PHP:
Expand Collapse Copy
int needed_bars_green;
for(int h=1;h<Bars-2;h++)
{
if(buf_green[h]=EMPTY_VALUE && buf_green[h-1]!=EMPTY_VALUE)
{
needed_bars=h;
break;
}
}
Alert(needed_bars_green);
 

AlexeyVik

Программист mql4 mql5
Лучше переделать всё.
В том месте где алерт, я бы поставил статическую или глобального уровня переменную datetime и считаешь iBarshift(, , время)
И эта переменная будет обновляться только при смене цвета, так-же как алерт.
 

Маруся2014

Заблокирован
Лучше переделать всё.
В том месте где алерт, я бы поставил статическую или глобального уровня переменную datetime и считаешь iBarshift(, , время)
И эта переменная будет обновляться только при смене цвета, так-же как алерт.
Что-же! - Поищу оптимальный вариант. Спасибо.
 

Маруся2014

Заблокирован
Надо перебирать показания индикатора, там где он поменяет цвет.
Как по вашему я правильно сделала?

PHP:
Expand Collapse Copy
 int needed_bars_green; 
for(int h=1;h<Bars-2;h++) 
{ 
if(a[h]==EMPTY_VALUE && a[h-1]!=EMPTY_VALUE) 
{ 
needed_bars_green=h; 
break; 
} 
} 

color  SIG_color=Maroon;
       
 if(a[0]==a[h]){
SIG_color=Lime;}
     
              string F=DoubleToStr(needed_bars_green,0); 
 ObjectCreate(NAME+"perl",OBJ_LABEL,WindowFind(NAME),0,0);
    ObjectSet(NAME+"perl",OBJPROP_XDISTANCE,10);
    ObjectSet(NAME+"perl",OBJPROP_YDISTANCE,10);
    ObjectSet(NAME+"perl",OBJPROP_CORNER,1);
ObjectSetText(NAME+"perl"," "+F+" ",15,"Arial",SIG_color);
 

eevviill

Заблокирован
Как по вашему я правильно сделала?

PHP:
Expand Collapse Copy
 int needed_bars_green; 
for(int h=1;h<Bars-2;h++) 
{ 
if(a[h]==EMPTY_VALUE && a[h-1]!=EMPTY_VALUE) 
{ 
needed_bars_green=h; 
break; 
} 
} 

color  SIG_color=Maroon;
       
 if(a[0]==a[h]){
SIG_color=Lime;}
     
              string F=DoubleToStr(needed_bars_green,0); 
 ObjectCreate(NAME+"perl",OBJ_LABEL,WindowFind(NAME),0,0);
    ObjectSet(NAME+"perl",OBJPROP_XDISTANCE,10);
    ObjectSet(NAME+"perl",OBJPROP_YDISTANCE,10);
    ObjectSet(NAME+"perl",OBJPROP_CORNER,1);
ObjectSetText(NAME+"perl"," "+F+" ",15,"Arial",SIG_color);
Впринцпе да.
 

Milord

Местный знаток
А справку почитать слабо?
Только вот примеры твои написаны с ошибкой. Оператор for() обязательно должен сопровождаться фигурными скобками {} тогда как оператор if() можно использовать и без {} если после условия есть только 1 оператор.
Это означает, что работа функции продолжится если после цикла есть другие операторы.
Это означает, что оператор return прекращает выполнение функции не закончив её, если такое заложено в алгоритме. Применяется для досрочного выхода из функции, если например получен необходимый результат.
Оператор return можно использовать только в функциях типа void которые не возвращают результата. И даже можно совсем его опустить.
В функциях int, double, bool оператор return применять не допустимо, т.к. такие функции должны возвращать какое либо значение. В них обязательно использовать return(выражение).
мне не лень читать справку, но в ней не всегда понятно написано и не доходчиво, ощущение, что писали партизаны попавшие к гестапо на допрос...к тому же много логических ошибок, и как по той справке писать нормальный код, например оператор for дан пример именно с круглыми скобками:
PHP:
Expand Collapse Copy
for(выражение1; выражение2; выражение3)
   оператор;
for(x=1;x<=7;x++) Print(MathPower(x,2));
в той же справке непонятно что такое void тип, потому что если навести курсор на слово void и нажать F1 то никакой справки не будет:facepalm:
а теперь представьте ученика в первом классе, который спрашивает у взрослых значения слов, те его отсылают к букварю, в котором нет ясного и доступного описания, и отсутствуют некоторые буквы вапще...:facepalm:
например я встретил в коде советника такую строку:
PHP:
Expand Collapse Copy
if (OrderType() <= OP_SELL
я понимаю строки в нормальном виде:
PHP:
Expand Collapse Copy
if (OrderType() == OP_SELL
if (OrderType() != OP_SELL
но как можно написать вода<воздуха:not-good::facepalm:
и главное какая логика у той строки???
можно встретить оператор if вапще в сногсшибательной форме, которой нет в справке:
PHP:
Expand Collapse Copy
if(FridayExit) а=10;
хотя в справке читаем:
PHP:
Expand Collapse Copy
if(x>l)
  {
   if(y==2) z=5;
  }
else        z=6;
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
мне не лень читать справку, но в ней не всегда понятно написано и не доходчиво, ощущение, что писали партизаны попавшие к гестапо на допрос...к тому же много логических ошибок, и как по той справке писать нормальный код, например оператор for дан пример именно с круглыми скобками:
PHP:
Expand Collapse Copy
for(выражение1; выражение2; выражение3)
   оператор;
for(x=1;x<=7;x++) Print(MathPower(x,2));
в той же справке непонятно что такое void тип, потому что если навести курсор на слово void и нажать F1 то никакой справки не будет:facepalm:
а теперь представьте ученика в первом классе, который спрашивает у взрослых значения слов, те его отсылают к букварю, в котором нет ясного и доступного описания, и отсутствуют некоторые буквы вапще...:facepalm:
например я встретил в коде советника такую строку:
PHP:
Expand Collapse Copy
if (OrderType() <= OP_SELL
я понимаю строки в нормальном виде:
PHP:
Expand Collapse Copy
if (OrderType() == OP_SELL
if (OrderType() != OP_SELL
но как можно написать вода<воздуха:not-good::facepalm:
и главное какая логика у той строки???
можно встретить оператор if вапще в сногсшибательной форме, которой нет в справке:
PHP:
Expand Collapse Copy
if(FridayExit) а=10;
хотя в справке читаем:
PHP:
Expand Collapse Copy
if(x>l)
  {
   if(y==2) z=5;
  }
else        z=6;
Да в общем-то я так отреагировал, наверное потому, что ты дискутировал с Андреем (Ugar) на такую тему, о которой я и думать боюсь. А тут задаёшь такие вопросы...
Я не очень уверен в необходимости фигурных скобок при операторе for() но однажды получил ошибку компиляции, поставил скобки, откомпилировал и больше никогда не экспериментировал и не хочу. Мне не слабо поставить скобки.
А вот что касается чтения справки, я с тобой согласится не могу. Я её сам читаю регулярно. И не только описание нужных операторов. А ты почитай раздел справки "Основы языка" узнаешь много нового. В том числе и об операторе return. Так-что без взаимных претензий.

Давай пойдём дальше.
OrderType() <= OP_SELL написано конечно странно, но объяснимо. OP_SELL = 1 меньше 1 только OP_BUY который = 0 Ну и выходит что запись if(OrderType() <= OP_SELL) равнозначна записи if(OrderType() == OP_SELL || OrderType() == OP_BUY) и соответственно абсолютная истина то, что вода ниже воздуха.
А вот запись if(OrderType() != OP_SELL) будет истиной если ордер Buy, BuyStop, BuyLimit, SellStop и SellLimit

Что касается твоего непонимания записи о которой ты говоришь "вапще..." так это абсолютно логичная запись. Применяется такое с переменными типа bool Вот переменная FridayExit имеет тип bool и соответственно запись if(FridayExit) читается как если переменная FridayExit = true а запись if(!FridayExit) читается если переменная FridayExit = false
 
Последнее редактирование:

Milord

Местный знаток
Да в общем-то я так отреагировал, наверное потому, что ты дискутировал с Андреем (Ugar) на такую тему, о которой я и думать боюсь.
не надо думать что чел одинаково хорошо во всем разбирается, такие люди уникумы, и если я что то знаю в одном месте, в другом могу ниче не знать и процесс обучения длится всю жизнь, и даже не одну....:facepalm:
спасибо за ответы и помощь!
никаких претензий у меня нет, все нормально!
относительно оператора return в разной форме, у меня ясности пока нет, потому что справка написана скупым языком,нет ясности ответа в ней...
return;
return(0);
return(x+12*y+a);
в справке вроде написано что форма return(0); возвращает 0, кому и куда неясно, Ugar писал так "В функциях int init(), int deinit(), int start() если выполняется return(0); это ничего и никуда не возвращает, и тем более не выплняется дальше. Это просто выход из соответствующей функции. Просто нечему возвращать."
так что пока у меня каша в голове на тему оператора return и его разной формы записи, еще в этой теме оператор break, он кажется дублирует некоторые формы return......
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
... еще в этой теме оператор break, он кажется дублирует некоторые формы return......
Это совершенно разные операторы.
break прекращает цикл, а return прекращает функцию. А чем отличается цикл от функции надеюсь ты сам понимаешь.
 
Верх