Интересная тема для многих: что будет нового в MetaTrader 4 и MQL4 - большие изменения на подходе - страница 66

 
TheXpert:
Если ты делаешь такой вывод из написанного... значит ты тоже ничего не понял )

Ну вот что ты будешь делать?! Придет, пару слов сказанёт - и всё, пару ночей бессонных обеспечено. )

Пост был не мне, но я тоже теперь спать не буду.

 
MetaDriver:

 ( Утверждать что таковые существуют, значит утверждать что существуют какие-либо торговые горизонты, на которых H-волатильность устойчиво больше 2.0 ) 

ну это вообще грааль трендовый. Как и устойчиво меньше 2х. Таких инструментов нет, чтобы H-вола по всему ряду была устойчиво меньше или больше 2. На отдельных участках/ в отдельные моменты. Знать когда торговать тренд, когда возврат. Фильтровать базар))
 
hrenfx:

Мне для новой торговли понадобилось улучшить свой тестер. Разбираться в коде старого - больше времени потерять (несколько недель убил - подходы время от времени), чем написать новый.

Итак, с нуля написание нового тестера у меня заняло 5 часов (с отладкой). Его характеристики (меня удовлетворяют, как старт):

  • Работает с побаровой моделью M1 HighBid + LowAsk (результаты точнее, чем в MT5-тестере).
  • Один символ.
  • Скорость (i7 2700K) около 100 000 000 баров в секунду (277 лет FOREX в секунду) на тестовой ТС - не пустышка, много всего вычисляется. Постоянно в рынке.  
  • Отсутствует ММ - нет лотов.
  • Профит только в пипсах.
  • Возможность регулирования величины среднего проскальзывания и комиссии.
  • Оптимизатор со своими критериями оптимизации - по каждому создается свой файл (гигабайты может занимать) с отсортированными строчками прогонов.
  • В тестере нет никаких проверок на ошибки - знаю все нюансы своего тестера, поэтому не допускаю.
  • ТС пишется на немного урезанном MQL4 - выкинуто ненужное. Но можно использовать всю мощь C++.
  • Тестер написан без ООП - не умею грамотно. Т.е. практически чистый язык C.
  • Исходники на free C++ ~ 20Кб.
  • Выкинуты стопы и маркеты (OrderClose оставлен) - не нужны.
  • Каждый прогон (по выбору - номер прогона указать) можно визуализировать и изучать в мат. пакете - файл изменения Equity и Balance записывает просто.
  • Никакой генетики.
  • OpenCL отсутствует - не умею.
  • Однопоточный. Загрузка всех ядер тупая - несколько оптимизаторов вручную запустить.
  • Консольное приложение.
  • Входные параметры ТС, настройки тестера и диапазоны оптимизации задаются в файле.
  • ТС компилируется вместе с тестером в единый EXE-файл.
  • Перед запуском имеются всего три фала: EXE, история, настройки.
  • В оптимизаторе сделано прерывание прогона, если текущее состоянее прогона не удовлетворяет условиям (например, просадка слишком высока).
  • Историю для тестера подготавливает MQL4-скрипт - написан давно.
  • Никакого динамического выделения памяти под ордерную таблицу - один раз выделил память и забыл.
  • Никаких логов - не смотрю.
  • Никакой ордерной истории - аналогично.
  • Нет понятия индикаторов и всего, что с ним связано - для ТС не нужно.
  • Цены целочисленные (long int).

Если такую же ерунду запилить на MQL5, то можно использовать Cloud в режиме мат. оптимизации. Только пересылать историю каждый раз придется - тут необходимо штатное сжатие такой инфы.

Итого теоретически можно добиться скорости ~ 100 млрд баров в секунду (на тестовой ТС). Интересно, какова производительность MT5-тестера на всем облаке в тех же попугаях?

100 млрд баров в секунду - хорошая скорость для различного рода исследований. Если перевести в другие единицы, то это скорость говорит о том, что год минутной истории FOREX по одному символу за секунду прогоняется ~ 300 000 раз.

Большая часть времени ушла на изучение синтаксиса языка - гуглил просто. Не программист.

Сразу скажу, писать универсальный фреймворк под свои скромные нужды - огромная потеря времени. Лучше исследовать. Если что-то понадобится учитывать - просто дописать.

Это только ядро, теперь нужен хитрый инструментарий для оптимизатора. Здесь времени уйдет значительно больше - думать надо.

Вот читаю я все это и приходит мне на ум что либо человек совсем потерялся в потоках собственного сознания, либо по крайней мере половина из того, что он писал простая и обыкновенная ложь.

Программист самоучка без глубоких знаний языка за несколько часов написал однопоточный тестер с производительностью 100 000 000 баров в секунду? Для контраста: люди высочайшего уровня профессионализма тратят годы на создание грамотного, высокопроизводительного HFT тестера, создают целые команды для работы с ним и наполнением стратегиями, а здесь один человек решил на коленке собрать тестер и тут же получил производительность на порядок выше, производительности ведущих (закрытых) HFT платформ. 

Давайте просто посчитаем, какой пропускной способностью должна обладать память, что бы можно было прогонять 100 000 000 баров в секунду. Каждый бар это 4 цены + AskLow HighBid, что дает в итоге 6 целочисленных типов с длинной 64 бита каждый ( Цены целочисленные (long int) ). Для 100 000 000 баров в секунду потребуется

64 бита * 6 цен * 100 000 000 баров = 38 400 000 000 бит = 4 800 000 000 байт = 4 577 Мбайт в секунду.


 Это означает, что такой производительность фундаментально и чисто теоретически можно добиться на модулях памяти уровня DDR2 533 и выше. По крайней мере заявленная производительность сопоставима с физическим пределом современного оборудования.

Но программные временные затраты накладывают еще более существенные ограничения. Их нельзя игнорировать. Поэтому я взял быстрый 64 разрядный компилятор Си Win-Lcc 64 и измерил производительность прямого перебора массива баров, без тяжелых математических рассчетов. Прошу заметить: речь идет о прямом, т.е. самом быстром переборе. Без работы с окружением и прочими накладными расходами. В отличии от хренфикса, я привожу полный исходный код моего "тестера стратегий", что бы любой желающий мог скомпилировать его и измерить производительность в своем любимом компиляторе:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define LAPS 10000              //Количество серий
#define ELEMENTS 10000          //Количество баров в одной серии
#define INVOKE                  //Определено, если требуется эмулировать
                                //вызов функции

//Представление бара
struct bar
{
        long long Open;
        long long High;
        long long Low;
        long long Close;
        long long AskLow;
        long long BidHigh;
};

int main(void)
{
        struct bar bar_array[ELEMENTS];
        //Общее время выполнения стратегии
        clock_t eleps_time = 0;
        //Общее время выполения
        clock_t total_time = 0;
        //К сожалению заявленный объем памяти (100 000 000 баров) выделить не удалось,
    //поэтому выделяем память порциями, 1000 раз, по 100 000 баров за раз.
        clock_t ttime = clock();
        for(int lap = 0; lap < LAPS; lap++)
        {
                //Заполняем бары случайными числами
                for(int i = 0; i < ELEMENTS; i++)
                {
                        bar_array[i].Open = (long long)rand();
                        bar_array[i].High = (long long)rand();
                        bar_array[i].Low = (long long)rand();
                        bar_array[i].Close = (long long)rand();
                        bar_array[i].AskLow = (long long)rand();
                        bar_array[i].BidHigh = (long long)rand();
                        //if(i < 5)
                        //      printf("%i\n", bar_array[i].High);
                }
                //Эмулируем работу ТС c массивом котировок
                //Рассчитываем время на выполнение этого блока и суммируем его, получая общее время
                //выполнения
                clock_t btime = clock();
                //Наша стратегия будет проверять простое соответствие проверяемого бара настоящему.
                //Настоящий бар, это бар чей high > open, low, close а low < high, open, close
                int signal = 0;

                for(int i = 0; i < ELEMENTS; i++)
                {
                        #ifndef INVOKE
                        if( bar_array[i].High > bar_array[i].Low &&
                            bar_array[i].High > bar_array[i].Open &&
                                bar_array[i].High > bar_array[i].Close)
                                signal++;
                        #endif
                        #ifdef INVOKE
                        signal += TradeSystem(&bar_array[i]);
                        #endif
                }
                eleps_time += clock() - btime;
        }
        printf("Bars was worked: %i\n", LAPS*ELEMENTS);
        //Печатаем общее время выполнения
    double timedif = ((double)clock() / (double)CLOCKS_PER_SEC);
    printf("Bars %f seconds\n", timedif);
        //Печатаем время выполнения торговой системы
        double eleps_diff = (double)eleps_time / (double)CLOCKS_PER_SEC;
        printf("The TradeSystem time is %f seconds\n", eleps_diff);
        printf("The Eleps tik is %i tiks\n", eleps_time);
        return 0;
}
//
// Функция торговой системы. Принимает на вход бар,
// обрабатывает его и возвращает целочисленный результат
int TradeSystem(struct bar &cbar)
{
        if( cbar.High > cbar.Low &&
                cbar.High > cbar.Open &&
                cbar.High > cbar.Close)
                                return 1;
        return 0;
}

Видно, что этот код, в зависимости от директивы Invoke либо перебирает массив и выполняет простое сравнение (очень быстрая операция), либо вызывает функцию, которая выполняет это же сравнение.

Теперь посмотрим, сколько времени понадобилось этому коду, что бы перебрать и сравнить 100 000 000 баров:

 

Видно что прямой перебор 100 000 000 баров занял 1,28 секунды, что почти на треть хуже заявленной производительности.

Видно что перебор 100 000 000 баров с вызовом расчетной функции на каждом баре занял 1,79 секунды, что более чем в 1.5 раза хуже заявленной производительности.

Все тесты выполнялись на железе   i7 870, DDR3 3200 8 Gb.

Большую часть времени при этом заняла собственно подготовка данных (около 9 секунд). Что при малейшей неоптимальности в проектировки оптимизатора выльется в гигантские накладные расходы. Но я не стал учитывать это время, т.к. речь шла исключительно об прогоне стратегии.

Выводы делаете сами. Я надеюсь на цифрах показал, что заявленный результат, мягко говоря не соответствует реалиям. Даже теоретическая производительность кода описывающая оптимизатор не соответствует заявленной.  Если же реализовать реальный тестер приближающейся к функционалу заявленного производительность упадет еще ниже, т.к. любой вызов функции, любые мало-мальски полезные математические рассчеты, сразу снизят время голого перебора.

 

 
Avals:
ну это вообще грааль трендовый. Как и устойчиво меньше 2х. Таких инструментов нет, чтобы H-вола по всему ряду была устойчиво меньше или больше 2. На отдельных участках/ в отдельные моменты. Знать когда торговать тренд, когда возврат. Фильтровать базар))

Именно!  Но таки в этом случае мы приходим к торговле лимитниками как к конечной фазе развития идеальной торговой системы. 

А теперь подумай мозгом, если "идеальная" система обязана торговать лимитниками, то с какой стати реальная должна торговать маркетами или стопами?  Из скромности? ;)

 
MetaDriver:

Именно!  Но таки в этом случае мы приходим к торговле лимитниками как к конечной фазе развития идеальной торговой системы

это как ты пришёл?))) Для mr систем, которые эффективны на возвратном рынке H<2 (H-вола грубая оценка и средняя по очень большой больнице) выгодно лимитами. На трендовом (H>2) маркетами/стопами. И почему это идеальная система должна торговать лимитами? Идеальная mr да. Но реальные инструменты есть смесь участков трендовых и флетовых разного масштаба (а в среднем по больнице получим H=2). Поэтому подумай мозгом, что идеальная система не одна)) А реальных и того больше
 
C-4: ... Каждый бар это 4 цены + AskLow HighBid, что дает в итоге 6 целочисленных типов с длинной 64 бита каждый ( Цены целочисленные (long int) ).

Как вы из 2 чисел получили 6 ?

hrenfx: ... Работает с побаровой моделью M1 HighBid + LowAsk (результаты точнее, чем в MT5-тестере).

К тому же зачем шесть, если 4 цены - это цены по биду ( уже включают HighBid )

 
MetaDriver:

Именно!  Но таки в этом случае мы приходим к торговле лимитниками как к конечной фазе развития идеальной торговой системы. 

А теперь подумай мозгом, если "идеальная" система обязана торговать лимитниками, то с какой стати реальная должна торговать маркетами или стопами?  Из скромности? ;)

Еще раз:

 

Avals:

 вот именно, что разница большая. Если в кратце, то 2 типа стратегий - возвратные (mean reversion) и противпоположный поступательные (моментум).  Смысл входа/выхода у  моментум в сторону движения у mr против. Пробойные это только один из видов вторых (по уровню входа на пробой).  И вторые системы не переделаешь на лимитники. Если можно, то это по сути совмещение в одном флаконе 2 этих типа систем на разных масштабах (tf грубо), что редко случается. 

Платформа вроде как затачивается под разные рынки и инструменты, а нетолько FX в столовках))

понял и про то, что ничего менять кроме спреда для этого не нужно написал 2013.08.10 05:47, после чего он оформил это в свою гениальную мысль)) Элементарное следствие из его запросов

свет клином сошёлся на этом классе стратегий, чтобы для них менять формат хранимой истории? Это опять же для стратегий класса mr у которых вход/выход лимитами.

Поэтому херня это подгонять историю и платформу под один класс стратегий.

Нужен либо нормальный тиковый тестер, либо возможность юзерам самим собирать из тиков и подсовывать тестеру свою историю с tf<1мин. Тогда желающие могут подсунуть историю с  LowAsk -- HighBid, или HighAsk --- LowBid для противоположного класса стратегий. Или более краткосрочные стратегии протестить, для которых минуток мало (не для FX в столовках конечно) 

Т.е. Это Вы приходите к торговле лимитниками, но не надо всех чесать под одну гребенку. Лично я торгую моментум и использую входы по рынку. Думаете не пробовал лимитники прикрутить к своим пробойным ТС? Пробывал! Думаете тиковая история что-либо изменила? Есть у меня тиковая история и левел 2 есть, но ничего это не изменило в плане производетльности ТС, наоборот, с заменой на лимитники общая прибыль и мат. ожидание сильно упали, подчеркиваю еще раз: сильно упали.

И только не надо сейчас про идеальную ТС и какой она должна быть. У каждого свое понимание этого, каждый из нас собаку съел на этом и знает о чем он пишет и что такое ТС. 

Главная ошибка тех, кто пропагандирует так лимитки в том, что они думают что подать заявку по лучшей цене является синонимом заключения сделки по лучшей цене. В реальности нет понятия лучшей цены. Если Ваш лимитник сработал, рынок отскочил от прежнего уровня. Но есть только текущая цена, вы же почему-то помните старую цену и думаете что текущая цена лучше старой, хотя это не так.

 
C-4:

Вот читаю я все это и приходит мне на ум что либо человек совсем потерялся в потоках собственного сознания, либо по крайней мере половина из того, что он писал простая и обыкновенная ложь.

Программист самоучка без глубоких знаний языка за несколько часов написал однопоточный тестер с производительностью 100 000 000 баров в секунду? Для контраста: люди высочайшего уровня профессионализма тратят годы на создание грамотного, высокопроизводительного HFT тестера, создают целые команды для работы с ним и наполнением стратегиями, а здесь один человек решил на коленке собрать тестер и тут же получил производительность на порядок выше, производительности ведущих (закрытых) HFT платформ. 

Давайте просто посчитаем, какой пропускной способностью должна обладать память, что бы можно было прогонять 100 000 000 баров в секунду. Каждый бар это 4 цены + AskLow HighBid, что дает в итоге 6 целочисленных типов с длинной 64 бита каждый ( Цены целочисленные (long int) ). Для 100 000 000 баров в секунду потребуется

 Это означает, что такой производительность фундаментально и чисто теоретически можно добиться на модулях памяти уровня DDR2 533 и выше. По крайней мере заявленная производительность сопоставима с физическим пределом современного оборудования.

Но программные временные затраты накладывают еще более существенные ограничения. Их нельзя игнорировать. Поэтому я взял быстрый 64 разрядный компилятор Си Win-Lcc 64 и измерил производительность прямого перебора массива баров, без тяжелых математических рассчетов. Прошу заметить: речь идет о прямом, т.е. самом быстром переборе. Без работы с окружением и прочими накладными расходами. В отличии от хренфикса, я привожу полный исходный код моего "тестера стратегий", что бы любой желающий мог скомпилировать его и измерить производительность в своем любимом компиляторе:

Видно, что этот код, в зависимости от директивы Invoke либо перебирает массив и выполняет простое сравнение (очень быстрая операция), либо вызывает функцию, которая выполняет это же сравнение.

Теперь посмотрим, сколько времени понадобилось этому коду, что бы перебрать и сравнить 100 000 000 баров:

 

Видно что прямой перебор 100 000 000 баров занял 1,28 секунды, что почти на треть хуже заявленной производительности.

Видно что перебор 100 000 000 баров с вызовом расчетной функции на каждом баре занял 1,79 секунды, что более чем в 1.5 раза хуже заявленной производительности.

Все тесты выполнялись на железе   i7 870, DDR3 3200 8 Gb.

Большую часть времени при этом заняла собственно подготовка данных (около 9 секунд). Что при малейшей неоптимальности в проектировки оптимизатора выльется в гигантские накладные расходы. Но я не стал учитывать это время, т.к. речь шла исключительно об прогоне стратегии.

Выводы делаете сами. Я надеюсь на цифрах показал, что заявленный результат, мягко говоря не соответствует реалиям. Даже теоретическая производительность кода описывающая оптимизатор не соответствует заявленной.  Если же реализовать реальный тестер приближающейся к функционалу заявленного производительность упадет еще ниже, т.к. любой вызов функции, любые мало-мальски полезные математические рассчеты, сразу снизят время голого перебора.

 

Цифры конечно вещь упрямая, да и оратор всё правильно говорит, но давайте посмотрим на это с другой стороны, дебошир это не дебошир, а крупный научный работник, приехал к нам в гости, собирать так сказать поговорки пословицы, тосты ... ну и немного пере (в) брал

Так что мы имеем дело с несчастным случаем на производстве ... :)

Короче не по рыцарски это пинать сидящего в бане, он ведь не ответит.

 
C-4:

Вот читаю я все это и приходит мне на ум что либо человек совсем потерялся в потоках собственного сознания, либо по крайней мере половина из того, что он писал простая и обыкновенная ложь.

Программист самоучка без глубоких знаний языка за несколько часов написал однопоточный тестер с производительностью 100 000 000 баров в секунду? Для контраста: люди высочайшего уровня профессионализма тратят годы на создание грамотного, высокопроизводительного HFT тестера, создают целые команды для работы с ним и наполнением стратегиями, а здесь один человек решил на коленке собрать тестер и тут же получил производительность на порядок выше, производительности ведущих (закрытых) HFT платформ.

Ты когда-нибудь разбирал коды hrenfx'a(getch в прошлой жизни) ?  Очень рекомендую посмотреть все его работы в кодобазе 4-го форума, и пару-тройку тщательно разобрать до полного понимания алгоритмов.  И всей твоей высококонтрастной бригаде "людей высочайшего уровня профессионализма"  очень советую сделать то же самое.  Может бредить поменьше будете насчёт интеллектуальных возможностей Ивана и займётесь повышением своей собственной  квалификации.


....................

Выводы делаете сами. Я надеюсь на цифрах показал, что заявленный результат, мягко говоря не соответствует реалиям. Даже теоретическая производительность кода описывающая оптимизатор не соответствует заявленной.  Если же реализовать реальный тестер приближающейся к функционалу заявленного производительность упадет еще ниже, т.к. любой вызов функции, любые мало-мальски полезные математические рассчеты, сразу снизят время голого перебора.

Ни фига ты в цифрах не показал, у тебя в барах по три тика, а у него по одному - только LoAsk и HiBid - что он как раз очень долго тут и пропогандировал.  Так что если из цикла выкинуть два лишних сравнения и поотключать в компиляторе проверки диапазонов (RangeCheck), то заявленная цифра уже выглядит вполне реалистичной, даже с полезными (минимальными) расчётами внутри цикла. 
 
Avals:
У тебя стопы ни разу на полфигуры не скользили?
Причина обращения: