Форум » Консультации по программированию » помогите с кодом » Ответить

помогите с кодом

subinandrei: Пишу индикатор, который рисует линии типа зиг заг на основе анализа уже имеющихся экстремумов зиг зага. Сначала экстремумы собираю в буфера. А вот далее нужно сравнивать пики и впадины и если, например, пики понижаются, то линия зиг зага должна рисоваться вниз, а если впадины повышаются, линия зиг зага идет вверх. Написал вот так: 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; } } } Результат - нулевой. Подскажите, где я ошибаюсь. Заранее - большое спасибо!

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

Sergey: Большое спасибо! Не знал о существовании дельты по времени. Только прочитав Ваш коментарий заметил, что тестирование на Н1 проходило успешно, а на М5 давало ошибку. Код записал себе в блокнот. Еще раз огромное спасибо!

Sergey: Уважаемый Scriptong! Решил использовать Ваш скрипт FollowPositions "Графическое управление торговлей". Весь текст отображается иероглифами. В чем причина и что делать?

Scriptong: Добрый день. Скорее всего, проблема заключается в том, что в ОС нет нужного шрифта. В данном случае это шрифт с именем "Courier". Выходов из ситуации два: 1. Найти такой шрифт в интернете (как ни странно, но у меня его тоже нет; тем не менее, все отображается корректно) и скопировать в папку Fonts, лежащую в папке, где установлена Windows (чаще всего - C:\Windows). 2. Изменить шрифт, используемый программой. Для этого достаточно открыть файл FollowPosistions.mq4, найти именованную константу FONT_NAME (строка 32), указать в этой строке имя другого шрифта и перекомпилировать проект (F5 или F7). Важно, чтобы новый шрифт был моноширинным (такие, как Courier New). В противном случае графика может отображаться с перекосами.


Sergey: Scriptong пишет: 2. Изменить шрифт Огромное спасибо. Все вышло по второму варианту. В ОС шрифт шел как "Courier(TrueType)". Изменил название в скрипте и все столо на свои места. Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам? И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе.

Scriptong: Sergey пишет: Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам? Файл FolllowPositions_AddPosition.mqh найти функцию AP_FindAllPositions. Строку: if (OrderType() < 2) // Если найдена позиция заменить на такую: if (OrderType() < 2 && OrderSymbol() == Symbol()) // Если найдена позиция по текущему инструменту Sergey пишет: И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе. Добавить отображение символа можно. Правда, придется немного с форматированием повозиться. А вот для сортировки придется потратить больше времени. Поэтому на данный момент помочь не смогу. Возможно, в будущем накопится критическая масса улучшений для этого скрипта. Тогда этот вопрос будет решен путем выхода очередной статьи.

Evgeny: Добрый день! Опять я не могу найти свою старую ошибку в трейлинге. Почему не работает? Снова наверное ошибка в скобках или тому подобное. //--- Трейлинг BUY---------------- OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); { if (OrderTicket()!=0 && OrderType()==OP_BUY && Bid>OrderOpenPrice()+TS*Point && Bid>OrderStopLoss()+TS*Point && Bid>OrderStopLoss()+ST*Point) { TiketBuy=OrderTicket(); OrderModify(TiketBuy,OrderOpenPrice(),Ask-TS*Point,0,0,CLR_NONE); } } //--- Трейлинг SELL---------------- OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); { if (OrderTicket()!=0 && OrderType()==OP_SELL && Ask<OrderOpenPrice()-TS*Point && Ask<OrderStopLoss()-TS*Point && Ask<OrderStopLoss()-ST*Point) { TiketSell=OrderTicket(); OrderModify(TiketSell,OrderOpenPrice(),Ask-TS*Point,0,0,CLR_NONE); } } Ордера BUY тралит, а SELL нет.

Scriptong: Здесь сразу бросается в глаза вот эта функция: OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); Она в данном случае бесполезна, т. к. служит для выбора ордера по позиции в списке рабочих ордеров. Вы же, вместо номера позиции, пытаетесь передать тикет уже выбранного ордера. Нужно определить, какие исходные данные для выбора ордера у Вас есть: тикет или порядковый номер. Если нет ни того, ни другого, то нужно идти путем перебора всех ордеров списка и передвижением трала для каждого из них: 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);

Evgeny: Спасибо!

Sergey: Возможно ли объявить двумерный массив, если колличесто его элементов вычисляется расчетным путем. Если ДА, то как это сделать. Пример ошибки: int k=MathGeil(все переменные положительные); - значение !=0 double Mas[3][k]; Ошибка: k - integer number expected ] - comma or semicolon expected Mas - variable not defined

Scriptong: Sergey пишет: Возможно ли объявить двумерный массив, если колличесто его элементов вычисляется расчетным путем. Если ДА, то как это сделать. Если воспринимать весь вопрос в совокупности, то ответ однозначно нет. Но, думаю, нужно пояснить имеющиеся возможности. Проблема заключается в том, что нельзя изменить количество элементов массива во втором измерении и выше. Их всегда нужно указывать на этапе компиляции программы. Но есть возможность изменять количество элементов в первом измерении. Для этого достаточно объявить массив неопределенного размера, а затем изменить его размер уже по ходу выполнения программы: 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++ нет многомерных массивов.

Sergey: Большое спасибо за подробный ответ. Многого из сказанного нет в учебниках. Буду изучать. Пака вышел из ситуации так. int k=MathGeil(все переменные положительные); - значение !=0 double Mas[3][1000]; for (int i=0; i<=k; i++) - цикл заполнения второго измерения, где k<< 1000 С уважением!

Sergey: Есть таблица Excel, как перенести данные ячеек в двумерный массив MQL?

Genry: 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 например, или другие функции где требуется диапазон. Есть ряд вспомогательных функций для управления отображением, информации о формате и т.д. Более подробно - комментарии в примере. Для создания диаграммы функция ExcelSetDiagramma.

Sergey: Genry пишет: И на сайте MQL4 был код Обмен данными и управление Excel Спасибо Genry, кажется то, что нужно. Буду разбираться. У тебя завидная информационная осведамленность. Так держать! Удачи в новом году!

Genry: Sergey пишет: У тебя завидная информационная осведамленность В 90-х работал технологом в конторе по разработке программных систем. Основная задача - знать какое есть уже готовое ПО, чтобы его использовать, а не изобретать велосипед. А вторая задача - проверка готового ПО на соответствие ТЗ, так что навык остался - быть в курсе у кого и какие программы, и как они работают Кстати, VNG_nemo в сообщении по обработке биржевых данных тоже давал ссылку на этот софт. Sergey пишет: Удачи в новом году! Взаимно!



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