Ugar68 372 Share Posted April 14, 2020 (edited) В MQL4 пришло много интересного из MQL5. Например можно использовать перечисления, что позволит в настройках удобно выбирать варианты значений. Кнопочки и окошки редактирования прямо на графике позволят удобнее управлять программой. Удобнее работать с файлами. Раньше всё это нельзя было сделать в MQL4, если сильно надо, приходилось выходить за пределы языка с помощью dll. Но прибыль приносит торговая система, а все эти навороты для красоты и удобства. Так что, имея навыки программирования на старом языке, можно написать рабочий советник, а навыки нового языка позволят его сделать ещё и удобнее. Edited April 14, 2020 by Ugar68 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 4, 2020 Всем привет! Пытаюсь прикрутить к (любому)индикатору проверку на счет! bool VerifityToSchet() { if(AccountNumber() != account) { Print("На данном счете индикатор работать не будет, вы его приобрели незаконным путем!!!"); }else { Print("На данном счете индикатор авторизован"); } return(false); } естественно включаю его в init() и в start(), но при перезапуске терминала, он ругается на то что счет недействителен! Что не так делаю? Print((string)AccountNumber()+" = "+(string)account); при перезапуске терминала, в консоль AccountNumber() приходит 0, но сам терминал загружается под счетом и работает Quote Link to post Share on other sites
Ugar68 372 Share Posted December 4, 2020 Что бы получить номер счёта, нужно терминалу подключиться к счёту. Это происходит не сразу, а с задержкой. Пока не подключился функция возвращающая номер счёта будет возвращать 0. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 4, 2020 (edited) Хорошо! Исправил! Работает! А вот еще актуальный вопрос: На индикаторе стоит проверка на счет! Он стоит и работает в терминале, но в определенный момент пользователь вручную меняет счет, по правилам проверки индикатор должен возразить, что счет не тот, но он ничего не делает и может продолжать работать пока не изменить его настройки, даже после перезагрузки терминала! Как с этим бороться? Edited December 4, 2020 by sviter Quote Link to post Share on other sites
Ugar68 372 Share Posted December 5, 2020 (edited) В каком обработчике событий вызывается функция проверки номера счёта? Edited December 5, 2020 by Ugar68 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 5, 2020 (edited) 3 часа назад, Ugar68 сказал: В каком обработчике событий вызывается функция проверки номера счёта? там же! OnStart и OnInit!!! Заметил что, это только с индикаторами так, а с советниками все работает! Edited December 5, 2020 by sviter Quote Link to post Share on other sites
Ugar68 372 Share Posted December 5, 2020 В индикаторах не выполняется переинициализация при смене счёта. По этому выполнять проверку номера счёта в OnInit бесполезно. Функция OnStart предназначена для скриптов, для индикаторов OnCalculate, вот там и стоит выполнять все вычисления и проверку номера счёта в том числе. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 5, 2020 7 минут назад, Ugar68 сказал: В индикаторах не выполняется переинициализация при смене счёта. По этому выполнять проверку номера счёта в OnInit бесполезно. Функция OnStart предназначена для скриптов, для индикаторов OnCalculate, вот там и стоит выполнять все вычисления и проверку номера счёта в том числе. Хорошо! Попробую! А какие параметры выставлять в int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) унего же много параметров.... все по нулям? Quote Link to post Share on other sites
sviter 0 Share Posted December 5, 2020 (edited) Сделал так! не работает... datetime time[]; double close[],low[],high[],open[]; int spread[]; long tick_volume[], volume[]; OnCalculate(0, 0, time, open, high, low, close, tick_volume,volume, spread); естественно положил это в OnTimer() Edited December 5, 2020 by sviter Quote Link to post Share on other sites
Ugar68 372 Share Posted December 5, 2020 (edited) Не надо задавать аргументы обработчику событий. Наоборот, внутри обработчика можно использовать эти массивы. В них данные истории по текущему символу и таймфрейму. int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- Print("Номер счёта ",AccountNumber()); //--- return value of prev_calculated for next call return(rates_total); } Edited December 5, 2020 by Ugar68 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 5, 2020 14 минут назад, Ugar68 сказал: Не надо задавать аргументы обработчику событий. Наоборот, внутри обработчика можно использовать эти массивы. В них данные истории по текущему символу и таймфрейму. int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- Print("Номер счёта ",AccountNumber()); //--- return value of prev_calculated for next call return(rates_total); } если смотреть по Print("Номер счёта ",AccountNumber()); то счет меняется сразу, но ничего не происходит! Quote Link to post Share on other sites
Ugar68 372 Share Posted December 5, 2020 Как это не происходить? В обработчике OnCalculate только строчка печати в лог номера счёта, что он и выполняет. Если надо что бы выполнял что то ещё, то надо написать код этого. Например можно вызвать функцию проверки номера счёта, а если он правильный, выполнить код вычисления индикатора, для этого и предназначена функция OnCalculate. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted December 5, 2020 (edited) 25 минут назад, Ugar68 сказал: Как это не происходить? В обработчике OnCalculate только строчка печати в лог номера счёта, что он и выполняет. Если надо что бы выполнял что то ещё, то надо написать код этого. Например можно вызвать функцию проверки номера счёта, а если он правильный, выполнить код вычисления индикатора, для этого и предназначена функция OnCalculate. OnCalculate Вызывается и Print в нем тоже! Я добавил в OnCalculate проверку на счет, но при ручной смене счета в Print приходит новый счет, а проверка не срабатывает! bool VerifityToSchet() { Print((string)AccountNumber()+" = "+(string)account); if(AccountNumber() != account) { Alert("На данном счете индикатор работать не будет, вы его преобрели незаконным путем!!!"); Comment(""); Print("На данном счете индикатор работать не будет, вы его преобрели незаконным путем!!!"); }else { Print("На данном счете индикатор авторизован!"); } return(false); } и в проверке в Print приходит: новый счет = указанный счет Print((string)AccountNumber()+" = "+(string)account); Edited December 5, 2020 by sviter Quote Link to post Share on other sites
Ugar68 372 Share Posted December 5, 2020 Я не вижу как Вы выполняете проверку. Покажите весь код. Так же мне не понятна идея Вашей функции проверки. Что она должна возвращать, почему она всегда возвращает false или только сообщать о правильном или неправильном счёте? Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
tyro 151 Share Posted February 24, 2021 подскажите пожалуйста, каким образом советник для МТ5 может получить данные о прибыли за день, неделю и месяц чтобы потом вывести это на его экран, например как на скрине? Для этого есть специальные функции или нужно самому записывать значение на начало дня, недели, месяца, в каком-нибудь файле? Quote Link to post Share on other sites
Ugar68 372 Share Posted February 25, 2021 9 часов назад, tyro сказал: подскажите пожалуйста, каким образом советник для МТ5 может получить данные о прибыли за день, неделю и месяц чтобы потом вывести это на его экран, например как на скрине? Для этого есть специальные функции или нужно самому записывать значение на начало дня, недели, месяца, в каком-нибудь файле? Сначала надо запросить историю за нужный промежуток времени HistorySerlect. Узнать количество сделок в истории HistoryDealsTotal. В цикле выбирать сделки HistoryDealGetTicket. Получать прибыль сделок HistoryDealGetDouble и суммировать их в переменную. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
tyro 151 Share Posted February 25, 2021 1 час назад, Ugar68 сказал: Сначала надо запросить историю за нужный промежуток времени HistorySerlect. Узнать количество сделок в истории HistoryDealsTotal. В цикле выбирать сделки HistoryDealGetTicket. Получать прибыль сделок HistoryDealGetDouble и суммировать их в переменную. спасибо за обстоятельный ответ ) Quote Link to post Share on other sites
sable57 92 Share Posted April 12, 2021 Вот простенький скрипт: //+------------------------------------------------------------------+ //| #s Test iTime.mq4 | //+------------------------------------------------------------------+ #property strict string ArrFI[]={"EURUSD","GBPUSD","USDCHF","USDJPY"}, FI, ArrTS[]={"M 1","M 5","M15","M30","H 1","H 4","D 1"}; int ArrTF[]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1}, TF, fi,tf, qFI=ArraySize(ArrFI),qTF=ArraySize(ArrTF), DG; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void start() { for(fi=0;fi<qFI;fi++) {FI=ArrFI[fi]; DG=(int)MarketInfo(FI,MODE_DIGITS); for(tf=0;tf<qTF;tf++){TF=ArrTF[tf]; Print(ArrTS[tf]," Curr:" , TimeCurrent()," Bar:",iTime(FI,TF,0), " Open:" , DoubleToStr(iOpen (FI,TF,0),DG), " Close:", DoubleToStr(iClose(FI,TF,0),DG) ); } Print(FI); } }//end of start //+------------------------------------------------------------------+ Запускаю его 1-ый раз и получаю, мягко говоря, ошибки. Правильнее сказать, полную ерунду - в одной строке ошибку выделил, остальные подобны ей. Сразу же запускаю во 2-ой раз и получаю достаточно верный результат, хотя на PERIOD_M1 все же есть отклонение. Если это моя беда, то пережить можно, но если проблемы с языком, то как можно рассчитывать на правильную автоматическую торговлю? For FX.docx Quote "Призрачно все в этом мире бушующем." Link to post Share on other sites
Pirojoque Project 3,173 Share Posted April 14, 2021 12.04.2021 в 09:46, sable57 сказал: Запускаю его 1-ый раз и получаю, мягко говоря, ошибки. Правильнее сказать, полную ерунду - в одной строке ошибку выделил, остальные подобны ей. Это не ошибки. Это особенность подгрузки данных на графиках. Пока график не активен (не открыт) и к нему не обращаются, МТ не обновляет массивы данных (цены, время бара, спред). Как только запустили первый раз, обратившись к данным графиков, мы заставляем этим МТ подгрузить данные, но распечатываются в Print ещё старые данные (на подгрузку нужно время, к тому же МТ делает это в своём внутреннем потоке, не завязанном на исполнение скрипта). Второй запуск уже показывает обновлённые в прошлый раз массивы данных. М1, в силу своей скорости накопления данных, успевает между запусками немного устареть. 1 Quote Link to post Share on other sites
Pirojoque Project 3,173 Share Posted April 14, 2021 12.04.2021 в 09:46, sable57 сказал: Если это моя беда, то пережить можно, но если проблемы с языком, то как можно рассчитывать на правильную автоматическую торговлю? Не надо переживать, нужно просто изучить особенности используемого инструмента (МТ) и учитывать их в своей работе с ним. В вашем случае нужно лишь дёргать интересующие данные, вынуждая МТ обновлять их, по времени баров проверять их актуальность (текущее время – время бара < количество секунд в одном баре искомого тайм-фрейма). Если данные устаревшие, подождать и перепроверить позже. И так до полной подгрузки, когда все проверки данных пройдут успешно. В общем, это не беда 1 Quote Link to post Share on other sites
sviter 0 Share Posted April 16, 2021 Всем привет! Вопрос вот какой: Делаю сеточника с мартином, но не по очереди, а общую(открываются все ордера и сетки по мере сигналов, а не по очереди)! Столкнулась с проблемой....когда срабатывает один ордер или его сетка, то все отрабатывает отлично, а вот когда открывается ордер или его сетка и потом в это же время(или позже) открывается другой ордер и его сетка, то мартин начинает продолжать первую сетку! В чем может быть проблема? Quote Link to post Share on other sites
sable57 92 Share Posted April 17, 2021 14.04.2021 в 12:36, Pirojoque Project сказал: Не надо переживать, нужно просто изучить особенности используемого инструмента (МТ) и учитывать их в своей работе с ним. .... В общем, это не беда Спасибо за разъяснение. Это в самом деле не беда - просто запускать предварительно что-л, что "подразогреет" МТ. Quote "Призрачно все в этом мире бушующем." Link to post Share on other sites
Ugar68 372 Share Posted April 17, 2021 14 часов назад, sviter сказал: Всем привет! Вопрос вот какой: Делаю сеточника с мартином, но не по очереди, а общую(открываются все ордера и сетки по мере сигналов, а не по очереди)! Столкнулась с проблемой....когда срабатывает один ордер или его сетка, то все отрабатывает отлично, а вот когда открывается ордер или его сетка и потом в это же время(или позже) открывается другой ордер и его сетка, то мартин начинает продолжать первую сетку! В чем может быть проблема? Проблема в сеточнике, сетке и мартине. Это сленговые словечки не имеют чёткого общепринятого определения. Каждый трейдер понимает их по своему. Значит разновидностей сеток и мартинов может быть столько, сколько трейдеров, практически бесконечное количество. Для начала стоит чётко определить как это должно работать шаг за шагом, продумав все возможные варианты ситуаций и действий советника в них. Это уже 80% дела. Если так проще, можно отказаться от неопределённых сленгов и оперировать отдельными ордерами. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted April 20, 2021 Всем привет! Делаю сову на кастомном индикаторе, и появились проблемы! Надо, что бы был сигнал(когда он есть) только на первой свече и все (пример: Buy первая свеча по сигналу, Sell первая свеча по сигналу). А он открывает с первой свечи и продолжает открывать на каждой! Скажите может есть какая нибудь блокировка? Quote Link to post Share on other sites
Ugar68 372 Share Posted April 22, 2021 21.04.2021 в 00:34, sviter сказал: Всем привет! Делаю сову на кастомном индикаторе, и появились проблемы! Надо, что бы был сигнал(когда он есть) только на первой свече и все (пример: Buy первая свеча по сигналу, Sell первая свеча по сигналу). А он открывает с первой свечи и продолжает открывать на каждой! Скажите может есть какая нибудь блокировка? Нет никаких блокировок. Надо продумывать условия для открытия. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.