Форум » Алгоритмы » Сюда можно дать приб.. » Ответить

Сюда можно дать приб..

Azer: Сюда можно дать приблизительный алгоритм???

Ответов - 41, стр: 1 2 3 4 5 All

dhot: Scriptong пишет: Так ведь никто не мешает вам преобразовывать цену в пиксели Да, я видел это, но стараюсь избегать обращения к системным dll. У Дениса Орлова есть такой советник: http://codebase.mql4.com/ru/6012http://codebase.mql4.com/ru/6012 Судя по комментариям, вполне работоспособный, но у меня почему-то глючит. Вместо того, что бы остановиться на заданном уровне подвешивает тачпад. Автор в недоумении. Я грешил на загаженность системы, но даже после ее переустановки глюк остался ( у меня XP, SP не ниже второго, лицензионная).

dhot: SK пишет: Обратите внимание также на необходимость перерисовки графиков после изменения свойств объектов (см. WindowRedraw() ). Упс! А вот об этом не подумал! Попробую...

dhot: Все равно ни чего не получается. Сергей, могли бы вы ответить всего на один конкретный вопрос? Запустите, пожалуйста, этот советник в тестере, в режиме визуализации. Выделите и переместите созданный им в окне графика текст ( 1 ). Собственно вопрос: почему третий алерт, из тех, что выводятся в результате этого действия, показывает ошибку 4202? [pre2]//+------------------------------------------------------------------+ //| тест.mq4 | //+------------------------------------------------------------------+ #property copyright "" #property link "" double LabPr; datetime LabTm; int Value; int Shift; int Flag; int init() { Value=1; Shift=6; LabPr=Bid; Flag=0; LabTm=iTime(NULL,0,WindowFirstVisibleBar( )-Shift); ObjectCreate("LabTest",OBJ_TEXT,0,LabTm,LabPr); ObjectSetText("LabTest",DoubleToStr(Value,0) ,11,"Tahoma",Red); } int start() { if(LabPr!=ObjectGet("LabTest",OBJPROP_PRICE1)|| LabTm!=ObjectGet("LabTest",OBJPROP_TIME1)) { if(Flag==0) { Value=Value*(-1); Alert("Value=",Value); Flag=1; Alert("Поиск объекта - ",ObjectFind("LabTest")); ObjectSetText("LabTest",DoubleToStr(Value,0) ,11,"Tahoma",Red); Alert("Ошибка - ",GetLastError()); } } else Flag=0; LabTm=iTime(NULL,0,WindowFirstVisibleBar( )-Shift); ObjectSet("LabTest",OBJPROP_TIME1,LabTm); ObjectSet("LabTest",OBJPROP_PRICE1,LabPr); } [/pre2]


SK: После некоторых экспериментов выяснилось, что: - поиск объекта всегда выполняется корректно (независимо от факта перемещения мышкой) - изменение свойства ObjectSetText объекта (GetLastError()=0) выполняется только в том случае, если объект покоится (не перемещается мышкой) - изменение свойства ObjectSetText объекта не выполняется (GetLastError()=4202), если объект перемещается мышкой; при этом указание программы изменить значение ObjectSetText запоминается терминалом и выполняется при ближайшем удобном случае (объект покоится) В этом можно убедиться, установив медленную прокрутку (скорость образования новых баров). Если объект сдвинуть и быстро отпустить, то скорее всего ошибка будет=0, т.к. перемещение объекта попадает на период между исполнениями start(), т.е. фактически на момент исполнения ObjectSetText() объект покоится. Если объект сдвинуть и подержать до момента образования нового бара, то ошибка =4202, т.к. на момент исполнения start() объект перемещался мышкой. Для наглядности добавьте одну строку: Alert("Поиск объекта - ",ObjectFind("LabTest")); Alert("Ошибка До- ",GetLastError()); ObjectSetText("LabTest",DoubleToStr(Value,0) ,20,"Tahoma",Red); Alert("Ошибка После- ",GetLastError());

dhot: SK пишет: при этом указание программы изменить значение ObjectSetText запоминается терминалом и выполняется при ближайшем удобном случае (объект покоится) Вообще-то первый удобный случай, как я понял, наступает в момент отпускания объекта, но проблема в том и заключается, что изменения свойства не происходит. Однако за идею весьма признателен. Такой расклад вполне возможно обработать. Кстати, Alert("Ошибка До- ",GetLastError()); будет в любом случае показывать 0. Переменная LastError обнуляется после вызова в строке Alert("Ошибка После- ",GetLastError()); и больше ей негде принять новое значение. :)) Сергей, говорят, Вы готовите учебник по MQL5. Не подскажете, когда его можно будет увидеть? Да и с самим MT5 как дела обстоят? А то окажется, что все мои искания напрасны... :))) И спасибо вам за терпение!

SK: dhot пишет: Кстати, Alert("Ошибка До- ",GetLastError()); будет в любом случае показывать 0. Да. Это-то и свидетельствует о том, что клиентский терминал находит объект независимо от факта его перемещения мышью. dhot пишет: Вообще-то первый удобный случай, как я понял, наступает в момент отпускания объекта, но проблема в том и заключается, что изменения свойства не происходит. Нет. Всё дело в подробностях. Случай не инициируется фактом отпускания объекта пользователем. Случай - это строка кода в функции start(). Start() запускается новым тиком и исполняется обычно быстро, т.е. успевает закончиться раньше, чем приходит новый тик. После того, как start() закончила своё исполнение, до нового запуска страт (на следующем тике) возникает пауза. Если в период исполнения старт (конкретно функции ObjectSetText) объект тянется мышей, то неизбежно возникает ошибка 4202. Если же пользователь успел отпустить объект в период паузы, т.е. до прихода нового тика, то ObjectSetText в start() (запущенной фактом прихода нового тика) исполнится без ошибки. Если Вас интересуют эти подробности (что вполне понятно при создани функций обработки событий, связанных с объектами), то не поленитесь составить диаграмму, на кот. отобразить все варианты начала и окончания перетаскивания объекта по отношению к началу и концу исполнения start(). dhot пишет: Сергей, говорят, Вы готовите учебник по MQL5. Не подскажете, когда его можно будет увидеть? Да и с самим MT5 как дела обстоят? А то окажется, что все мои искания напрасны... :))) Это правда. Надеюсь, что учебник появится к концу лета. Более точно сказать не могу - как дело пойдёт. Что касается МТ 5, то, по моим представлениям (я не разработчик,- и платформу и язык создали сотрудники MQ), процесс отладки продолжится прибл. до конца года и выход учебника прибл. совпадёт по срокам с официальным представлением МТ 5. Историю развития МТ 5 можно посмотреть здесь http://www.mql5.com/ru/forum, об учебнике немного здесь http://www.mql5.com/ru/forum/3/page3.

dhot: SK пишет: Случай - это строка кода в функции start(). Start() запускается новым тиком и исполняется обычно быстро, т.е. успевает закончиться раньше, чем приходит новый тик. Я так понимаю, что при создании рабочего прототипа программы проще, быстрее и надежнее фиксировать состояние объектов в переменных и при каждом запуске start() приводить их в соответствие. Позже, когда будут доведены логика и интерфейс, попытаться оптимизировать какие-то процессы, если возникнет в том потребность. Спасибо за советы. :)

SK: dhot пишет: Я так понимаю, что при создании рабочего прототипа программы проще, быстрее и надежнее фиксировать состояние объектов в переменных и при каждом запуске start() приводить их в соответствие Думаю, что это зависит от задачи. start() запускается новым тиком. Если этого достаточно, то так и сделать. Во всяком случае, необходимо обрабатывать все ситуации, в том числе, делать анализ ошибок. В Вашем случае нужно выловить ошибку 4202 и соотв. образом отреагировать. Например, не выполнять модификацию объекта и выйти из start(). Есть и другой способ - если координаты объекта смещены, то удалить объект. Объект не будет удалён, если в момент попытки удаления он перетягивается. И тут же проверить наличие объекта: если он есть, то его тянут; если его нет, то создать новый в новых координатах и с новыми параметрами. (отсутствие объекта нужно обрабатывать само собой, т.к. возможно случайное удаление) Если же пойти по пути зацикленной start(), то это с одной стороны, позволит быстро реагировать на управляющие воздействия пользователя, с другой стороны, повлечёт необходимость более глубокого анализа ситуации (в т.ч. обработку факта перекл. таймфрейма - пересчёт координат). И если идею развивать и углублять, то через некоторое время может получиться AutoGraf :)

coldun: Здравствуйте Сергей! Пожалуйста помогите разобраться. Хочу реализовать в алгоритме советника изменение настроек в зависимости от состояния рынка. Например: задан стандартный шаг между ордерами, нужно увеличить шаг при обвале рынка. Когда изменяю этот шаг через коэффициент, шаг изменяется, но зацикливается и либо увеличивается без остановки, либо уменьшается до нуля. Как правильно сделать эту функцию. K = NormalizeDouble((AccountFreeMargin()/AccountBalance()),2); // коэффициент изменения шага PromShag = Shag / K; //промежуточные вычисления Shag = PromShag; //шаг между отложенными ордерами выраженный через промежуточную переменную

SK: В подобных случаях, как всегда, решение кроется в скурпулёзном рассмотрении подробностей. 1. Что такое шаг? Дистанция в пунктах между отложенными ордерами? 2. Что значит увеличить шаг? Модифицировать все отложенники так, чтобы дистанция между ними увеличилась? 3. "шаг изменяется, но зацикливается и либо увеличивается без остановки либо уменьшается до нуля" - попробуйте сообразить, можно ли это понять? Для того, чтобы разобраться что там зацикливается, нужно же посмотреть код, включающий оператор цикла. Код Вы не даёте. Ну.. и что дальше? 4. "Как правильно сделать эту функцию" Какую функцию? Чтобы что-то сказать о том КАК сделать, нужно сначала иметь точное представление о том, ЧТО нужно сделать. Но Вы же не даёте Вашей идеи, т.е. какие факторы принимаются во внимание, чтобы расчитать шаг? Обычно программа не работает или плохо работает, если программист допускает невнимательность или недодумывает свой метод расчёта. Попробуйте самостоятельно ответить на все вопросы. Если не получится сделать самостоятельно, то выкладывайте всё по полочкам, попробуем разобраться вместе.



полная версия страницы