Если вы являетесь потерпевшим от рук обманщиков Булл Трейдерс, в этом случае сообщите об этой несправедливости обществу Прошу писать мне на почту: [email protected]
Пишите нам …
Пришло новое сообщение !!!
Увы, оператор сейчасотсутствует, в связи с этим очень просим Вас оставить свой е-майл в форме связи далее.
Оператор [ИМЯ] уже на связи
Оператор [ИМЯ] - скоро напишет
Специалист ответит примерно через пяти минут …
Если не сложно, то напишите Ваш е-майл в форме связи ниже, для того чтобы мы могли связаться с Вами …
Ваша контактная информация отправлена, скоро мы с Вами свяжемся - ДЕНЬГИ НИКОМУ НЕ ДАВАЙТЕ!
Если не сложно, то напишите Ваш е-майл в форме связи ниже, для того чтобы мы могли связаться с Вами …

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

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

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

тестирование программ экспертовтестирование программ экспертов
Как определить начало очередного бара? (Это бывает необходимо, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов. Первый способ основан на проверке количества баров: 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".