Простой эксперт, а тестеру настал крах....

 
Всем привет. Вот решил спросить у разработчиков почему виснет тестер?
Суть эксперта. Эксперт читает информацию из внешнего файла и при совпадении нужных параметров покупает, продаёт и закрывает сделки. Ниже код эксперта:
//+------------------------------------------------------------------+
//|                                         Copyright 2006, HIDDEN ™ |
//|                                   Шаблон для написание экспертов |
//+------------------------------------------------------------------+

#property copyright "Copyright 2006, HIDDEN ™"
#property link      "http://"

#define MIN_STOPLOSS_POINT 10
#define MIN_TAKEPROFIT_POINT 10 
#define MAGIC 125242

extern string sNameExpert = "TEMPLES ™";
extern int nAccount =0;
extern double StopLoss = 0;
extern double TakeProfit = 50;
extern double TrailingStop = 15;
extern double dLots = 0.10; 
extern int nSlippage = 5;
extern bool lFlagUseHourTrade = True;
extern int nFromHourTrade = 0;
extern int nToHourTrade = 23;
extern bool lFlagUseSound = True;
extern string sSoundFileName = "alert.wav";
extern color colorOpenBuy = Blue;
extern color colorCloseBuy = Aqua;
extern color colorOpenSell = Red;
extern color colorCloseSell = Aqua;
extern int GSV=3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <lot_lib.mqh>
double Upz,Dnz,sH,sL,aH,aL,fB,lB;
double OpenPrise;
int m, signal;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   lotlib_PrevLots = 0.0;  lotlib_PrevProfit = 0.0;   
//----
   return(0);
  }

void deinit() {
  Comment("");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   //IsTesting();
   if (lFlagUseHourTrade){
      if (!(Hour()>=nFromHourTrade && Hour()<=nToHourTrade)) {
         Comment("Time for trade has not come else!");
         return(0);
      }
   }
   
   if(Bars < 100){
      Print("bars less than 100");
      return(0);
   }
   
   if (nAccount > 0 && nAccount != AccountNumber()){
      Comment("Trade on account :"+AccountNumber()+" FORBIDDEN!");
      return(0);
   }
   
   if((StopLoss > 0 && StopLoss < MIN_STOPLOSS_POINT) ||
      (StopLoss > 0 && StopLoss < MIN_STOPLOSS_POINT)){
      Print("StopLoss less than " + MIN_STOPLOSS_POINT);
      return(0);
   }
   if((TakeProfit > 0 && TakeProfit < MIN_TAKEPROFIT_POINT) ||
      (TakeProfit > 0 && TakeProfit < MIN_TAKEPROFIT_POINT)){
      Print("TakeProfit less than " + MIN_TAKEPROFIT_POINT);
      return(0);
   }


   if(AccountFreeMargin() < (1000*dLots)){
      Print("We have no money. Free Margin = " + AccountFreeMargin());
      return(0);
   }
   
    lotlib_OpenPriceLevel = Ask;
    lotlib_StopLossLevel = Ask-StopLoss*Point;

   
   bool lFlagBuyOpen = false, lFlagSellOpen = false, lFlagBuyClose = false, lFlagSellClose = false;

//----   
   calculateIndicators();
   int handle;
   string symbol,str;
   while(true)
     {
      handle = FileOpen(Symbol()+"_"+Period()+".txt",FILE_CSV|FILE_READ,";");
      if(handle<1) {
         Print("Файл"+Symbol()+"_"+Period()+".txt не открывается! ", GetLastError());
         return(false);
      }
      str="";
      if(handle>0) {
         while(!FileIsEnding(handle) && !FileIsLineEnding(handle)) {
            //string format example: 
            //symbol;order_type;open_price
            //EURUSD;1;1.2377 - buy
            //EURUSD;-1;1.2345 - sell
           str=FileReadString(handle); symbol=str;
           str=FileReadString(handle); signal=StrToInteger(str);
           str=FileReadString(handle); OpenPrise=StrToDouble(str);
         }
         FileClose(handle);
      }
   }
//----   
   lFlagBuyOpen = (m==0 && symbol==Symbol() && signal==1 && Ask>=OpenPrise);
   lFlagSellOpen = (m==0 && symbol==Symbol() && signal==-1 && Bid<=OpenPrise);
   lFlagBuyClose = (m==0 && symbol==Symbol() && signal==-1 && Bid<=OpenPrise);
   lFlagSellClose = (m==0 && symbol==Symbol() && signal==1 && Ask>=OpenPrise);
//----   
   if (!ExistPositions()){
   
      lotlib_PrevLots = OrderLots();
      lotlib_PrevProfit = OrderProfit();
   
      if (lFlagBuyOpen){
         OpenBuy();
         return(0);
      }

      if (lFlagSellOpen){
         OpenSell();
         return(0);
      }
   }
   if (ExistPositions()){
      if(OrderType()==OP_BUY){
         if (lFlagBuyClose){
            bool flagCloseBuy = OrderClose(OrderTicket(), OrderLots(), Bid, nSlippage, colorCloseBuy); 
            if (flagCloseBuy && lFlagUseSound) 
               PlaySound(sSoundFileName); 
            return(0);
         }
      }
      if(OrderType()==OP_SELL){
         if (lFlagSellClose){
            bool flagCloseSell = OrderClose(OrderTicket(), OrderLots(), Ask, nSlippage, colorCloseSell); 
            if (flagCloseSell && lFlagUseSound) 
               PlaySound(sSoundFileName); 
            return(0);
         }
      }
   }
   
   if (TrailingStop > 0 || TrailingStop > 0){
      
      for (int k=0; k<OrdersTotal(); k++) { 
         if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES)) { 
            bool lMagic = true;
            if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
               lMagic = false;
            
            if (OrderSymbol()==Symbol() && lMagic) { 
               if (OrderType()==OP_BUY && TrailingStop > 0) { 
                  if (Bid-OrderOpenPrice() > TrailingStop*Point) { 
                     if (OrderStopLoss()<Bid-TrailingStop*Point) 
                        ModifyStopLoss(Bid-TrailingStop*Point); 
                  } 
               } 
               if (OrderType()==OP_SELL) { 
                  if (OrderOpenPrice()-Ask>TrailingStop*Point) { 
                     if (OrderStopLoss()>Ask+TrailingStop*Point || OrderStopLoss()==0)  
                        ModifyStopLoss(Ask+TrailingStop*Point); 
                  } 
               } 
            } 
         } 
      } 
   }
   return (0);
}

bool ExistPositions() {
	for (int i=0; i<OrdersTotal(); i++) {
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         bool lMagic = true;
         
         if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
            lMagic = false;

			if (OrderSymbol()==Symbol() && lMagic) {
				return(True);
			}
		} 
	} 
	return(false);
}

void calculateIndicators() {    // Calculate indicators' value   
 m=TimeMinute(CurTime());

}


void ModifyStopLoss(double ldStopLoss) { 
   bool lFlagModify = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE); 
   if (lFlagModify && lFlagUseSound) 
      PlaySound(sSoundFileName); 
} 

void OpenBuy() { 
   double dStopLoss = 0, dTakeProfit = 0;

   if (StopLoss > 0)
      dStopLoss = Bid-StopLoss*Point;
   
   if (TakeProfit > 0)
     dTakeProfit = Ask + TakeProfit * Point; 
 
   
   int numorder = OrderSend(Symbol(), OP_BUY, Lot(), Ask, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenBuy); 
   
   if (numorder > -1 && lFlagUseSound) 
      PlaySound(sSoundFileName);
} 

void OpenSell() { 
   double dStopLoss = 0, dTakeProfit = 0;
   
   if (StopLoss > 0)
      dStopLoss = Ask+StopLoss*Point;
   
   if (TakeProfit > 0)
      dTakeProfit = Bid-TakeProfit*Point;
   
   int numorder = OrderSend(Symbol(),OP_SELL, Lot(), Bid, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenSell); 
   
   if (numorder > -1 && lFlagUseSound) 
      PlaySound(sSoundFileName); 
}


Как текстовый файл прикрепить не нашел, вобщем эксперта тестить нужно на EURUSD на M30. файл из которого эксперт берет инфу называется EURUSD_30.txt и содержит всего одну строчку EURUSD;1;1.1800.
Его нужно засунуть в папку tester\files. По идее тест должен показать как минимум одну покупку, исходя из алгоритма. Но тестер вообще не двигается, ошибок не выводит, а при нажатии на STOP просто замерает и терминал весит, в чем проблема-то?

 
Для начала:
Приоритеты и порядок выполнения операций

Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.

() Вызов функции Слева направо
[] Выделение элемента массива
! Логическое отрицание Справа налево
- Изменение знака
++ Увеличение на единицу (increment)
-- Уменьшение на единицу (decrement)
~ Побитовое отрицание (complement)
& Побитовая операция И Слева направо
| Побитовая операция ИЛИ
^ Побитовая операция исключающее ИЛИ (eXclude OR)
<< Сдвиг влево
>> Сдвиг вправо
* Умножение Слева направо
/ Деление
% Деление по модулю
+ Сложение Слева направо
- Вычитание
< Меньше, чем Слева направо
<= Меньше или равно
> Больше, чем
>= Больше или равно
== Равно
!= Не равно
|| Логическая операция ИЛИ Слева направо
&& Логическая операция И Слева направо
= Присваивание Справа налево
+= Сложение с присваиванием
-= Вычитание с присваиванием
*= Умножение с присваиванием
/= Деление с присваиванием
%= Деление по модулю с присваиванием
>>= Сдвиг вправо с присваиванием
<<= Сдвиг влево с присваиванием
&= Побитовое И с присваиванием
|= Побитовое ИЛИ с присваиванием
^= Исключающее ИЛИ с присваиванием
, Запятая Слева направо


Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.
Внимание: приоритет выполнения операций в языке MQL4 несколько отличается от приоритета, принятого в языке Си.
 
Rosh, если ты хотел чего мне сказать или подсказать, то по русски если можно, я вообще не понял что ты имел ввиду. Я пробывал по разному и с одной переменной и с двумя и со всеми, результат один, зависон.
 
Очень уж смущает вот это место:

   while(true)
     {
      handle = FileOpen(Symbol()+"_"+Period()+".txt",FILE_CSV|FILE_READ,";");
      if(handle<1) {
         Print("Файл"+Symbol()+"_"+Period()+".txt не открывается! ", GetLastError());
         return(false);
      }
      str="";
      if(handle>0) {
         while(!FileIsEnding(handle) && !FileIsLineEnding(handle)) {
            //string format example: 
            //symbol;order_type;open_price
            //EURUSD;1;1.2377 - buy
            //EURUSD;-1;1.2345 - sell
           str=FileReadString(handle); symbol=str;
           str=FileReadString(handle); signal=StrToInteger(str);
           str=FileReadString(handle); OpenPrise=StrToDouble(str);
         }
         FileClose(handle);
      }
   }



нет выхода из цикла при успешном открытии файла.

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


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


По-русски тяжело, много писать придется, я сразу увидел то, за что можно зацепиться, другой увидел непонятки с файлами. Дальше смотреть не стал.

А у меня кажись глаз замылился, запутался в 3-х соснах.
 
И несколько неиспользуемых глобальных переменных.
 
И несколько неиспользуемых глобальных переменных.


Протерев сутра глаза, засучив рукова, нашлась таки закавырка. Код эксперта правельный, все путем. Просто в текстовом файле все должно быть записано вот так:
EURUSD;1;1.1800;
Ранее было:
EURUSD;1;1.1800
т.е. вся проблема с завитанием тестера была в ";" в конце строки.
Или данное решение является обходным маневром и не есть правельным?
 
Разработчики подскажите как заставить эксперта считывать параметры построчно начиная с верхней и дальше вниз. А не только параметры из первой строки внешнего файла.
Если несложно то часть кода для понимания.

EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
 
Rosh, никак не получается сделать что-бы все читал как нужно. В приведенном тобой индикаторе цикл записан в init(), что-то у меня не получается читать. Делал как по примеру, но ничего не вышло, подскажешь?
Причина обращения: