Новичёк в рассосе......

 

 Здравствуйте,уважаемые зубры программирования, и все кто так или иначе..... Нужна помощь так как мозг уже отказывается что либо понимать.. Сам я новичёк в программировании-мой опыт ограничивается парочкой скриптов и экспертом, на котором я и застрял. Новостной эксперт, идея проста-есть новостной календарь в виде файла .txt, эксперт прочитывает первую  строку определяет 

время выхода новости, определяет диапазон цен последних нескольких баров перед выходом новости, расставляет ордера по обе стороны от диапазона. Всё просто. Проблема в следующем: Для того

чтобы прочтение файла было своевременным(следующее прочтение после выхода новости), поставил переключатель bool  canread==true;  после прочтения принимает значение false (как это ни странно))))))).  Условием для того чтобы canread снова ==true; является time(время выхода новости)<TimeCurrent()-100.

По моей логике получается следующее. После того как переключатель получил значение false текстовый файл по приходу нового тика не читается, ждёт true. Условие для того чтобы false стало true

происходит один раз и на последующих тиках прочтение текстового файла не происходит пока условие опять не станет ложным. Проблема в том что, условие if(Time<TimeCurrent()-100) на каждом

тике почему то верно и canread постоянно становится true. Поможите пожалуйста... Мозг ужо кипит....

//+------------------------------------------------------------------+
//|                                                     TestNews.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+

extern int count=4;
extern double eRange=30;
extern double lot=0.1;
extern double gapopen=2;
extern double gapstop=3;
extern double tp=60;
extern double tr=30;

bool canread=true;
bool cantrade=true;
int ticketup;
int ticketdn;
int h;
int i;
int total;
int h1;

int init()
  {
   h=FileOpen("NonFarm.txt",FILE_CSV|FILE_READ,';');
  
if(h<0)
    {
     Alert("Error",GetLastError());
    
return;
    
}
   if (Period()!=15)
    {
     Alert("Unsuitable period");
    
return;
    
}  
  }

int deinit()
  {
   FileClose(h);
  
}

int start()
  {
  
   if(canread==true)
    {
     string sData=FileReadString(h);
    
string sTime=FileReadString(h);
    
string a1=FileReadString(h);
    
string a2=FileReadString(h);
    
string a3=FileReadString(h);
    
string a4=FileReadString(h);
    
string a5=FileReadString(h);
  
    
datetime time=StrToTime(sData+" "+sTime);
    
datetime bartime=time-5;
    
canread=false;
    
}
    
   if(time<TimeCurrent()-100) canread=true;
  
//====================================================================
  
   int shift=iBarShift(NULL,0,bartime,true); //смещение бара перед новостью
   if(shift<0) return;
  
if((shift==0)&&(bartime-5<TimeCurrent()<bartime))
    {
     double high=High[iHighest(NULL,0,MODE_HIGH,count,shift)];
    
double low=Low[iLowest(NULL,0,MODE_LOW,count,shift)];
    
double range=(high-low)/Point; //диапазон
     if((range<=eRange)&&(cantrade==true))
      {
       ticketup=OrderSend(NULL,OP_BUYSTOP,lot,high+(gapopen*Point),
                
3,low-(gapstop*Point),high+(tp*Point));
      
ticketdn=OrderSend(NULL,OP_SELLSTOP,lot,low-(gapopen*Point),
                
3,high+(gapstop*Point),low-(tp*Point));
                  
      
cantrade=false;                    
      
}  
    }
   if(OrdersTotal()==2)
    {
     if(OrderSelect(ticketup,SELECT_BY_TICKET)==true)
      if((OrderType()==0)&&(((Bid-(high+(gapopen*Point)))/Point)>tr))
       if(OrderSelect(ticketdn,SELECT_BY_TICKET)==true)
        if(OrderType()==5)
         OrderDelete(ticketdn);
    
if(OrderSelect(ticketdn,SELECT_BY_TICKET)==true)
      if((OrderType()==1)&&((((low-(gapopen*Point))-Ask)/Point)>tr))
       if(OrderSelect(ticketup,SELECT_BY_TICKET)==true)
        if(OrderType()==4)
         OrderDelete(ticketup);    
    
}
   total=0;
  
for(i=1;i<=OrdersTotal();i++)
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
     if(OrderSymbol()==Symbol()) total++;
    
if(total==0) cantrade=true;
    
//====================================================================    
   return(0);
  
}
//+------------------------------------------------------------------+
 

Оператор "==" используется только в операциях сравнения.

Для присвоения значений используйте оператор "="

 
Yurixx писал (а) >>

Оператор "==" используется только в операциях сравнения.

Для присвоения значений используйте оператор "="

Так точно, так и делаю....

 
Добавь в строку
if(time<TimeCurrent()-100) canread=true;
if(time<TimeCurrent()-100&&time>TimeCurrent()) canread=true;

 
Поставьте внутри
   if(canread==true) {
     ...
   }
принт и убедитесь что файл читается правильно
 

Доброго всем времени суток. Спасибо за ответы, не ожидал такой отзывчивости.:)


Roger: Я не совсем понял что вы имели ввиду, потому что if(time<TimeCurrent()-100), то time точно не может быть>TimeCurrent(). И данное условие никогда не будет верно, а следовательно и

canread всегда будет иметь значение false. Если я не так понял поправьте....

Ina01: Корректность прочтения файла я проверял другим, более громоздким способом - эксперт создавал ещё один текстовый файл, в который записывал (при canread==true) значение даты и времени, которое прочитывал в другом файле. Файл читается правильно, значение даты и времени верное, что говорит о том что файл с приходом нового тика  каждый раз читается с новой строки.

Вы это имели ввиду? Если нет поправьте.. И ещё момент, файле новости от 1999года. Если время в тесте больше (пример: с 2007.07.01 по 2008.01.24 ) то в создаваемый текстовый файл перепишутся

все значения даты и времени только до 2007.07.01, а дальше только точка с запятой, хотя в файле-календаре история до 2008года...

 

Похоже тут дежурные грабли срабатывают: time - локальная перемення, она инициализируется нулём при каждом запуске start. Если блок чтения файла был пропущен, она нулём и остаётся. То есть читаться файл должен не каждый тик, а через тик :).

Нужно описать time как static или глобально.

 

Roger: Я не совсем понял что вы имели ввиду, потому что if(time<TimeCurrent()-100), то time точно не может быть>TimeCurrent(). И данное условие никогда не будет верно, а следовательно и

canread всегда будет иметь значение false. Если я не так понял поправьте....

Поправляю. Вы задаете это время загодя в своем файле, значит сразу оно всегда больше текущего. Т.е. эта часть начинает действовать сразу. Вторая часть начинает действовать, когда разница между заданным и текущим меньше 100 секунд. После наступления события вторая часть действует, а первая прекратилась.

Можете посмотреть, как эта проблема решена здесь http://forum.alpari.ru/thread38326.html. Может Вам подойдет такое решение.

 

Еще раз вниательно посмотрел код. Ты объявляешь переменную time в теле start. Это неправильно.

Каждый второй тик она обнуляется, что приводит к

if(time<TimeCurrent()-100) canread=true;

А в остальном все нормально, кроме того,что файл держать открытым нельзя. Делай открытие и закрытие в теле start.

 
Roger писал (а) >>

Еще раз вниательно посмотрел код. Ты объявляешь переменную time в теле start. Это неправильно.

Каждый второй тик она обнуляется, что приводит к

if(time<TimeCurrent()-100) canread=true;

А в остальном все нормально, кроме того,что файл держать открытым нельзя. Делай открытие и закрытие в теле start.

Roger, Вам тоже полезно прочитать мой предыдущий пост. Там упоминается о существовании модификатора static.

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

В общем будьте внимательнее и думайте, прежде чем давать категоричные рекомендации.

 

Можно статик, а проще вынести объявление за рамки модуля. Имел большие грабли с незакрытыми файлами, теперь не советую держать файл, проще пропарсить и найти подходящую строку.

А Ваш ответ действительно пропустил, покорнейше извиняюсь.

Причина обращения: