Официальный сайт Булл Трейдерс

Написание и тестирование программ экспертов

Решение практических задач, возникающих при написании эксперта

Как определить начало очередного бара?

тестирование программ экспертов
тестирование программ экспертов

Как определить начало очередного бара? (Это бывает необходимо, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов. Первый способ основан на проверке количества баров: 01. | static int prevbars = 0; 02. | ... 03. | if (prevbars == Bars) return(0); 04. | prevbars = Bars; 05. | ... Этот способ может не сработать при подкачке истории. То есть, количество баров изменилось, а "предыдущий" еще не сформировался. В этом случае можно усложнить проверку на разницу между значениями, равную единице. Следующий способ основан на том, что значение "Volume" формируется на основе количества тиков, пришедших для каждого бара, и первый тик означает, что у вновь формирующегося бара значение "Volume" равно 1: 01. | if ( Volume[0] > 1) return (0); 02. | ... Этот способ может не сработать при слишком интенсивном поступлении ценовых тиков. Дело в том, что обработка приходящих ценовых тиков производится в отдельном потоке. И если этот поток занят во время поступления очередного тика, то во избежание излишней загрузки вычислительных ресурсов этот пришедший тик не обрабатывается! В этом случае можно также усложнить проверку, используя сохранение предыдущего значения "Volume". Третий способ основан на времени открытия бара: 01. |static datetime prevtime=0; 02. | ... 03. | if (prevtime == Time[0]) return (0); 04. | prevtime = Time[0]; 05. | ... Это - самый

написание программ экспертов
написание программ экспертов

надежный способ. Он сработает при любых обстоятельствах. Пример работы с файлом типа "CSV": 01. | int h1; 02. | h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE, ";"); 03. | if (h1 < 0) 04. | { 05. | Print("Unable to open file my_data.csv"); 06. | return ( false ); 07. | } 08. | FileWrite(h1, High[1], Low[1], Close[1], Volume[1]); 09. | FileClose(h1); Некоторые пояснения к коду. Сначала открывается файл формата "CSV". В случае ошибки открытия файла происходит выход из программы. В случае успешного открытия файла производится стирание его содержимого, запись данных в файл и последующее закрытие файла. Если необходимо сохранить содержимое открываемого файла, то следует использовать режим открытия MODE_READ: 01. | int h1; 02. | h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";"); 03. | if (h1 < 0) 04. | { 05. | Print("Unable to open file my_data.csv"); 06. | return ( false ); 07. | } 08. | FileSeek(h1, 0, SEEK_END); 09. | FileWrite(h1, High[1], Low[1], Close[1], Volume[1]); 10. | FileClose(h1); В этом примере запись производится в конец файла. Для этого сразу после его открытия мы воспользовались функцией "FileSeek".