| / | Форум |
|
Bookkeeper
01.11.2007 15:11
Как многие - использую тестер с пустым советником для посмотреть на то, что показывает накинутый поверх графика индикатор. В индикаторе при пересечении нулевым баром заданного уровня цены iCustom читает буфера другого индикатора с заданием младшего ТФ. В реал-тайм - работает, на тестере что-то странное. Стал смотреть - оказалось что параметры свечек на младшем ТФ читаются не от нулевого бара, совпадающего по времени с моделируемым тестером нулевым баром, а от реального нулевого бара истории. Пробовал: если в индикатор, вызываемый iCustom, добавить extern datetime и передовать при вызове Time[0] - то номер соответствующего по времени бара на младшем ТФ прочитать iBarShift можно правильно. Проблема в том, что уровни пробиваются баром не в момент открытия бара :). Пробовал: iTime, iOpen,... , TimeCurrent(),... - не договорились... Для примера прикладываю два маленьких индикатора: Writer пишет на нулевом баре в три буфера цены открытия 5, 13, и 21 баров. Reader, работая например на М15, читает с М1 эти значения и рисует на своем ТФ. Если накинуть Reader на тестере на М15, то читать он будет то, что покажет Alert Writer'а :), т.е. нарисует три прямые на всем периоде тестирования. А хотелось бы немного другого. Только накидывайте ридер на график, предварительно поставив тестер на паузу, и нажимайте >> только после удаления ридера с графика, иначе Alert затрахает. Кто-нибудь знает, как в данной ситуации заполучить номер бара младшего ТФ, соответствующего по времени моделируемому бару? //+---------------------------------------------------------- Writer + #property copyright "" #property link "" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 White #property indicator_color3 Lime //---- double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //---- //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexBuffer(0,ExtMapBuffer1); SetIndexBuffer(1,ExtMapBuffer2); SetIndexBuffer(2,ExtMapBuffer3); SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); return(0); } //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ int start() { ExtMapBuffer1[0]=Open[5]; ExtMapBuffer2[0]=Open[13]; ExtMapBuffer3[0]=Open[21]; Alert(Open[5]," ",Open[13]," ",Open[21]); return(0); } //+------------------------------------------------------------------+ //+---------------------------------------------------------- Reader + #property copyright "" #property link "" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 White #property indicator_color3 Green //---- double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //---- int pBars=0; //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexBuffer(0,ExtMapBuffer1); SetIndexBuffer(1,ExtMapBuffer2); SetIndexBuffer(2,ExtMapBuffer3); SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); return(0); } //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ int start() { /* */ if(Bars!=pBars) { if(MathAbs(Close[0]-Open[0])>Point*2) { ExtMapBuffer1[0]=iCustom(NULL,PERIOD_M1,"Writer",0,0); ExtMapBuffer2[0]=iCustom(NULL,PERIOD_M1,"Writer",1,0); ExtMapBuffer3[0]=iCustom(NULL,PERIOD_M1,"Writer",2,0); pBars=Bars; } } return(0); } //+------------------------------------------------------------------+ |
|
Интервью с Мэттью Брауном (Matmospheric) Дополнительных средств безопасности для «спасения» счёта от принудительного закрытия в советнике не предусмотрено. Приходится просто доверять своему эксперту. |
|
Bookkeeper
01.11.2007 15:19
Тему Проблема с индикаторами в тестере видел, ворос не в том, что проблема есть, а как бы с ней справиться.
Можно как-нибудь читать моделируемое время? или чего еще.....
но что поможет.
|
33780 |
Rosh
01.11.2007 15:23
Передавайте значение времени из тестируемого советника (Визуальный
режим) в индикатор через Глобальные переменные.
|
|
Integer
01.11.2007 15:28
Посчитать время следующего (будущего) бара большого таймфрейма,
по этому времени получить номер бара малого таймфрейма (с exact=false).
Проверить время бара малого таймфрейма (имеющего полученный
номер). Если он из будущего бара, то из номера отнять 1, если
из текущего, то такой номер и использовать. Что-то в таком стиле
можно попробовать.
|
|
Bookkeeper
01.11.2007 20:08
Rosh писал (а):
Передавайте значение времени из тестируемого советника (Визуальный режим) в индикатор через Глобальные переменные.
Вместо пустого советника - советник постоянно формирующий глобальную с временем TimeCurrent() и читай себе из индюков. А узнать хотел - можно ли, не будет ли задержки и т.п. Как понял - можно, спасибо! |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий