Forex / Форекс Инвестиции, доверительное управление, интернет трейдинг – NEUIMEX ::Обучение MQL : MQL Support
NEUIMEX TEAM
   
FOREX FUTURES CFD's АНАЛИТИКА

EN | DE
Компания
Главная страница
О компании
Международные офисы
Клиентам
Открыть счёт
Демо счёт
Конкурс Трейдеров
Пополнить счёт
Отзыв средств
Платформы
NEXTT Trading Terminal
NEXTT Signal Base
NEXTT PDA Terminal
Как связаться
Обратная связь
Швейцария >>
Германия >>
Россия >>

MQL II Support
Советиники Форма Заказа

Содержание | назад | далее   
 

Написание и тестирование экспертов в торговой системе Neurex Direct имеет ряд особенностей.

  • Перед тем как открыть позицию необходимо проверить, есть ли свободные деньги на счету. Если денег на счету недостаточно, то операция по открытию позиции закончится неудачно. При этом только при тестировании значение FreeMargin должно быть обязательно не меньше 1000, поскольку при тестировании цена одного лота составляет 1000.
    If FreeMargin < 1000 Then Exit; // денег нет - выходим

  • После открытия, закрытия или изменения позиции или после удаления отложенного ордера (после любой из команд SetOrder, CloseOrder, ModifyOrder или DeleteOrder) рекомендуется завершить выполнение программы-эксперта инструкцией Exit, т.к. после совершения операции наступает 10-ти секундный таймаут на совершение торговых операций. При этом при тестировании данный 10-ти секундный таймаут не действует (можно совершить несколько операций подряд), и, если после совершения операции не завершить выполнение эксперта инструкцией Exit, результаты тестирования могут отличаться от результатов реальной торговли экспертом.
    SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // исполняем
    Exit; // выходим

    Чтобы предотвратить при тестировании возможность совершения нескольких торговых операций с интервалом менее 10-ти секунд также можно перед совершением очередной торговой операции проверить, что с момента совершения последней торговой операции прошло не менее 10 секунд.
    // проверяем, что текущее время больше времени совешения последней операции более чем не 10 секунд
    If CurTime > LastTradeTime + 10 Then Begin
        SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // исполняем
        Exit;
    End;

  • Доступ к историческим данным можно получить используя индексированные предопределенные переменные Close, High, Low, Volume. Индексом при этом является количество периодов, которое необходимо отсчитать назад.
    // если Close на прошлом баре меньше чем Close на позапрошлом баре
    If Close[1] < Close[2] Then Exit;

  • Тестирование экспертов в торговой системе Neurex Direct поддерживает 4 модели.
    • OHLC points (High/Low/Close). При тестировании эксперта используются только цены High, Low, Close. Данная модель тестирования наиболее быстрая. Однако результаты тестирования могут отличаться от результатов реальной торговли экспертом.
    • Every 3 points. При тестировании эксперта моделируется развитие свечи с шагом в 3 пункта.
    • Every 2 points. При тестировании эксперта моделитуется развитие свечи с шагом в 2 пункта.
    • Every 1 point. При тестировании эксперта моделирутся развитие свети с шагом в 1 пункт. Данная модель тестирования наиболее медленная. При этом результаты тестирования идентичны результатам реальной торговли экспертом (при соблюдении 10-ти секундного интервала между совершением торговых операций).

  • При написании и тестировании эксперта, также как и при тестировании любой другой программы, бывает необходим вывод некоторой дополнительной отладочной информации. Язык MQL II предоставляет несколько возможностей для вывода такой информации.
    • Функция Alert выводит на экран диалоговое окно, содержащее определённые пользователем данные.
      Alert("Free margin is ", FreeMargin);
    • Функция Comment выводит в левый верхний угол графика определённые пользователем данные. Символьная последовательность "\n" используется для перевода строки.
      Comment("Free margin is ", FreeMargin, "\nEquity is ", Equity);
    • Функция Print> печатает определённые пользователем данные в системный журнал.
      Print("Total trades are ", TotalTrades, "; Equity is ", Equity, "; Credit is ", Credit);
    • Функция PrintTrade выводит в журнал данные об указанной позиции.
      PrintTrade(1);

  • При тестировании эксперта результаты тестирования записываются в файл с расширением .log в поддиректорию logs директории, в которую вы установили торговую систему Neurex Direct. При частом тестировании экспертов не забывайте периодически удалять log файлы, которые могут иметь размер несколько мегабайт.

  • Бывают ситуации, когда необходимо произвести большую подготовительную работу перед началом работы эксперта. Настолько большую, что эксперт принудительно завершается с ошибкой loop detected. (Необходимо отметить, что эксперт запускается с каждым ценовым тиком и не имеет права работать долго). Однако, подготовительную работу, например инициализацию какого-либо массива можно произвести в несколько приемов. Например, так:
    var: cnt(0), initvalue(0);
    array: arr[6000](0);

    SetLoopCount( 50000 ); // for example only. illustrates an initialisation in 3 times

    If initvalue <= 6000 Then Begin
        print( "beginning from ", initvalue );
        For cnt = initvalue To 6000 Begin // initialisation loop
            arr[cnt] = cnt;
            // strongly recommended last instruction in the initialisation loop as follow
            initvalue = cnt + 1;
        End;
        print( "stopped with ", initvalue, " -- initialisation is complete." );
    End
    Else print( "initialisation is complete" );
    Если же необходимо инициализировать несколько массивов, то используйте несколько переменных. Например, initvalue, initvalue2, initvalue3 etc.

  • Как определить начало очередного бара? (Это бывает необходимо для того, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов:
    Variable: prevbars(0);
    ...
    If prevbars = Bars Then exit;
    prevbars = Bars;
    ...
    Этот способ может не сработать при подкачке истории. То есть, количество баров изменилось, а "предыдущий" еще не сформировался. В этом случае можно усложнить проверку на разницу между значениями равной единице.

    Следующий способ основан на том, что значение Volume формируется на основе количества тиков, пришедших для каждого бара, и первый тик означает, что у вновь формирующегося бара значение Volume равно 1 :
    If Volume > 1 Then exit;
    ...
    Этот способ может не сработать при слишком интенсивном поступлении ценовых тиков. Дело в том, что обработка приходящих ценовых тиков производится в отдельном потоке. И если этот поток занят во время поступления очередного тика, то во избежание излишней загрузки вычислительных ресурсов этот пришедший тик не обрабатывается! В этом случае можно также усложнить проверку, используя сохранение предыдущего значения Volume.

    Третий способ основан на времени открытия бара:
    Variable: prevtime(0);
    ...
    If prevtime = Time Then exit;
    prevtime = Time;
    ...
    Это - самый надежный способ. Он сработает при любых обстоятельствах.

  • Ниже приведен пример работы с файлом:
    vars : handle(0), cnt1(0), cnt2(0), position(0), size(0);
    vars : string(""), number(0);

    handle = File "test", "," );
    print( "file size is ", FileSize( handle ) );
    size = 0;
    while not IsFileEnded( handle ) begin
        string = FileReadString( handle );
        number = FileReadNumber( handle );
        // lines counting
        if IsFileLineEnded( handle ) then size = size + 1;
    end;
    print( "file has ", size, " lines" );
    if size < 20 then begin
        cnt2 = 0;
        for cnt1 = size to 19 begin
            FileWrite(handle, "teststring"+cnt1, cnt1+1);
            cnt2 = cnt2 + 1;
            size = size + 1;
            if cnt2 = 5 then break;
        end;
        print( "there are ", cnt2, " lines added" );
     print( "file size is ", FileSize( handle ) );
    end;

    position = FileSeek( handle, 0, SEEK_SET );
    // file reading from begin
    for cnt1=1 to size begin
        print( FileReadString( handle ), ";", FileReadNumber( handle ) );
        If IsFileEnded( handle ) then break;
    end;
    FileClose(handle);
    Некоторые пояснения к коду. Сначала открывается файл и производится построчное чтение. Предполагается, что структура каждой строки файла состоит из одной текстовой переменной и одной числовой переменной. Если количество посчитанных строк меньше 20, то производится дозапись очередной порции из 5 строк. Так как после подсчёта строк указатель текущего положения чтения-записи находится в конце файла, то и запись очередной записи будет производится в конец файла, после чего указатель текущего положения будет перемещен в конец файла. Если же надо произвести запись в конец файла сразу после его открытия, то необходимо воспользоваться следующей функцией:
    position = FileSeek( handle, 0, SEEK_END );
    после чего и записывать данные в файл.
    Во второй части кода производится чтение записей из файла с самого его начала.


Содержание | назад | далее   
 














о компании | контакты © NEUIMEX TEAM ® Главная   о компании   Вверх
Forex / Форекс Инвестиции, доверительное управление, интернет трейдинг – NEUIMEX :: Articles catalogue

transmaster-omsk.ru v 4_2