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

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

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

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

Владимир25/04: SK пишет: Отдать другу Вы можете один файл ех4. Он будет работать, его компилировать не нужно (он уже является результатом компиляции). И он не потребует никаких включаемых файлов. Его просто нужно положить в папку экспертов. После запуска МТ4 в списке экспертов в терминале он будет сегого цвета (если рядом нет его исходников) или жёлто-синего (если исходники тут же). Все, спасибо. Хоть какой-то смысл появился от включаемых файлов. Советник в виде ех4 на другом компьютере работает. Удачи.

SK: ОК.

Владимир25/04: Здравствуйте Сергей. Я себе уже сломал всю голову. В MetaTrader в скриптах, базовой поставки, есть следующий скрипт: #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property show_confirm //+------------------------------------------------------------------+ //| script "send pending order with expiration data" | //+------------------------------------------------------------------+ int start() { int ticket,expiration; double point; //---- point=MarketInfo(Symbol(),MODE_POINT); expiration=CurTime()+PERIOD_D1*60; //---- while(true) { ticket=OrderSend(Symbol(),OP_SELLSTOP,1.0,Bid-100*point,0,0,0,"some comment",16384,expiration,Green); if(ticket<=0) Print("Error = ",GetLastError()); else { Print("ticket = ",ticket); break; } //---- 10 seconds wait Sleep(10000); } //---- return(0); } Что это за функция CurTime() где она объявлена и где её код. Если её убираешь компилятор ругается. Я понимаю, что это время, но если она предопределенная то где про неё почитать.


Scriptong: Это устаревшее название функции TimeCurrent. Прчитать про нее можно в Справочнике MQL4-Устаревшие функции. Убирать ее не нужно, просто заменить на TimeCurrent.

Владимир25/04: Большое спасибо. Ясно и понятно. Удачи.

dhot: Мое почтение, Сергей. Вероятно, с Вами можно вдумчиво поговорить о вещах совсем непонятных, творящихся в MQL. Признаться, и Метатрейдер и язык оставляют впечатление очень сырых продуктов. Я не исключаю, что мне могут быть неизвестны все тонкости их реализации, но прозрачности и однозначности в них точно нет. Я, например, так и не понял, почему функция Alert() записи в журнале оставляет, а диалоговое окно не выводит? MessageBox(), к слову, тоже. Был как-то случай, когда одна и та же конструкция в реальном времени, в тестере и в режиме визуализации того же тестера выдавала совершенно разные результаты. Тогда на форуме мне пришлось удовлетвориться простой констатацией факта, что в тестере подобная конструкция не работает. Хоть не моя глупость, уже легче. Однако на затею пришлось плюнуть. Сейчас снова непонятная заминка возникла, но плевать не хочется - много уже сделано. А проблема в следующем. Идея создания на графиках интерактивных элементов новизной не блещет - в режиме визуализации как без рук сидишь. Вот и мне понадобилось создать текстовую метку, выставляемую на определенном ценовом уровне и остающуюся у левого края графика при его прокрутке. При этом хотелось иметь возможность циклически менять два возможных варианта текста метки, смещая ее мышью с исходного положения. Привожу код небольшого эксперта, моделирующего эту идею: //+------------------------------------------------------------------+ //| тест.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); Flag=1; } } else Flag=0; LabTm=iTime(NULL,0,WindowFirstVisibleBar( )-Shift); ObjectSet("LabTest",OBJPROP_TIME1,LabTm); ObjectSet("LabTest",OBJPROP_PRICE1,LabPr); ObjectSetText("LabTest",DoubleToStr(Value,0) ,11,"Tahoma",Red); } //+------------------------------------------------------------------+ По каким-то причинам иногда фокус со смещением метки не срабатывает. А вот если функцию ObjectSetText() поставить не в самом конце, а сразу за инструкцией Value=Value*(-1) (где ей, собственно, и место), то тогда фокус будет иногда срабатывать. Но крайне редко. Самое интересное, что в последнем случае Comment(GetLastError()) сразу за ObjectSetText() выдает 4202 - отсутствие объекта, а вот ObjectFind() непосредственно перед ObjectSetText() объект видит. Этому феномену есть какие-то объяснения?

SK: dhot, Тут, мне кажется, всего по чуть-чуть. Алерт. Чтобы он работал нужно ему разрешить это в настройках МТ 4. Тестер. В самый последний период его, вроде бы, довели до ума, но поручиться за все ситуации я не могу. Интерактивные кнопки. Смотря чего от них хотеть. Из представленного кода не очень понятно какое управляющее воздействие должно осуществляться. Рекомендую на эту тему почитать одну из моих статей: http://articles.mql4.com/ru/117/ Там описаны общие принципы. Главная особенность этой методики состоит в том, что основная прикладная программа (в статье скрипт, в вашем случае - эксперт) должна быть зациклена, т.е. обрабатывать управляющее воздействие пользователя постоянно. Если этого не сделать, то между тиками программка не будет работать. Эксперт отработает 1 раз на каждом новом тике - start() будет запущена терминалом 1 раз по факту прихода нового тика. А между тиками - как не сдвигай объект, - толку не будет, т.к. некому ( start()-то уже отработала и молчит) обработать это событие. -- Попробуйте написать стратегию под AG 4. В этом случае всё просто - не нужно ничего зацикливать, т.к. стратегия вызывается из AG 4 прибл. 100 раз в сек. Нужно просто анализировать факт наличия объекта и его координаты. Если объект удалён - восстанавливать + дать сообщение пользователю. Если объект сдвинут - осуществлять некоторое заданное действие. Можно с вариантами: вниз - одно действие, вверх - другое:)

Scriptong: dhot пишет: Вот и мне понадобилось создать текстовую метку, выставляемую на определенном ценовом уровне и остающуюся у левого края графика при его прокрутке. При этом хотелось иметь возможность циклически менять два возможных варианта текста метки, смещая ее мышью с исходного положения. А почему вы пользуетесь текстовым объектом, а не текстовой меткой? Ведь объект-текст привязывается к цене и времени, а поэтому смещается с перемещением графика. Если же использовать текстовую метку (OBJ_LABEL), то автоматически отпадает необходимость слежения за положением графика, так как метка позиционируется относительно графика в пикселях, а не относительно времени и цены.

dhot: Scriptong пишет: А почему вы пользуетесь текстовым объектом, а не текстовой меткой? Я отмечал, что мне нужна привязка к цене. :) Вообще-то у меня в полном варианте идет горизонтальная линия и привязанная к ней интерактивная метка. Ну, вернее текст. Из меток, само собой, я собрал панель инструментов и информационную панель... :)

dhot: SK пишет: Из представленного кода не очень понятно какое управляющее воздействие должно осуществляться. Менять значение переменной-переключателя Value и отображать его (значение). Или соответствующий значению текст, но это тонкости. Вообще-то проблема в том, что я уже второй раз сталкиваюсь вот с какой несуразицей - чем глубже зарыта инструкция ObjectSet() во вложенные операторы if, тем нестабильнее она работает. Не буду приводить здесь весь код, он довольно громоздок, покажу лишь принцип. Нужно мне было при определенных условиях изменить стиль отрисовки линии. На протяжении жизни линии это делалось лишь один раз и больше стиль линии не менялся. В общих чертах конструкция выглядела так: if(проверка условия 1) { (набор действий) if(проверка условия 2) { (набор действий) if(проверка условия 3) { LevOp=1; ObjectSet(name,OBJPROP_STYLE,STYLE_DASH); } } } Надо отметить, что стиль линии визуализировал состояние переменной LevOp (либо 0, либо 1). Так вот, переменной присваивалось новое значение, а линия не изменялась. Мало того, GetLastError() выдавала ошибку 4202 - объект не существует, а я сидел и смотрел на этот самый объект в окне графика! Уже чисто машинально я изменил код, вытащив ObjectSet() с третьего уровня на второй и это начало срабатывать. Но очень нестабильно. На первом уровне все заработало вроде нормально. Правда условие проверялось теперь на каждом тике и стиль линии присваивался вне зависимости от того, как она была отрисована. Но это уже казалось мелочью... :)))



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