Как использовать DLL в программе для Маркета?

 

Привет, коллеги!

Пишу тикового робота на MQL4, получается довольно много вычислений, в основном свертки сигналов, вейвлеты и кое-что еще из области DSP. Конечно, компилятор MQL4, начиная с 600-го билда нехило так улучшили в части скорости работы *.ex4, но все равно на тестере тормозит, про оптимизатор вообще молчу. Начал выносить всю тяжелую математику в DLL, компилирую в Intel Parallel Studio 2015, ожидаю ускорение минимум на порядок, так как компилятор использует все модные векторные расширения процов от Intel.

Про любителей AMD говорить пока не будем, как говориться, им не повезло, а с неудачниками мы не работаем)) Хотя, есть библиотека Yeppp!, у AMD тоже есть своя ACML.  Вопрос не в этом. Как мне присобачить эту DLL и набор DLL от Intel к роботу, который планируется для продажи в Маркете? Ведь в нем DLL запрещены.

Вижу пока лишь один вариант. Математику выносим в библиотеку, например MQL4\Libraries\MyMath.ex4. Для маркета поставляется библиотека-пустышка, все вычисления делаются в советнике. Если пользователь хочет, он может скачать библиотеку для работы с DLL с моего сайта плюс набор DLL. Библиотека с таким же именем, как и пустышка, в ней обертки для вызова функций из DLL. Да, будет задержка на вызовах, но для моих расчетов это копейки. В настройках советника можно указать, какой вариант использовать.

Таким образом можно обойти ограничения Маркета, или я что-то упустил? Интересно ваше мнение.

 
VDev:

Привет, коллеги!

Пишу тикового робота на MQL4, получается довольно много вычислений, в основном свертки сигналов, вейвлеты и кое-что еще из области DSP. Конечно, компилятор MQL4, начиная с 600-го билда нехило так улучшили в части скорости работы *.ex4, но все равно на тестере тормозит, про оптимизатор вообще молчу. Начал выносить всю тяжелую математику в DLL, компилирую в Intel Parallel Studio 2015, ожидаю ускорение минимум на порядок, так как компилятор использует все модные векторные расширения процов от Intel.

Про любителей AMD говорить пока не будем, как говориться, им не повезло, а с неудачниками мы не работаем)) Хотя, есть библиотека Yeppp!, у AMD тоже есть своя ACML.  Вопрос не в этом. Как мне присобачить эту DLL и набор DLL от Intel к роботу, который планируется для продажи в Маркете? Ведь в нем DLL запрещены.

Вижу пока лишь один вариант. Математику выносим в библиотеку, например MQL4\Libraries\MyMath.ex4. Для маркета поставляется библиотека-пустышка, все вычисления делаются в советнике. Если пользователь хочет, он может скачать библиотеку для работы с DLL с моего сайта плюс набор DLL. Библиотека с таким же именем, как и пустышка, в ней обертки для вызова функций из DLL. Да, будет задержка на вызовах, но для моих расчетов это копейки. В настройках советника можно указать, какой вариант использовать.

Таким образом можно обойти ограничения Маркета, или я что-то упустил? Интересно ваше мнение.

Если не ошибаюсь в обсуждении продукта можно прикрепить файлы... DLL+ZIP и вперед. Но х.з. на маркете пройдет такой номер или нет. Я стараюсь избавляться от громоздких вычислений, а использовать в конечном продукте лишь результаты. Разумеется если это представляется возможным. 

 
elugovoy:

Если не ошибаюсь в обсуждении продукта можно прикрепить файлы... DLL+ZIP и вперед. Но х.з. на маркете пройдет такой номер или нет. Я стараюсь избавляться от громоздких вычислений, а использовать в конечном продукте лишь результаты. Разумеется если это представляется возможным. 

Ну, я думаю, даже если нельзя прикрепить файлы, ссылку на них убивать не будут. В конце концов, запишу видео на ютубе, а в нем дам ссылку ). Видео на маркет можно выкладывать. Не понял, как использовать результаты вычислений без самих вычислений? Например, у меня считаются фильтры по таймеру раз в секунду, а свертка реально много жрет. Сам алгоритм простейший, основная нагрузка на цикле for и на MQL его уже не оптимизировать лучше того, что ниже. А у Intel есть в библиотеке функции по реализации фильтров, которые задействуют векторные инструкции и распараллеливание на ядра.

    double  FilterTick(double tick)
    {
        TickBuf[TickBufIdx] = tick;
        if (TickBufIdx == 0)
            TickBufIdx = TICK_BUF_MAX_IDX;
        else
            TickBufIdx--;
        int asize = ArraySize(Coeff); // вынести из функции!!!
        double acc = 0;
        int tbIdx = TickBufIdx;
        // делаем фильтрацию в цикле for
        for (int n = 0; n < asize; n++)
        {
            tbIdx++;
            /* вместо
            if(tbIdx > TICK_BUF_MAX_IDX)
            tbIdx = 0;
            */
            tbIdx &= TICK_BUF_MAX_IDX; // небольшая оптимизация вместо if
            acc += TickBuf[tbIdx] * Coeff[n];
        }
        OutBuf[OutBufIdx] = acc;
        OutBufIdx++;
        OutBufIdx &= OUT_BUF_MAX_IDX;
        return acc;
    }
 
VDev:

Ну, я думаю, даже если нельзя прикрепить файлы, ссылку на них убивать не будут. В конце концов, запишу видео на ютубе, а в нем дам ссылку ). Видео на маркет можно выкладывать. Не понял, как использовать результаты вычислений без самих вычислений? Например, у меня считаются фильтры по таймеру раз в секунду, а свертка реально много жрет. Сам алгоритм простейший, основная нагрузка на цикле for и на MQL его уже не оптимизировать лучше того, что ниже. А у Intel есть в библиотеке функции по реализации фильтров, которые задействуют векторные инструкции и распараллеливание на ядра.

Просто реализуйте ленивые вычисления по кускам.

То есть, досчитываете сколько вам надо и только после окончания расчетов начинайте работать. Не надо одним куском считать, если данных много.

Скоро будет очередной апгрейд оптимизатора языка с серьезным ускорением. Планируем приблизиться к скорости C++.

 
Renat:

Просто реализуйте ленивые вычисления по кускам.

То есть, досчитываете сколько вам надо и только после окончания расчетов начинайте работать. Не надо одним куском считать, если данных много.

Скоро будет очередной апгрейд оптимизатора языка с серьезным ускорением. Планируем приблизиться к скорости C++.

Ленивые никак не помогут. На реале и так все работает нормально, ускорение нужно именно для тестера и особенно для оптимизации. Про апгрейд компилятора отличная новость!
 

Извините что влез в тему

Я перловщик, он компилится  в с# и в COM dll, я так понимаю что к mt4 не прикрутишь ?

c# дает ошибку, а COM  делает вид что его нет.

 
agdam:

Извините что влез в тему

Я перловщик, он компилится  в с# и в COM dll, я так понимаю что к mt4 не прикрутишь ?

c# дает ошибку, а COM  делает вид что его нет.

Влез в тему... у нас вход рубль, а выход вперед ногами))) А по теме, DLL на шарпе подключить напрямую нельзя, это .NET и совсем другой формат DLL. Надо делать DLL с оберткой функций на обычном С++, которая грузит шарповскую и через обертки вызывает ее функции. Гемор еще тот, имеет смысл, когда на шарпе сделан класс, который реализует что-то большое и красивое, например, всю стратегию.

COM виден тоже не будет, решение такое же.

Из МТ4/5 видны только DLL старого формата, которые разработаны во времена Win 95/NT4. Я думаю, проще с перла переписать на Си/С++, прилагаю проект примера DLL для Visual Studio, в новых версиях МТ4 его почему-то убрали.

Файлы:
 
VDev:

COM виден тоже не будет, решение такое же.

Из МТ4/5 видны только DLL старого формата, которые разработаны во времена Win 95/NT4. Я думаю, проще с перла переписать на Си/С++, прилагаю проект примера DLL для Visual Studio, в новых версиях МТ4 его почему-то убрали.

Спасибо погляжу, а жаль, на перле все так просто :( хоть говори на нем :)
 
agdam:
Спасибо погляжу, а жаль, на перле все так просто :( хоть говори на нем :)

Так все равно вам надо писать и на MQL4/5, а эти языки очень близки к С/С++. Так что по любому С/С++ надо знать. DLL можно написать в виде набора обычных функций, без классов. Именно так и сделан пример, который я ранее приаттачил.

Visual Studio советую поставить не Express, она бесплатная, но много ограничений. Лучше всего 2013 Ultimate.

А от перла меня, как и 90 процентов программистов, передергивает ))) Как железом по стеклу)) 

 

VDev:

/* вместо
if(tbIdx > TICK_BUF_MAX_IDX)
tbIdx = 0;
*/
tbIdx &= TICK_BUF_MAX_IDX; // небольшая оптимизация вместо if

А почему вы решили, что можно делать такую замену?  Тут же разные результаты получаются.

Возьмите например   tbIdx=63,  TICK_BUF_MAX_IDX=128.   По первому варианту получите  tbIdx=63, по второму tbIdx=0.

 
meat:

А почему вы решили, что можно делать такую замену?  Тут же разные результаты получаются.

Возьмите например   tbIdx=63,  TICK_BUF_MAX_IDX=128.   По первому варианту получите  tbIdx=63, по второму tbIdx=0.

Сорри, надо было дефайны тоже включить. Когда tbIdx==TICK_BUF_SIZE, получается tbIdx &= TICK_BUF_MAX_IDX; => tbIdx == 0. Как вы поняли, это для работы с входным кольцевым буфером. Вообще, это из старого кода, когда я сочинял софт для слабеньких процов, типа для карманных плейров, там приходилось каждый такт экономить. На современных, скорее всего, будет срабатывать предсказание переходов в обычном if ))

#define TICK_BUF_SIZE       0x1000              // 4096
#define TICK_BUF_MAX_IDX    (TICK_BUF_SIZE - 1) // 0x0FFF
#define OUT_BUF_SIZE        0x10000             // 65536
#define OUT_BUF_MAX_IDX     (OUT_BUF_SIZE - 1)  // 0xFFFF   
Причина обращения: