AntFX 6,474 Share Posted September 27, 2018 (edited) 27 минут назад, torgf сказал: Есть скрипт который при запуске вызывает настройки всех индикаторов и кликает "ОК". А может лучше не использовать методы "через одно место", а сделать обмен данными через глобальные переменные, или события OnChartEvent? Кстати, если нужно только добиться перерисовки индикаторов, то это должно быть возможно сделать с помощью простого вызова ChartRedraw(); Edited September 27, 2018 by AntFX Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 27, 2018 (edited) 36 минут назад, AntFX сказал: В данном случае нужно именно "через это место" . ChartRedraw(); не справляется. А что, из индикатора не все действия возможны по winapi? Edited September 27, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted September 27, 2018 5 минут назад, torgf сказал: А что, из индикатора не все действия возможны по winapi? Все возможно по винапи, но лично мне не нравится желание делать вещи через это место Разве что когда дело касается загрузки инфы из интернета, хотя сейчас и для этого уже вроде встроенная в mql функция появилась... Quote 1 Link to post Share on other sites
AntFX 6,474 Share Posted September 27, 2018 К тому же у меня этот код вообще не работает (не только в индикаторах...), и написан он явно для очень старой версии МТ4 (до 2014), т.к. функция start уже 4 года называется в mql иначе... Таким образом, чтобы этот код "исправить", нужно самому разбираться во внутреннем строении окон метатрейдер, править их дескрипторы и т.п. Может кто-то и поможет, но я лично не полезу туда ради непонятной цели ) Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 27, 2018 (edited) 56 минут назад, AntFX сказал: но лично мне не нравится желание делать вещи через это место Всё правильно делать, мне тоже нравится. Но это необходимость, средствами mql не достигается цель 18 минут назад, AntFX сказал: К тому же у меня этот код вообще не работает Из папки Скрипты, выполняет необходимые действия, несмотря на год выпуска, и большой пробег Может быть, у вас, вызов dll запрещен. Edited September 27, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 1 час назад, torgf сказал: Всё правильно делать, мне тоже нравится. Но это необходимость, средствами mql не достигается цель Из папки Скрипты, выполняет необходимые действия, несмотря на год выпуска, и большой пробег Может быть, у вас, вызов dll запрещен. Может он и работает, я судил по тому, что не выполняет заново OnInit индикаторов из списка. Судя по всему, именно это Ваша цель - вызвать OnInit индикаторов заново. И вывод, что скрипт "не работает из индикаторов" Вы, возможно, сделали тоже поэтому. Однако, я сейчас проверил, это далеко не всегда достигается открытием свойств индикатора и нажатием на ОК, как это делает скрипт. Поэтому, возможно, что код "работает" и у меня, и у Вас при вызове из индикаторов тоже работает, только он делает не то, что Вам нужно, и поэтому Вы думаете, будто он "не работает". Раньше, до 2014, вызов свойств индикатора и нажатие ОК возможно, всегда приводило к вызову init/deinit, а сейчас не так. Поскольку мы все равно здесь не будем "лечить" этот скрипт, дальше пояснять нет смысла Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 28, 2018 (edited) 34 минуты назад, AntFX сказал: Ваша позиция мне понятна. 34 минуты назад, AntFX сказал: и поэтому Вы думаете, будто он "не работает". Однако, когда запускаю скрипт, видно - возникают, на мгновение, окна настроек индикаторов и данные обновляются. Из индикатора, код выполняет только вызов окна "Список индикаторов" дальше код не выполняется. Поэтому и предположила что из индикатора невозможно полноценно эмулировать действия. Edited September 28, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 (edited) 29 минут назад, torgf сказал: Ваша позиция мне понятна. Однако, когда запускаю скрипт, видно - возникают, на мгновение, окна настроек индикаторов и данные обновляются. Из индикатора, код выполняет только вызов окна "Список индикаторов" дальше код не выполняется. Поэтому и предположила что из индикатора невозможно полноценно эмулировать действия. Забавно - добавил в индикатор, запустил не подумав - и наглухо повесил терминал, да ещё так, что с трудом восстановил (пришлось откомпилированный файл индикатора удалять перед запуском терминала) Так что все работает из индикаторов отлично, даже более чем. Ну а поскольку за попытку помочь я уже был наказан) а также потому, что Вы так и не обозначили подробно свою цель при использовании этого инструмента, далее разбирайтесь сами... Кстати, интересно - у Вас также вызов из индикатора вешал терминал, но Вы об этом промолчали? Edited September 28, 2018 by AntFX Quote 1 Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 (edited) Кто-нибудь в курсе, как заставить перегруженные логические операции, типа operator==, правильно работать с указателями? То есть как сделать, чтобы следующий код class A{ public: bool operator==(A *a){ Print("a==a?"); return(false); } }; void OnStart(){ A *a; A *b; Print(a==b); } Выполнял не сравнение указателей, а переопределенное действие? Со всеми логическими операциями так... Да, кстати с оператором =, похоже, та же проблема П.С. Вот так можно вызвать перегруженную операцию: bool eq(A &op1, A &op2){ return(op1==op2); } Но тогда теряется смысл перегрузки - сделать код изящнее за счет использования операций вместо вызова функций. Edited September 28, 2018 by AntFX Quote 1 Link to post Share on other sites
kazakov.v 189 Share Posted September 28, 2018 2 часа назад, AntFX сказал: заставить перегруженные логические операции, типа operator==, правильно работать с указателями? Указатель - это просто цифирь, по сути базовый (элементарный) тип данных. Для базовых типов перегружать операторы нельзя, да и бессмысленно. Я так думаю) Quote Никому верить нельзя. Мне - можно. Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 (edited) 34 минуты назад, kazakov.v сказал: Указатель - это просто цифирь, по сути базовый (элементарный) тип данных. Для базовых типов перегружать операторы нельзя, да и бессмысленно. Я так думаю) Ага, только чтобы хотя бы распечатать этот "цифирь", приходится плясать с бубном, а что-то кроме объекта присвоить - почти невозможно )) То есть когда им хочется, он себя не ведет как цифирь, если только оочень-очень настойчиво не попросить. Тем не менее, mql его трактует как что-то вроде bool при свободной записи, т.е. если он=NULL, то Print(a) возвращает 0, а иначе 1. Причем, независимо от его валидности, что делает такое поведение бесполезным чуть более, чем полностью. Но зато перегрузка логических операций с ним не работает. Все остальные операции (типа < или <<, то есть побитовые и арифметические) перегружаются на "ура". Edited September 28, 2018 by AntFX Quote 1 Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 Кстати, переменная типа объект (не указатель) - это точно такой же цифирь. Но с ним перегрузка уже и логических операций работает как надо Quote 1 Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 Вот ещё пара интересных фактов про "цифирь" class A{ public: bool operator==(A &a){ Print("a==a!"); return(false); } bool operator==(int b){ Print("a==B!"); return(false); } }; void OnStart(){ A *a; A *b; A c; int base_type; Print(a==b); // Перегруженная операция НЕ работает Print(a==c); // Отлично работает перегруженная операция! Print(c==a); // Отлично работает перегруженная операция! Print(a==base_type); // Отлично работает перегруженная операция! // Print(base_type==a); Но тем не менее - illegal operation use! )) Вот такой вот "базовый тип"... } Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 28, 2018 (edited) 5 часов назад, AntFX сказал: Кстати, интересно - у Вас также вызов из индикатора вешал терминал, но Вы об этом промолчали? Зачем вы так. Не виснет терминал и даже нагрузки на процессор нет. Возникает окно "Список индикаторов" и торчит, пока не кликну "Закрыть". Его я уже и в OnTimer определяла, не идёт дальше списка индикаторов. 5 часов назад, AntFX сказал: так и не обозначили подробно свою цель при использовании этого инструмента История очень длинная, не хотела отнимать время. Коротко - есть 3 индикатора которые не меняют показаний в реальном времени, открытого кода нет. Строятся графические объекты, читать буферы нет смысла. Запускала на графике индикатор с ChartRedraw нет эффекта. После запуска вышеуказанного скрипта данные индикаторов обновляются. Есть замысел по графике этих индикаторов проверить некое предположение возможного предвидения будущего направления движения цены. В целом банальщина, жажда наживы, грааль и т.д. хотя исследовательский кодинг- интерес присутствует Edited September 28, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted September 28, 2018 (edited) 1 час назад, torgf сказал: ачем вы так. Не виснет терминал и даже нагрузки на процессор нет. Возникает окно "Список индикаторов" и торчит, пока не кликну "Закрыть". Его я уже и в OnTimer определяла, не идёт дальше списка индикаторов. В общем, получается так, что после присоединения к графику индикатора, в котором сидит этот код, он сам оказывается в списке индикаторов, запускается код в OnCalculate, открывает его свойства, закрывает, он перегружается и снова запускает OnCalculate, запускается код, открывает его свойства и так далее в бесконечном цикле, который можно остановить только через диспетчер задач. А потом Вы открываете "испортившийся" метатрейдер и видите тоже самое, потому что он успевает запомнить, что этот индикатор был установлен на график и пытается открыть его там же... Так что забудьте об этой затее, Вам просто повезло, что Вы не сломали себе метатрейдер. Попробуйте это сделать через советник, что ли Что касается ChartRedraw - если он не работает, попробуйте поиграть с ChartApplyTemplate, один шаблон с нужными индикаторами, другой без, последовательно их меняя. И попробуйте вызывать WindowRedraw вместо ChartRedraw. Любой найденный "нормальный" способ будет лучше, чем это потенциально убивающее терминал древнее художество. Edited September 28, 2018 by AntFX 1 Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 28, 2018 13 часов назад, AntFX сказал: он сам оказывается в списке индикаторов, запускается код в OnCalculate, Спасибо, понятно объяснили. Все усилия тщетны. Обновляются данные только вызовом окна настроек. Решила попробовать вызвать этот злосчастный скрипт из индикатора, не вызывается. Подскажите, что не так. #property strict #property indicator_chart_window #define MT4_MESSAGE "MetaTrader4_Internal_Message" #include <WinUser32.mqh>; #import "user32.dll" int RegisterWindowMessageA(uchar &lParam[]); int SendMessageA(int hWnd,int Msg,int wParam,char &lParam[]); #import #define TA_SCRIPT_NAME "dostal"//"<dostal>" ////// datetime OlderTime; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- char buf[]; int hwnd=WindowHandle(Symbol(),Period()); int i;//counted_bars=IndicatorCounted(); if(rates_total<4) return(0); int limit=rates_total-prev_calculated-1; // for(i=limit; i>=10; i--) { //if(TimeCurrent()>=OlderTime+120) if(TimeLocal()>=OlderTime+120) { StringToCharArray(TA_SCRIPT_NAME,buf); int MT4InternalMsg=RegisterWindowMessageA(buf); SendMessageA(hwnd,MT4InternalMsg,14,buf); //OlderTime=TimeCurrent(); OlderTime=TimeLocal(); } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ Quote Link to post Share on other sites
ИМН 67 Share Posted September 29, 2018 Доброго здравия г-дам специалистам по MQL4/5. Есть вопрос: советник на открытии каждой свечи (ТФ М15) выполняет некоторые операции, затем записывает/перезаписывает некоторые глобальные переменные ТЕРМИНАЛА. После чего при помощи GlobalVariablesFlush() фиксирует их на диске. Таким образом, например, в 23:50 я увижу, что глобальные переменные терминала обновлялись последний раз около 23:45 (время терминала и сервака часто не совпадает). Однако по непонятной мне причине терминал проигнорировал последнее выполнение этой рутины в пятницу в 23:45, последнее сохранение глобалок в списке указано в 23:30. Причём советник совершенно точно входил в блок операторов записи глобалок, то есть проблема не в советнике. В чём может быть дело? Quote Лёгкие деньги бывают только там же, где и бесплатный сыр. Link to post Share on other sites
AntFX 6,474 Share Posted September 29, 2018 2 часа назад, ИМН сказал: советник совершенно точно входил в блок операторов записи глобалок, то есть проблема не в советнике Если входил, но не выполнил то, что нужно, значит проблема именно в советнике. Больше на эту тему сказать нечего - здесь не Ванги собрались Quote 1 Link to post Share on other sites
DVargo 210 Share Posted September 29, 2018 В 28.09.2018 в 00:44, torgf сказал: как заставить работать код из индикатора? Методом тыка, эта строчка лишняя. //---- проверяем активность кнопки "Свойства" if(IsWindowEnabled(GetDlgItem(hListDlg,0x48B))==0) continue; при любом раскладе определяется как "0". А откуда индюк взяли? Интересует эта часть //---- вызываем окно "Список индикаторов" PostMessageA(hOwnedWnd,WM_COMMAND,35419,0); какие еще окна можно получить вместо 35419? Интересуют именно окна. Как их получать из spy не разобрался. Я не думаю, что вызывать окна из индикатора правильно. лучше наверное все же из скрипта. До кнопок можно добраться также эмуляцией клавиш таб и ввод. добавить строки с нужными клавишами, по аналогу. //---- устанавливаем курсор на верхней строчке списка PostMessageA(hTreeView,WM_KEYDOWN,VK_HOME,0); 1 Quote А не пойти ли бы вам Link to post Share on other sites
ИМН 67 Share Posted September 29, 2018 7 часов назад, AntFX сказал: Если входил, но не выполнил то, что нужно, значит проблема именно в советнике. Больше на эту тему сказать нечего - здесь не Ванги собрались Антон, не советник не выполнил то, что нужно, а терминал не выполнил то, что ему велел сделать советник. Блок перезаписи глобалок ничем не обусловлен, просто тупо делается перезапись каждый раз на открытии каждой свечи. До 23:45 пятницы все перезаписи с момента запуска советника на неделе работали чётко. Я не к вангам обращаюсь, а к тем, кто, возможно, сталкивался с чем-то подобным. Угар, Вы велели писать здесь, выполняю. Ничего не подскажете? Quote Лёгкие деньги бывают только там же, где и бесплатный сыр. Link to post Share on other sites
AntFX 6,474 Share Posted September 30, 2018 10 часов назад, ИМН сказал: Антон, не советник не выполнил то, что нужно, а терминал не выполнил то, что ему велел сделать советник. Это заявление является слишком самонадеянным с Вашей стороны. С вероятностью 90% именно Ваш советник накосячил, а терминал тут непричем. Именно поэтому 10 часов назад, ИМН сказал: Я не к вангам обращаюсь Если Вы "не к вангам обращаетесь", в первую очередь нужно выложить тут сам советник. А если нет желания - то и не обращаться. Quote 1 Link to post Share on other sites
torgf 0 Share Posted September 30, 2018 (edited) В 29.09.2018 в 16:31, DVargo сказал: Я не думаю, что вызывать окна из индикатора правильно. лучше наверное все же из скрипта. Совершенно верно, скрипт выполняет все действия, несмотря на "лишнюю" строку. AntFX объяснил, почему код из скрипта не будет корректно выполнять действия из индикатора. Поэтому и пытаюсь программно из индикатора прикрепить скрипт "dostal" к графику, попытка в предыдущем сообщении. Но действие, прикрепление скрипта к графику, не выполняется. Edited September 30, 2018 by torgf Quote Link to post Share on other sites
DVargo 210 Share Posted September 30, 2018 (edited) Скрипт из индикатора запускается Скрытый текст //+------------------------------------------------------------------+ //| Test run Script.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window #define MT4_MESSAGE "MetaTrader4_Internal_Message" #define TA_SCRIPT_NAME "Test MessegeBox" #import "user32.dll" int RegisterWindowMessageA(uchar &lParam[]); int SendMessageA(int hWnd, int Msg, int wParam, char &lParam[]); #import int k=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- k=k+1; if (k==10) { Main(); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ void Main() { //--- char buf[]; StringToCharArray(MT4_MESSAGE, buf); int MT4InternalMsg = RegisterWindowMessageA(buf); StringToCharArray(TA_SCRIPT_NAME, buf); int hwnd=WindowHandle(Symbol(),Period()); if (hwnd < 0) { Alert("Заданное окно для запуска скрипта не найдено."); return; } SendMessageA(hwnd, MT4InternalMsg, 16, buf); } //+------------------------------------------------------------------+ Скрытый текст //+------------------------------------------------------------------+ //| Test MessegeBox.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- MessageBox("Run Script "); } //+------------------------------------------------------------------+ Можно также сделать эмуляцию нажатия клавиш, а на скрипт сделать горячие кнопки. Edited September 30, 2018 by DVargo 1 Quote А не пойти ли бы вам Link to post Share on other sites
torgf 0 Share Posted October 1, 2018 (edited) В 01.10.2018 в 01:07, DVargo сказал: Скрипт из индикатора запускается Ура-а!!! Спасибо. Edited October 2, 2018 by AntFX п. 4 Quote Link to post Share on other sites
sviter 0 Share Posted October 2, 2018 Здраствуйте! Помогите с формулой! Нужно мне сделать следующее....Нужно узнать среднюю цену между ордерами....Конкретнее...Открылся у меня к примеру ордер на BUY с лотом в 0.1 с ТР в (допустим)100 пунктов, если цена пошла в другую сторону на 50 пунктов, то открывается еще один ордер на BUY, но уже с лотом в (допустим)0.5 и уже с ТР в (допустим)10 пунктов....так вот проблема в этом как расчитать сумму с первого ордера, по цене и количеству пунктов, что бы второй ордер рассчитывался по формуле и перекрывал первый.....и сумма лота и ТР....кароче такой своеобразный сеточник 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.