Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1060

 
Igor Zakharov:

Это не замена - MB не работает в индикаторах т.к. останавливает поток пока не будет нажата кнопка!

Я по невнимательности посоветовал, но в примечании сказано совсем не так:

Примечание

Функцию не рекомендуется использовать в пользовательских индикаторах, так как вызов MessageBox() приостанавливает работу потока исполнения индикатора на всё время ожидания ответа пользователя. А так как все индикаторы по каждому символу выполняются в едином потоке, то будут остановлены все графики на всех таймфреймах по данному символу.

При работе в тестере стратегий функция MessageBox() не выполняется.

 
MakarFX:

Я не программист, редактирую индикатор для своего удобства. Проверял не в тестере,а в реальном времени.

Кстати, телепатов не существует.

Если знаете в каком из доступных здесь индикаторов используется эта функция, то подскажите пожалуйста, возможно тогда я разберусь сам.

Спасибо

У нас есть всё.

Клуб Телепатов
Клуб Телепатов
  • 2011.05.08
  • www.mql5.com
Клуб телепатов Вас послали сюда? Тогда давайте знакомиться! Как же такое могло случиться со мной...
 
Artyom Trishkin:

Объявляете переменную с типом структуры в локальной области видимости, и её-то и отправляете в функцию. В той же локальной области.

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

int OnInit()
  {
{int In=8;
 MyPoint qr;}
qr - видна здесь
In - здесь не видна
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){}

struct MyPoint
{
    int x[5];
    int y;
};

Получается что локально работать уже не возможно.

 

Пытаюсь в скрипте прочитать данные из csv-файла. Безуспешно и совершенно не понимаю почему.

Для чтения использую простейшую процедуру:

bool GetBiFromFile(string InFNam,int& alBars,double& xClose[],datetime& xTime[])
{  int  InHndl,nBars;
   bool fset;
   double aval;
   
   InHndl = FileOpen(InFNam+".csv",FILE_READ|FILE_CSV,",");
   if (InHndl==INVALID_HANDLE) {
       Print("File "+InFNam+" does not open. Error: ", GetLastError()); 
       return(false); 
   } else {
      fset = FileSeek(InHndl,0,SEEK_SET);
      ArrayResize(xClose,alBars);      
      ArrayInitialize(xClose,0.0);  
      ArrayResize(xTime,alBars);       
      ArrayInitialize(xTime,0);  
      nBars = 0;
      while (!FileIsEnding(InHndl)) {
         nBars++;
         xTime[nBars-1]  = FileReadDatetime(InHndl);;
         xClose[nBars-1] = FileReadDouble(InHndl);
         aval = FileReadDouble(InHndl);
         if (nBars>=alBars) break;
      }
   }
   Print("nBars = ",nBars,"   allBars = ",alBars);
   Print("Start: ",xClose[0],"   " + TimeToString(xTime[0],TIME_DATE|TIME_SECONDS));
   Print("End: ",xClose[nBars-1],"   " + TimeToString(xTime[nBars-1],TIME_DATE|TIME_SECONDS));
   return(true);
}

Файл с данными имеет такой вид:

2012.01.02 02:00:02,1.293240,1.293410

2012.01.02 02:00:52,1.293330,1.293500

2012.01.02 02:00:55,1.293810,1.293980

....

А результат операторов Print() из процедуры такой:

nBars = 1000    alBars = 1000

Start: 0.0   2020.01.29 01:00:00

End: 0.0   2020.01.29 01:00:00

То есть в цикле чтения все строки обработаны, но ничего не прочиталось. И никаких сообщений об ошибке.

Может мне кто-нибудь это объяснить ?


 
Yurixx:

Может мне кто-нибудь это объяснить ?

Бинарными функциями читаете текстовый файл.

 
Alexey Viktorov:

У нас есть всё.

Злой Вы! 

 
MakarFX:

Злой Вы! 

Я притворяюсь.

Если хотите разобраться в программировании, начните пытаться разобраться. Если-же вам просто надо сделать, обратитесь в тему где предлагают бесплатно написать, выложите там свой индикатор и опишите просьбу.


ps: Проверил я всё. Alert() почему-то даже если находится перед PlaySound() не даёт воспроизводить выбранный звук. Может с памятью моей плохо стало, но не суть.

Отключить звук алерта можно двойным тычком чтобы появился красный крестик


и в этом случае будет без разницы что написано впереди Alert() или PlaySound()

 
Alexey Viktorov:

Я притворяюсь.


и в этом случае будет без разницы что написано впереди Alert() или PlaySound()

В этом случае окно алерта не открывается.(

 
fxsaber:

Бинарными функциями читаете текстовый файл.

Про функцию FileReadDouble() действительно сказано, что она читает из бинарного файла.

А вот про FileReadDatetime()сказано: "Читает из файла типа CSV строку одного из форматов: "YYYY.MM.DD HH:MI:SS", "YYYY.MM.DD" или "HH:MI:SS" - и преобразует её в значение типа datetime."

Кроме того, та же картина была когда я использовал FileReadString(), а затем строки сам преобразовывал к нужному типу.

А как по-вашему нужно делать ?


 
Yurixx:

А как по-вашему нужно делать ?

void OnStart()
{
  datetime time;
  
  double PriceBid;
  double PriceAsk;
  
  string Str = "2012.01.02 02:00:02,1.293240,1.293410";
  string StrArray[];
  
  if (StringSplit(Str, ',', StrArray) > 2)
  {
    time = (datetime)StrArray[0];
    
    PriceBid = (double)StrArray[1];
    PriceAsk = (double)StrArray[2];
  }
}
Причина обращения: