Ent Опубликовано 20 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2021 11 минут назад, Евгений72 сказал: Доброго времени суток!!! Подскажите пожалуйста Вот счетчик и идентификатор ордеров //+----------------------------------------------------------------------------+ //| Счетчик ордеров | //+----------------------------------------------------------------------------+ int CountTrade() { int count = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } } return(count); } Далее эта функция всплывает в начале советника if (CountTrade() == 0) И далее идут условия для открытия первого ордера. Вопрос заключается в том что нужно написать в коде чтобы выполнялось условие "Если в терминале есть хоть один ордер, любого символа, любого типа. любого магика) то тогда ордер не открывать! Изменяете функцию на: //+----------------------------------------------------------------------------+ //| Счетчик ордеров | //+----------------------------------------------------------------------------+ int CountTrade() { int count = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { count++; } } return(count); } И в переменной count у вас будут все ордера независимо от мэджика, символа и типа. Изменено 20 сентября, 2021 пользователем Ent 1 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ar4i Опубликовано 20 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2021 Всем привет! Появилась задача как добавить в "Custom Moving Averages" функцию Price(в смысле PRICE_CLOSE, PRICE_OPEN, RICE_HIGH итд). Какие аналоги для зацепки есть? Сам написание индикаторов только начал постигать Custom Moving Averages.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 21 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2021 10 часов назад, Ar4i сказал: как добавить в "Custom Moving Averages" функцию Price вот был смысл переезжать? Price[] - это не функция, а массив значений. В индикаторах в OnCalcalate изначально подаются массивы значений OPEN, HIGH, LOW, CLOSE. Если использовать функцию МА самостоятельно, то нужно ей как-то передать значения, которые будут обрабатываться(рассчитываться среднее значение). Будет, наверное, проще, если озвучить конечную цель- что из чего нужно получить Изменено 21 сентября, 2021 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ar4i Опубликовано 21 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2021 Это и есть конечная цель на самом деле. Просто, наверное треть всех iCustom() индикаторов используют в своих расчетах так или иначе iMA(). Поэтому хотелось бы иметь полный его код для экспериментов. Кажется это многим могло бы быть интересным То есть если правильно я понял, то все таки надо написать некую функцию Price(), которая будет использовать массив Price[]. И по вставлять ее везде в код Custom Moving Averages.mq4 в место переменной close... Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 21 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2021 2 часа назад, Ar4i сказал: то все таки надо написать некую функцию Price(), которая будет использовать массив Price[]. В общем случае- да, массив Price[] нужно формировать самому. Это может быть не обязательно цены свечей, а, например, данные с другого индикатора. Если же идет речь о расчете свечных цен, то эти массивы уже есть готовые Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ar4i Опубликовано 21 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2021 1 час назад, usver73 сказал: эти массивы уже есть готовые А где их посмотреть скажите пожалуйста? Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 21 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2021 7 минут назад, Ar4i сказал: 1 час назад, usver73 сказал: эти массивы уже есть готовые А где их посмотреть скажите пожалуйста? close[]- цены закрытия и т.д. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ar4i Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 Есть такая функция, можно ли ее как то прикрутить? double Price(int shift) { //---- double res; //---- switch (PriceType) { case PRICE_OPEN: res=Open[shift]; break; case PRICE_HIGH: res=High[shift]; break; case PRICE_LOW: res=Low[shift]; break; case PRICE_MEDIAN: res=(High[shift]+Low[shift])/2.0; break; case PRICE_TYPICAL: res=(High[shift]+Low[shift]+Close[shift])/3.0; break; case PRICE_WEIGHTED: res=(High[shift]+Low[shift]+2*Close[shift])/4.0; break; default: res=Close[shift];break; } return(res); } Изменено 22 сентября, 2021 пользователем Ar4i Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 1 час назад, Ar4i сказал: Есть такая функция, можно ли ее как то прикрутить? Во первых, в функцию нужно передать PriceType. В таком виде выдаст ошибку при компиляции. Во вторых, в функцию нужно передать массив, в который будет скопированы значения цены, которые в последствии будут усредняться. Нужно снаружи объявить double Price[] и по ссылке её воткнуть в объявление функции. В третьих, в каждом case нужно писать ArrayCopy(), с помощью которой будет копироваться из источников (например, close[]) в получателя price[] набор значений цены. Писать день, пробуй самостоятельно. п.с. все таки не совсем понятна конечная цель. Если в качестве обучения, то ок. Если цель- спрятать индикатор в код советника, то тоже понятно. И лучше поискать такие примеры, они есть в сети. В остальных случаях индикатор будет работать эффективнее, даже самописный. Изменено 22 сентября, 2021 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 Доброго времени суток!!! Пишу код сеточного советника необходимо определять тикет минимального ордера и максимального ордера. Советник открывает ордера только в одну сторону пока не закроется сетка ордеров Buy или Sell. Прошу помощи в написании функций условно их назовём MaxOrderTicket(); MinOrderTicket(). Прикладываю как пример функцию Определение цены последнего ордера. Я на этом варианте не настаиваю может быть у Вас есть свое вешение. Спасибо за помощь. //+----------------------------------------------------------------------------+ //| Определение цены последнего ордера | //+----------------------------------------------------------------------------+ double FindLastOrderPrice(int otype) { int oldticket; double oldopenprice = 0; ticket = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } } return(oldopenprice); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 4 минуты назад, Евгений72 сказал: необходимо определять тикет минимального ордера и максимального ордера нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 5 минут назад, usver73 сказал: нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 12 минут назад, usver73 сказал: нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...) Просадку к ордеру привязывать не надо Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 12 минут назад, Евгений72 сказал: так Ваша функция выполняет половину поставленной задачи. Единственное, можно поправить: void FindLastOrderPrice(int otype) { int max_ticket=0; int min_ticket=INT_MAX; double oldopenprice = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderTicket() > max_ticket) max_ticket = OrderTicket(); if(OrderTicket() < min_ticket) min_ticket = OrderTicket(); } } } return; } Только нужно озаботиться передачей значений макс. мин. тикета вовне. Например, объявить их на глобальном уровне, а внутри функции сбрасывать в 0 и INT_MAX соответственно Изменено 22 сентября, 2021 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 8 минут назад, usver73 сказал: так Ваша функция выполняет половину поставленной задачи. Единственное, можно поправить: void FindLastOrderPrice(int otype) { int max_ticket=0; int min_ticket=INT_MAX; double oldopenprice = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderTicket() > max_ticket) max_ticket = OrderTicket(); if(OrderTicket() < min_ticket) min_ticket = OrderTicket(); } } } return; } Только нужно озаботиться передачей значений макс. мин. тикета вовне. Например, объявить их на глобальном уровне, а внутри функции сбрасывать в 0 и INT_MAX соответственно Если можно я ВАМ задам несколько вопросов Что такое INT_MAX Как можно определить профиты max_ticket и mшт_ticket Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 5 минут назад, Евгений72 сказал: Если можно я ВАМ задам несколько вопросов Как можно определить профиты max_ticket и min_ticket Эти max_ticket и min_ticket я хочу загнать вот в эту функцию OrderClose() if (OrderType() == OP_BUY) { if (!OrderClose(OrderTicket(), OrderLots(), Bid, slip)) Print("Не удалось закрыть ордера на покупку!"); } if (OrderType() == OP_SELL) { if (!OrderClose(OrderTicket(), OrderLots(), Ask, slip)) Print("Не удалось закрыть ордер на продажу!"); } Вопрос как вместо функции OrderTicket() прикрутить переменные max_ticket и min_ticket Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 19 минут назад, Евгений72 сказал: Что такое INT_MAX из справки: Максимальное значение, которое может быть представлено типом int 2147483647 можно просто 9 999 999, т.е. число, гарантированно бОльшее, чем возможный тикет 21 минуту назад, Евгений72 сказал: Как можно определить профиты max_ticket и mшт_ticket if(OrderTicket() > max_ticket) { max_ticket = OrderTicket(); max_ticket_profit = OrderProfit() + OrderComission() + OrderSwap(); // max_ticket_profit объявить на глоб. уровне и обнулить в начале функции } Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 12 минут назад, Евгений72 сказал: Вопрос как вместо функции OrderTicket() прикрутить переменные max_ticket и min_ticket bool CloseOrderTicket(int _ticket) { for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderTicket()== _ticket) { if(OrderClose(.........) ) return(true); else { Print("Не удалось закрыть ордер # ",_ticket, " Error ", GetLastError()); return(false); } } } return(false); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 3 минуты назад, usver73 сказал: bool CloseOrderTicket(int _ticket) { for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderTicket()== _ticket) { if(OrderClose(.........) ) return(true); else { Print("Не удалось закрыть ордер # ",_ticket, " Error ", GetLastError()); return(false); } } } return(false); } Это для BUY и SELL Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 Только что, Евгений72 сказал: Я хочу всхлипнуть одновременно max_ticket и mшт_ticket получится Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 5 минут назад, Евгений72 сказал: Это для BUY и SELL а какая разница- БАЙ или СЕЛЛ? Тикет он и в Африке тикет. Вы его по направлению отфильтровали выше, когда искали макс. мин. Одновременно не получится, все равно будет последовательно. Измените немного, передайте оба тикета, в а цикле будет if(OrderTicket()== max_ticket || OrderTicket()== min_ticket) Да, все таки до закрытия нужно определить направление ордера, чтобы в OrderClose() передать Аск или Бид... Самостоятельно нет желания написать? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ar4i Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 3 часа назад, usver73 сказал: Если в качестве обучения, то ок Да, уже стало интересно как минимум в качестве обучения Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 47 минут назад, usver73 сказал: из справки: Максимальное значение, которое может быть представлено типом int 2147483647 можно просто 9 999 999, т.е. число, гарантированно бОльшее, чем возможный тикет if(OrderTicket() > max_ticket) { max_ticket = OrderTicket(); max_ticket_profit = OrderProfit() + OrderComission() + OrderSwap(); // max_ticket_profit объявить на глоб. уровне и обнулить в начале функции } А для минимального ордера это работает только знак"<" Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 3 минуты назад, Евгений72 сказал: А для минимального ордера это работает только знак"<" Если это вопрос, то я его не понял Ссылка на сообщение Поделиться на другие сайты More sharing options...
Евгений72 Опубликовано 22 сентября, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2021 if(OrderTicket() < min_ticket) { min_ticket = OrderTicket(); min_ticket_profit = OrderProfit() + OrderComission() + OrderSwap(); // min_ticket_profit объявить на глоб. уровне и обнулить в начале функции } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти