Подскажите, пожалуйста, - страница 3

 
ToLik_SRGV:

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

Проверить это просто в метод start() индикатора просто добавте код возвращающий через алерт текущее «смоделированное» время

и будете во время теста получать все время одни и теже данные. Хотя в справке четко написано


datetime TimeCurrent( )
Возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Замечание: при тестировании последнее известное время сервера моделируется.

Но нет уточнения для чего именно моделируется, а для чего нет, для индикаторов видимо нет.



И какой выход из этого, как мне в тестере решать эту проблему? Для демо и реала проблем нет, можно взять iTime с часового ТФ.
 

Сейчас что-нибудь изобразим и для этого случая…

 
в принципе с натяжкой можно считать что последнее время сервера совпадает с Time(0)
 
alsu:
в принципе с натяжкой можно считать что последнее время сервера совпадает с Time(0)


Но мне нужно не последнее время сервера, а начало нового часа определить.

if(prevtime != Time[0])
    {  
       prevtime = Time[0]; 
   if(save != TimeHour(Time[0]))
    {
       save = TimeHour(Time[0]);
       nc=0;nsp=1;nso=1;
       SP=(Open[1]+Close[1])/2;
       
    } 
   }
Попробовала такую конструкцию, начала работать, но не совсем корректно
 
Angela:

Но мне нужно не последнее время сервера, а начало нового часа определить.

Ох, этот вечный парсинг строк… и сейчас выручил :)

Параметр step – номер текущего считаемого бара в индикаторе, если нужно конечно корректно считать историю, а если нужно только текущее данные во время теста то можно просто присвоить 0.

//+------------------------------------------------------------------+
bool newHour(int step){
   static string save;   
   if(StringSubstr(TimeToStr(Time[step], TIME_MINUTES), 0, 2) != save){
      save = StringSubstr(TimeToStr(Time[step], TIME_MINUTES), 0, 2);
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+
 
ToLik_SRGV:

Ох, этот вечный парсинг строк… и сейчас выручил :)

Параметр step – номер текущего считаемого бара в индикаторе, если нужно конечно корректно считать историю, а если нужно только текущее данные во время теста то можно просто присвоить 0.



Спасибо, попробую приспособить, но уже завтра, пора спать.
 
ssn1:

Помогите разобраться в мистике.

Хочу сохранять в файле данные торговли. Знаю, что они сохраняются в папке терминала /EXPERTS/FILES .

Написал следующий тестовый код (обработку ошибок убрал):

---------------

string FileName = "MyFile.csv";

int handle;

handle = FileOpen(FileName, FILE_CSV|FILE_WRITE, ';');

FileWrite(handle, " Proba");

FileClose(handle);

handle = FileOpen(FileName, FILE_CSV|FILE_READ,';');

Comment (FileReadString(handle), " FileName = ", FileName, " FileSize = ", FileSize (handle));

FileClose(handle);

------------

То есть, открыл файл на запись, записал туда текст, закрыл файл.

Опять открыл, но для чтения, прочитал из него текст, вывел текст в строку комментария на графике, закрыл файл.

Так вот, всё это работает и комментарий на график выводится, но файла в той директории я не нашёл! Более того, пустил поиск по всему диску C:\, но опять файла не нашёл! Мистика какая-то! Файл, вроде есть, но его нет.

Когда к простому имени файла я добавил полный путь к папке /EXPERTS/FILES, то вышла ошибка о неправильном имени файла.

Ну не должно так быть! Не правильно это!

Где мой файл?

В ОЗУ.

Разбейте процесс записи и чтения, например так

string FileName = "MyFile.csv"; 
int handle;
   
int init(){   
   handle = FileOpen(FileName, FILE_CSV|FILE_WRITE, ';');
   FileWrite(handle, " Proba");
   FileClose(handle);
}

int start(){
   handle = FileOpen(FileName, FILE_CSV|FILE_READ,';');
   Comment (FileReadString(handle), " FileName = ", FileName, " FileSize = ", FileSize (handle));
   FileClose(handle);
}

Файл успеет записаться на жесткий диск и вы его найдете. 

 
Angela:


Но мне нужно не последнее время сервера, а начало нового часа определить.

Попробовала такую конструкцию, начала работать, но не совсем корректно


Похоже, не корректность работы связана с пропуском баров в истории на которой произвожу тестирование.
 
Angela:


Но мне нужно не последнее время сервера, а начало нового часа определить.

Попробовала такую конструкцию, начала работать, но не совсем корректно


Кстати ваш код, тоже очень даже рабочий. Его можно даже еще более упростить

static datetime save;
   
if(save != TimeHour(Time[0])){
   save = TimeHour(Time[0]);
   //здесь ваш код
} 

 Так что со своим методом я немного перемудрил, все можно сделать и по проще :))

 
ToLik_SRGV:


Кстати ваш код, тоже очень даже рабочий. Его можно даже еще более упростить

Так что со своим методом я немного перемудрил, все можно сделать и по проще :))


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