Отправлено: 05.03.13 08:23. Заголовок: помогите с кодом
Пишу индикатор, который рисует линии типа зиг заг на основе анализа уже имеющихся экстремумов зиг зага. Сначала экстремумы собираю в буфера. А вот далее нужно сравнивать пики и впадины и если, например, пики понижаются, то линия зиг зага должна рисоваться вниз, а если впадины повышаются, линия зиг зага идет вверх. Написал вот так: for(int i=0; i<100; i++) { double up = iCustom(NULL,0,"ZZ", 0, i); double dw = iCustom(NULL,0,"ZZ", 1, i); if(up!=2147483647) UP = High; if(dw!=2147483647) DW = Low;
int countUP = ArraySize(UP); int countDW = ArraySize(DW);
for(int u=0; u<countUP; u++) { if(UP<UP[u+1]) { bufDn=UP; bufUp=EMPTY_VALUE; } } for(int d=0; d<countDW; d++) { if(DW[d]>DW[d+1]) { bufUp=DW[d]; bufDn=EMPTY_VALUE; } } } Результат - нулевой. Подскажите, где я ошибаюсь. Заранее - большое спасибо!
Отправлено: 20.05.13 17:50. Заголовок: Большое спасибо! Не ..
Большое спасибо! Не знал о существовании дельты по времени. Только прочитав Ваш коментарий заметил, что тестирование на Н1 проходило успешно, а на М5 давало ошибку. Код записал себе в блокнот. Еще раз огромное спасибо!
Отправлено: 26.06.13 13:28. Заголовок: Графическое управление торговлей
Уважаемый Scriptong! Решил использовать Ваш скрипт FollowPositions "Графическое управление торговлей". Весь текст отображается иероглифами. В чем причина и что делать?
Отправлено: 01.07.13 09:13. Заголовок: Добрый день. Скорее..
Добрый день.
Скорее всего, проблема заключается в том, что в ОС нет нужного шрифта. В данном случае это шрифт с именем "Courier". Выходов из ситуации два: 1. Найти такой шрифт в интернете (как ни странно, но у меня его тоже нет; тем не менее, все отображается корректно) и скопировать в папку Fonts, лежащую в папке, где установлена Windows (чаще всего - C:\Windows). 2. Изменить шрифт, используемый программой. Для этого достаточно открыть файл FollowPosistions.mq4, найти именованную константу FONT_NAME (строка 32), указать в этой строке имя другого шрифта и перекомпилировать проект (F5 или F7). Важно, чтобы новый шрифт был моноширинным (такие, как Courier New). В противном случае графика может отображаться с перекосами.
Огромное спасибо. Все вышло по второму варианту. В ОС шрифт шел как "Courier(TrueType)". Изменил название в скрипте и все столо на свои места.
Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам?
И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе.
Отправлено: 08.07.13 18:12. Заголовок: Sergey пишет: Еще о..
Sergey пишет:
цитата:
Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам?
Файл FolllowPositions_AddPosition.mqh найти функцию AP_FindAllPositions. Строку:
цитата:
if (OrderType() < 2) // Если найдена позиция
заменить на такую:
цитата:
if (OrderType() < 2 && OrderSymbol() == Symbol()) // Если найдена позиция по текущему инструменту
Sergey пишет:
цитата:
И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе.
Добавить отображение символа можно. Правда, придется немного с форматированием повозиться. А вот для сортировки придется потратить больше времени. Поэтому на данный момент помочь не смогу. Возможно, в будущем накопится критическая масса улучшений для этого скрипта. Тогда этот вопрос будет решен путем выхода очередной статьи.
Она в данном случае бесполезна, т. к. служит для выбора ордера по позиции в списке рабочих ордеров. Вы же, вместо номера позиции, пытаетесь передать тикет уже выбранного ордера. Нужно определить, какие исходные данные для выбора ордера у Вас есть: тикет или порядковый номер. Если нет ни того, ни другого, то нужно идти путем перебора всех ордеров списка и передвижением трала для каждого из них:
цитата:
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY) { // Трал для ордеров Buy }
if (OrderType() == OP_SELL) { // Трал для ордеров Sell } }
Ну а далее нужно просто определиться с условиями трала, т. к. в нынешнем виде условия дублируют друг друга. Например, для классического трала условием является поддержание заданного расстояния в пунктах между ценой и Stop Loss ордера в прибыльной части ордере. Для Buy условие будет такое:
цитата:
if (Bid > OrderOpenPrice() + TS * Point + Point / 10 && OrderStopLoss() < Bid - TS * Point - Point / 10) OrderModify(OrderTicket(), 0, NormalizeDouble(Bid - TS * Point, Digits), OrderTakeProfit(), 0);
Соответственно для Sell:
цитата:
if (Ask < OrderOpenPrice() - TS * Point - Point / 10 && OrderStopLoss() > Ask + TS * Point + Point / 10) OrderModify(OrderTicket(), 0, NormalizeDouble(Ask + TS * Point, Digits), OrderTakeProfit(), 0);
Возможно ли объявить двумерный массив, если колличесто его элементов вычисляется расчетным путем. Если ДА, то как это сделать.
Если воспринимать весь вопрос в совокупности, то ответ однозначно нет. Но, думаю, нужно пояснить имеющиеся возможности.
Проблема заключается в том, что нельзя изменить количество элементов массива во втором измерении и выше. Их всегда нужно указывать на этапе компиляции программы. Но есть возможность изменять количество элементов в первом измерении. Для этого достаточно объявить массив неопределенного размера, а затем изменить его размер уже по ходу выполнения программы:
цитата:
double array[]; // Объявление массива неопределенного размера int start() { int newSize = ...; // Определение нового размера массива int resSize = ArrayResize(array, newSize); // Попытка изменения размера массива if (resSize != newSize) { // Ошибка изменения размера массива. Чаще всего, связано с нехваткой памяти } else { // Успешное изменение размера массива } }
Поэтому в приведенном примере можно поступить просто - транспонировать матрицу (поменять местами столбцы и строки массива):
цитата:
double Mas[][3]; int k = MathGeil(все переменные положительные); - значение !=0 int resSize = ArrayResize(Mas, k); if (resSize != k * 3) { // Ошибка изменения размера массива. Чаще всего, связано с нехваткой памяти } else { // Успешное изменение размера массива }
В тех случаях, когда необходимо определять все измерения массива по ходу программы, рекомендуется использовать одномерные массивы, которые мысленно представлять как многомерные. Например, массив с измерениями 5 (первое измерение - строки) и 6 (второе измерение - столбцы) легко заменяется на массив из 30-и элементов в первом измерении. При этом если нужно обратиться к элементу, находящемуся в третьей строке (т. к. отсчет с нуля, то индекс 2) четвертого столбца (индекс - 3), то производим такие математические действия:
цитата:
2 (индекс строки) * 6 (размер в виртуальном втором измерении) + 3 (индекс столбца) = 15
Подобным образом можно поступать с массивами любых измерений, не ограничиваясь четвертым измерением. К тому же, в памяти массивы хранятся как одномерная последовательность. Поэтому многомерные массивы - это лишь виртуальность программирования. Например, в C++ нет многомерных массивов.
Сообщение: 367
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
1
Отправлено: 02.01.14 16:11. Заголовок: Sergey пишет: Есть ..
Sergey пишет:
цитата:
Есть таблица Excel, как перенести данные ячеек в двумерный массив MQL?
С Новым Годом, Сергей!
Похожий вопрос я встречал ЗДЕСЬ и там были ссылки.
И на сайте MQL4 был код Обмен данными и управление Excel mt4excel.dll - библиотека написанная на Delphi. При вызове DLL, инициализируется библиотека COM.
Перед использованием необходимо вызвать одну из следующих функций: ExcelOpen или ExcelOpenPattern, или ExcelOpenFile.
При вызове происходит создание OLE объекта, открывается Excel, создается новая книга и страница, или по шаблону, или загружается файл Excel (в зависимости от функции). Функция ExcelClose закрывает Excel и осовобождает OLE объект.
Писать и читать можно либо в отдельную ячейку: ExcelSetFormulaCell, ExcelSetValueCell, ExcelSetTextCell, ExcelGetValueCell, ExcelGetTextCell, ExcelGetFormulaCell
Либо в диапазон, предварительно запомнив его функцией ExcelSetRange, затем используя ExcelSetFormula например, или другие функции где требуется диапазон.
Есть ряд вспомогательных функций для управления отображением, информации о формате и т.д. Более подробно - комментарии в примере.
Сообщение: 369
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
1
Отправлено: 04.01.14 18:33. Заголовок: Sergey пишет: У теб..
Sergey пишет:
цитата:
У тебя завидная информационная осведамленность
В 90-х работал технологом в конторе по разработке программных систем. Основная задача - знать какое есть уже готовое ПО, чтобы его использовать, а не изобретать велосипед. А вторая задача - проверка готового ПО на соответствие ТЗ, так что навык остался - быть в курсе у кого и какие программы, и как они работают
Кстати, VNG_nemo в сообщении по обработке биржевых данных тоже давал ссылку на этот софт.
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет