Форум » Консультации по программированию » Я в шоке! Подскажите. » Ответить

Я в шоке! Подскажите.

Sergey: Всем привет! Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4? Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них. http://gfile.ru/a8cCP Хотя не перекомпилированные файлы работают. Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму. Буду благодарен, если найдешь время исправить.

Ответов - 204, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All

Sergey: Scriptong пишет: Этим грешит Alpari. В самую точку. Счета стандарт. Еще слышал об Альфа-банке. Ситуацию понял. Но предложенный подход тоже не идеален. Во-первых потому, что спред плавающий, а m_symbolInfo.stopLevel возможно постоянный. Во-вторых под одну гребенку меряем все ДЦ с m_symbolInfo.stopLevel=0. Созрела такая идея: Первоначальную информацию о m_symbolInfo.stopLevel получаем в int OnInit(). Далее при не удачной установке или модификации ордеров с ошибкой 130, запускаем функцию расчета m_symbolInfo.stopLevel в теле программы. Однако возникает новая проблема: Если m_symbolInfo.stopLevel величина постоянная - увеличение лучше делать по-шагово, скажем + 2pip. Один раз рассчитал и дальше проблем нет. А если плавающая и зависящая от спреда, то как предложено выше, но на каждом тике. И при этом нужно четко знать коэффициент увеличения. Выходит нужен дополнительный механизм получения информации.

Scriptong: Sergey пишет: Но предложенный подход тоже не идеален. Подход не идеален лишь потому, что от пользователя требуется правильная установка параметра m_isECN. Если пользователь укажет, что счет относится к ECN, а это на самом деле не так, то советник не сможет открыть ни одного ордера, если стопы/профиты располагаются слишком близко к базовой цене ордера. Sergey пишет: Во-первых потому, что спред плавающий, а m_symbolInfo.stopLevel возможно постоянный Плавающий спред сейчас у большинства брокеров. Это нормально, и никак не влияет на правильную работу программы. Указанный мною код должен выполняться в начале каждого тика. Таким образом, информация постоянно обновляется. Насчет постоянного стоплевела не видел заверений ни у одного брокера. Такие нюансы почему-то не расписываются даже в договорах на 34-х страницах, а надо бы. Поэтому постоянный стоплевел мною воспринимается как несбыточная мечта, что и заставляет постоянно мониторить его размер (кроме, разве что, среды тестера). Sergey пишет: Во-вторых под одну гребенку меряем все ДЦ с m_symbolInfo.stopLevel=0. Нет. Я ведь указал на параметр m_isECN. Sergey пишет: Далее при не удачной установке или модификации ордеров с ошибкой 130 К сожалению, получение ошибки №130 не дает нам гарантии того, что мы оперируем неправильным стоплевелом. Она, к примеру, может говорить о том, что тип исполнения Market Execution и мы пытаемся установить стопы/профиты в момент открытия рыночного ордера. Правда, это не очень удачный пример, т. к. тип исполнения уже можно узнать в новом MQL4. А вот тип счета (ECN или стандарт) программно узнать невозможно. Отсюда и куча проблем с этим стоплевелом. Sergey пишет: Выходит нужен дополнительный механизм получения информации. Остается лишь надеяться на то, что в язык будет добавлена соответствующая функция, которая позволит программе самой определить тип счета, а значит и способ расчета Stop Level.

Sergey: Scriptong пишет: Нет. Я ведь указал на параметр m_isECN. Я не о счетах ECN. Я о брокерах, которые реально выдерживают Stop Level=0 на других счетах. Scriptong пишет: К сожалению, получение ошибки №130 не дает нам гарантии того, что мы оперируем неправильным стоплевелом. В таком случае мудрить с кодом не буду и как всегда последую опыту и профессионализму. Спасибо!


Scriptong: Sergey пишет: Я не о счетах ECN. Я о брокерах, которые реально выдерживают Stop Level=0 на других счетах. Возможно, я неправильно назвал параметр, ошибочно предполагая, что нулевой стоплевел есть только на счетах типа ECN или STP. То есть речь только о неудачном названии, но не о сути параметра. Смысл в том, чтобы пользователь поставил его в "Да", когда у брокера реально нулевой стоплевел. Посмотрел, как видно этот параметр в списке входных параметров. Получается не так уж и двузначно, вопрос конкретный: "Установить нулевой StopLevel?"

Sergey: Scriptong пишет: Смысл в том, чтобы пользователь поставил его в "Да", когда у брокера реально нулевой стоплевел. Я уже сообразил. Но в место да-нет решил установить коэффициент отступа в спредах, если счета не ECN. Предполагая, что отступ не всегда равен двум спредам, даю возможность настраивать StopLeve пользователю под любого брокера.

Scriptong: Sergey пишет: Но в место да-нет решил установить коэффициент отступа в спредах, если счета не ECN. Достаточно веское замечание. Ведь два спреда советует только Alpari. У других брокеров может быть иное значение. И тут уже разворачиваем фантазию дальше: что, если брокер нам заявит, что отступ в спредах также не постоянный? Хотя это, конечно, уже вообще беспредел, мухлеж чистой воды. От таких "брокеров" нужно уходить сразу же после подобного ответа.

Sergey: Вернусь к старой проблеме. Scriptong пишет: Перекомпиляция программы перед отправкой - секундное дело, больше времени потратите на отправку письма. Genry пишет: Поэтому после компиляции имел смысл обработать код программой защиты от декомпиляции - программой типа ex4_protector. Есть у кого нибудь рабочая версия перекомпилятора (free)? Скачал несколько версий ex4_protector, но все время выскакивают ошибки. Вроде все просто, но не получается.

Scriptong: Sergey пишет: Есть у кого нибудь рабочая версия перекомпилятора (free)? Скачал несколько версий ex4_protector, но все время выскакивают ошибки. Вроде все просто, но не получается. К сожалению, никогда не пользовался подобными "защитниками". Могу лишь сделать предположение о том, что эта версия разработана для старой версии MQL4. Для новой версии MQL4 подобные дополнительные защиты не нужны - новый компилятор на выходе выдает нативный код, который не так уж и легко взломать. Даже если его и взломают, то почему таким профи будет не под силу взломать любую другую защиту, тем более распространяемую в сети? Также учтите следующий момент. В новом MQL4 добавлены возможности ООП. А когда код написан объектно-ориентированным способом, то его декомпиляция в первозданный вид становится практически невозможной - слишком много различных вариантов, ни один современный компьютер не переберет. То есть взломщикам придется иметь дело не с декомпилированным вариантом, а именно с нативным кодом. Это затруднит их работу. Используйте ООП!

Sergey: Scriptong пишет: Используйте ООП "Чем дальше в лес, тем больше дров" Так и у меня. Что такое написание кода объектно-ориентированным способом?

Scriptong: Sergey пишет: Что такое написание кода объектно-ориентированным способом? Использование классов. Для этого любая задача разбивается на две и более подзадачи (как представляется удобнее для конкретного случая). Это подзадачи первого уровня. Они оформляются в виде классов, замкнутых в себе. Для передачи данных между этими классами создаются интерфейсы, которые гарантируют целостность данных в пределах одного класса, т. е. данные класса имеет право изменять только сам класс, и никто другой. Каждая задача первого уровня дробится на более мелкие задачи. В зависимости от степени дробления задачи второго уровня оформляются в виде классов, используемыми классами первого уровня, или в виде функций (методов) существующих классов. Простые задачи решать путем ООП, чаще всего, невыгодно. Но как только возникает задача хотя бы среднего уровня выигрыш от использования ООП становится очевидным.

Sergey: Спасибо. Конечно, с примерами было бы лучше, но в целом понятно.

Scriptong: Sergey пишет: Спасибо. Конечно, с примерами было бы лучше, но в целом понятно. К сожалению, одними примерами не отделаться. На эту тему пишут книги по 300-400 страниц. Классы неплохо описаны у Шилдта, даже несмотря на то, что это справочник, а не полноценный учебник. Читайте с 237-ой страницы. Там, конечно, все про C++, но почти все справедливо и для современного MQL4. Если что-то будет непонятно, спрашивайте.

Sergey: Можно ли объекты типа ARROW привязавать к таким координатам? Ошибка не выдается, однако объект не отображается. Объект нужно отобразить в окне графика справа от него. ObjectCreate("SD_D1_2", OBJ_ARROW, WindowFind(short_name), 10, 35); ObjectSet("SD_D1_2", OBJPROP_ARROWCODE, 110); ObjectSet("SD_D1_2", OBJPROP_WIDTH, 3); ObjectSet("SD_D1_2", OBJPROP_CORNER,1); // угол пивязки ObjectSet("SD_D1_2", OBJPROP_COLOR, UpColor);

Scriptong: Sergey пишет: Можно ли объекты типа ARROW привязавать к таким координатам? Нет, нельзя. Перечень типов объектов, для которых это разрешено, смотрите здесь. Sergey пишет: объект не отображается Он отображается, но на 10-ом баре по цене 35 (где-то вверху, если график EURUSD). Ошибку же проверяйте после вызова: ObjectSet("SD_D1_2", OBJPROP_CORNER,1); // угол пивязки

Sergey: Нужно ограничить демку по валютной паре. Однако некоторые ДЦ используют, как мне сказали, префиксы и суффиксы. Я с этим не сталкивался, а потому проверить правильность кода не могу. Прошу дать квалифицированную оценку. extern string prefix = ""; extern string suffix = ""; if (Symbol()!=prefix + "EURUSD" + suffix) { Alert("Demo version is only for EURUSD"); return(0); }



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