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

AlexeyVik

Программист mql4 mql5
Всем Привет!
у меня вопрос относительно функции OrdersTotal(), я верно понимаю что отсчет открытых ордеров идет от 0 , а не от 1, то есть при 1ном открытом ордере, функция OrdersTotal()=0, если это так, то при 10 открытых ордерах, она покажет 9???:facepalm:
отсюда понятна путаница в кодах разных программистов, когда они считают число открытых ордеров или выбирают ордера в цикле
fot(int i=0;i<OrdersTotal();i++) или лучше так?
fot(int i=0;i=OrdersTotal();i++)


еще вопрос - есть ли разница в работе советника если перебирать ордера наоборот, вот так:
fot(int i<OrdersTotal();i=0;i--)
или вот так:
for(int i=OrdersTotal()-1; i>=0; i--)

напишите плиз понятно где ошибки в каких вариантах циклов по выбору ордеров, и в чем именно ошибки, и есть ли разница в работе если ошибок нету, при прямом переборе и обратном???
ЗАРАНЕЕ СПАСИБО!
Функция OrdersTotal() возвращает количество рыночных и отложенных ордеров, но нумеруются они от 0 до OrdersTotal()-1
Направление перебора важно только для закрытия ВСЕХ ордеров. Причины описывать мне сейчас лениво, уже это обсуждалось неоднократно. В остальных случаях не важно.
Только любой вариант должен быть логически правильным:

1. fot(int i=0;i<OrdersTotal();i++) - Логичный вариант от индекса 0 пока индекс меньше количества ордеров. Работать будет безукоризненно, но в скрипте закрытия ВСЕХ ордеров может дать сбой. Из относительно большого количества ордеров пропустит парочку... Конкретно не угадаешь сколько будет пропущено. Но и здесь есть вариант исправления без изменения направления перебора. После закрытия ордера индекс уменьшать на 1.
2. fot(int i=0;i=OrdersTotal();i++) - Не логичный вариант... от индекса 0 пока индекс равен количеству ордеров.?????
3. fot(int i<OrdersTotal();i=0;i--) - Этот вариант тоже не логичен, от индекса меньше количества ордеров, пока индекс равен 0 ??????
4. for(int i=OrdersTotal()-1; i>=0; i--) - А вот этот вариант годен для любого случая.
Итого: Приемлемые, правильные варианты 1 и 4.
 

matro3

Почетный гражданин
Первый обект в массиве имеет индекс 0.
OrdersTotal() вернет 0 только если ордеров нет.
Т.е. пробежать с первого индекса массива по последний можно пройти так:
fot(int i = 0; i < OrdersTotal(); i++)
или так
fot(int i = OrdersTotal() -1; i >= 0; i--)

P.S. не успел ))
 

AlexeyVik

Программист mql4 mql5
Первый обект в массиве имеет индекс 0.
OrdersTotal() вернет 0 только если ордеров нет.
Т.е. пробежать с первого индекса массива по последний можно пройти так:
fot(int i = 0; i < OrdersTotal(); i++)
или так
fot(int i = OrdersTotal() -1; i >= 0; i--)

P.S. не успел ))
Вот один из примеров где тоже получается нелогичное условие цикла. Хотя я и сам не задумываясь, таким циклом частенько пользуюсь.
Если ордеров 0, то получается цикл от -1 пока индекс больше или равен 0
Тоесть такой цикл логично использовать исключительно для закрытия ордеров и только когда проверено наличие хотябы одного ордера.
 
Последнее редактирование:

volodymyr67

Гуру форума
Всем приет !

ЭТО НЕ В ТЕМУ
ПРОШУ ПОДПРАВИТЬ ОШИБКИ
 
Последнее редактирование:

Milord

Местный знаток
Еще вопросик по ошибкам в коде???

Всем привет!
хочу уточнить написание оператора return и его отличие от break, например в приведенных ниже примерах, ограничение времени работы советника,в чем будет разница в логике работы???

PHP:
if(Hour()<Start||Hour()>Stop)return;

if(Hour()<Start||Hour()>Stop)return(0);

if(Hour()<Start||Hour()>Stop)break;

ЗАРАНЕЕ СПАСИБО!
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Всем привет!
хочу уточнить написание оператора return и его отличие от break, например в приведенных ниже примерах, ограничение времени работы советника,в чем будет разница в логике работы???

PHP:
if(Hour()<Start||Hour()>Stop)return;

if(Hour()<Start||Hour()>Stop)return(0);

if(Hour()<Start||Hour()>Stop)break;
ЗАРАНЕЕ СПАСИБО!
Что-то мне показалось что ты абсолютно не читаешь справку. Там-же описано всё доходчиво. _http://docs.mql4.com/ru/basis/operators
Оператор return Прекращает выполнение текущей функции и возвращает управление вызвавшей программе
Оператор break Прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for

Где ты нашёл выход из условия оператором break я не представляю.
Так-же там написано
В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.
Это ответ на отличие между return и return(0). Всё зависит от типа функции.
 

Milord

Местный знаток
Что-то мне показалось что ты абсолютно не читаешь справку. Там-же описано всё доходчиво. _http://docs.mql4.com/ru/basis/operators
Оператор return Прекращает выполнение текущей функции и возвращает управление вызвавшей программе
Оператор break Прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for

Где ты нашёл выход из условия оператором break я не представляю.
Так-же там написано
В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.
Это ответ на отличие между return и return(0). Всё зависит от типа функции.

я читал справку, зачем оттуда копировать что там написано корявым академическим языком:facepalm:,
те кто писал справку похоже были партизанами в застенках гестапо!
,
и нормальным языком не смогли ее написать...она написана для тех кто и так знает язык MQL4 или С++, так если я знаю эти языки - зачем мне справка?????
а если не знаю - так и писать нужно было справку понятным и доходчивым языком...

P.S. ваш ответ не прибавил ясности не на сколько....
 
Последнее редактирование:

strannik-ps

VIP-участник
Всем привет!
хочу уточнить написание оператора return и его отличие от break, например в приведенных ниже примерах, ограничение времени работы советника,в чем будет разница в логике работы???

PHP:
if(Hour()<Start||Hour()>Stop)return;

if(Hour()<Start||Hour()>Stop)return(0);

if(Hour()<Start||Hour()>Stop)break;

ЗАРАНЕЕ СПАСИБО!
На деревенском это будет приблизительно так
return; - Глушит напрочь.
return(0); - Вырубает но перезапускается при следующем тике.(можно и без скобок прям как в С++)
break; - выход из цикла и перезапуск, лучше использовать если что то ходит по кругу посчитали отключили и так далее.
 

AlexeyVik

Программист mql4 mql5
я читал справку, зачем оттуда копировать что там написано корявым академическим языком:facepalm:,
те кто писал справку похоже были партизанами в застенках гестапо!
,
и нормальным языком не смогли ее написать...она написана для тех кто и так знает язык MQL4 или С++, так если я знаю эти языки - зачем мне справка?????
а если не знаю - так и писать нужно было справку понятным и доходчивым языком...

P.S. ваш ответ не прибавил ясности не на сколько....
Ну извиняйте... Просто у тебя примеры к вопросам абсолютно не подходят.
Код:
void F1()
{
if(Hour()<Start||Hour()>Stop) return; // так будет правильно.
}

int F2()
{
if(Hour()<Start||Hour()>Stop) return(0); // и так будет правильно.
}

double F3()
{
for(int i = 0; i < 6; i++)
{
if(Hour()<Start||Hour()>Stop || i == 3) break; // и это будет правильно но выполнение перейдёт на строку после цикла когда будет выполнено одно из условий.
}
int с = 60; // сначала переменной с присвоится значение 60
return(0); // и только здесь функция будет завершена.
}
Если в последнем примере вместо break написать return(0) то переменной с значение 60 присвоено не будет.
Так понятно?
 

Milord

Местный знаток
Ну извиняйте... Просто у тебя примеры к вопросам абсолютно не подходят....
Так понятно?

да, так намного яснее стало! спасибо!
я стараюсь не задавать тут вопросы, которые сам могу решить или прочитать ответ в справке...

P.S.помню как в школе не мог решить по математике те задачи, которые были сформулированы тупо и неясно, а не потому что я не знал как решать, просто в голове был вопрос
- "ЧЕ ОНИ ВАПЩЕ ОТ МЕНЯ ХОТЯТ, ТЕ КТО ЗАДАЧУ НАПИСАЛИ,МОЖЕТ ОНИ ИДИОТЫ САМИ?"

Аналогично справку к МТ4 писали такие супер пупер программисты, которые считают что все кто изучает MQL4, уже знают С++ как они сами...наивные люди, думать что все, кто начинает изучать язык MQL4 уже мастера в С++))))
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
да, так намного яснее стало! спасибо!
я стараюсь не задавать тут вопросы, которые сам могу решить или прочитать ответ в справке...

P.S.помню как в школе не мог решить по математике те задачи, которые были сформулированы тупо и неясно, а не потому что я не знал как решать, просто в голове был вопрос
- "ЧЕ ОНИ ВАПЩЕ ОТ МЕНЯ ХОТЯТ, ТЕ КТО ЗАДАЧУ НАПИСАЛИ,МОЖЕТ ОНИ ИДИОТЫ САМИ?"

Аналогично справку к МТ4 писали такие супер пупер программисты, которые считают что все кто изучает MQL4, уже знают С++ как они сами...наивные люди, думать что все, кто начинает изучать язык MQL4 уже мастера в С++))))
Не правильный у тебя подход к своим проблемам. Вместо того чтобы настойчиво пытаться понять, ты обвиняешь написателей...
Представь себе, я никогда не учил С++ или другие его варианты. И сейчас не знаю.
Так-же не знает его Андрей (Ugar). И это не мешает ни мне, ни ему понимать что пишут в документации.
 

Milord

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

у каждого своя правда, а ИСТИНА одна и непостижима!ИМХО!

кто то любит конфеты, а кто свиной хрящик....кто любит водку, кто кагор, кто пиво, а кто молоко и компот..))
 

jenzo

Местный знаток
Ребята подскажите, какой код отвечает за рисовку стрелки на предыдущей свече?
 

Oculyus

Прохожий
Уважаемые знатоки mql4, помогите пожалуйста девушке разобраться с советником. У меня есть готовый код, и я хотела бы туда добавить следующие условие, что при убыточной сделки в бай, советник дальше заходил только в селл и наоборот. А то иногда ловит восходящий тренд и все сделки в селл открывает и депо сливает((((

Я поняла, что это через функцию HistoryTotal() а как ее полноценно вписать и куда не понимаю(((

Тем более не понимаю как задать что бы после слива заходит ТОЛЬКО на противоположном сигнале.

В самом советнике код написан след образом
int Rules()
{
if (условия для селла) return(1);
if (условия для бая) return(2);
return(0);
}
А под цифрами 1 и 2 уже сам процесс открытия ордеров.

ПОЖАЛУЙСТА!!))
 

matro3

Почетный гражданин
Вычисляете тип последней сделки и ее профит. В зависимости от этого поднимаете флаг, при котором входите только в нужную вам сторону.
 

Milord

Местный знаток
Уважаемые знатоки mql4, помогите пожалуйста девушке разобраться с советником. У меня есть готовый код, и я хотела бы туда добавить следующие условие, что при убыточной сделки в бай, советник дальше заходил только в селл и наоборот. А то иногда ловит восходящий тренд и все сделки в селл открывает и депо сливает((((

Мадам, для тех кто в языке не силен, есть ветка по бесплатной доработке советников и индикаторов, вот тут:
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/77111-dorabotka-botov-sovetnikov-indikatorov-vol-2-a.html
 
Последнее редактирование:

Picasso

Местный знаток
Приветствую коллеги. Есть такой вопрос, как в самом простом подвальном индикаторе (любом) с одной линией, сделать визуализацию в виде стрелки, в том же подвале, если показания индюка выше отметки 0 - стрелка вверх или ниже - стрелка вниз.
Надеюсь на вашу помощь.

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

fsys.png

Посмотреть вложение MACD.mq4
 
Верх