Скачать MetaTrader 5

PlaySound и Alert

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
5211845
157
5211845  

Здравствуйте! Пытаюсь озвучить сигналы своего индикатора при помощи функции PlaySound. Оформил, скомпелировал, болтает, процесс идет нормально!!! НО, без но не обошлось, с функцией Alert работает не полноценно. Только начинает воспроизводить нужный текст функция PlaySound (там несколько слов, типа "Сигнал вверх №1") как ее перебивает сигнал Алерта. Можно ли сделать так, чтобы функция PlaySound проигрывала полностью свой текст до конца после чего выходило окошко алерта со своим сигналом, или наоборот с начала алерт, потом функция PlaySound, не принципиально. Пробовал и перед алертом ставить PlaySound и после. Все равно почему то в первую очередь начинает звучать первые буквы из PlaySound потом алерт. Если функция PlaySound используется одна без алерта, то проигрывает все до конца. Ниже привожу свой код. С коментом, к стати, PlaySound работает фолноценно.

if (TimeBar!=Time[0] && AlertON && i==0 && S!=0)
      {
           
      Alert(Symbol()+ " " + "(" + " " + "M" + Period() + ")" + " = " + NameFigur);
      Comment(Symbol(),Period());
      PlaySound(Voice);
     
      TimeBar=Time[0];
    
      } 

Прошу помочь, кодом, советом, ссылкой, короче кто чем может.

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

5211845
157
5211845  
Еще один момент. Поставил подряд две функции PlaySound и почему то проигрывается только последний. Хотелось бы чтобы все по очереди. Что делать???
Алексей Тарабанов
7323
Алексей Тарабанов  
Galex:
Еще один момент. Поставил подряд две функции PlaySound и почему то проигрывается только последний. Хотелось бы чтобы все по очереди. Что делать???
Делать паузу между мелодиями, достаточную для проигрывания первой из них. 
5211845
157
5211845  
На сколько я знаю пауза в индикаторах не допускается, по крайней мере при помощи функции sleep. Какую функцию порекомендуете вы?
Алексей Тарабанов
7323
Алексей Тарабанов  
Galex:
На сколько я знаю пауза в индикаторах не допускается, по крайней мере при помощи функции sleep. Какую функцию порекомендуете вы?
Никакую. Если Вы - об индикаторе, то надо просто реже играть музыку. 
5211845
157
5211845  
Хотелось чтобы модератор высказал свое мнение по этому вопросу. А то ответ -"...надо просто реже играть музыку." кажется не серьезным.
Алексей Тарабанов
7323
Алексей Тарабанов  
У модератора несколько иные функции. 
Victor Nikolaev
Модератор
15183
Victor Nikolaev  
Galex:
Хотелось чтобы модератор высказал свое мнение по этому вопросу. А то ответ -"...надо просто реже играть музыку." кажется не серьезным.

у модератора действительно другие задачи. 

По поводу музыки. Не начинайте новую пока не закончится старая - что-то типа того - играйте реже. 

Uladzimir Izerski
3345
Uladzimir Izerski  
Galex:

Здравствуйте! Пытаюсь озвучить сигналы своего индикатора при помощи функции PlaySound. Оформил, скомпелировал, болтает, процесс идет нормально!!! НО, без но не обошлось, с функцией Alert работает не полноценно. Только начинает воспроизводить нужный текст функция PlaySound (там несколько слов, типа "Сигнал вверх №1") как ее перебивает сигнал Алерта. Можно ли сделать так, чтобы функция PlaySound проигрывала полностью свой текст до конца после чего выходило окошко алерта со своим сигналом, или наоборот с начала алерт, потом функция PlaySound, не принципиально. Пробовал и перед алертом ставить PlaySound и после. Все равно почему то в первую очередь начинает звучать первые буквы из PlaySound потом алерт. Если функция PlaySound используется одна без алерта, то проигрывает все до конца. Ниже привожу свой код. С коментом, к стати, PlaySound работает фолноценно.

if (TimeBar!=Time[0] && AlertON && i==0 && S!=0)
      {
           
      Alert(Symbol()+ " " + "(" + " " + "M" + Period() + ")" + " = " + NameFigur);
      Comment(Symbol(),Period());
      PlaySound(Voice);
     
      TimeBar=Time[0];
    
      } 

Прошу помочь, кодом, советом, ссылкой, короче кто чем может.

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

Остается один вариант.

При создании звуковых файлов делать тишину-паузу на длину звука Alert а. 

Alexander Puzanov
32643
Alexander Puzanov  
Можно доверить озвучку советнику или скрипту - напр ваш индикатор(ы) пишет сигнал(ы) в глобальную переменную, этот "голос за кадром" их считывает, озвучивает с нужными паузами и обнуляет. Я делал - вариант не идеальный, бо сигналы озвучиваются не моментально + надо составлять список времён звучания фраз
Ilyas
1205
Ilyas  
Одновременное воспроизведение (mp3) с использованием DLL:
//+------------------------------------------------------------------+
//|                                                    SoundTest.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#import "winmm.dll"
   int mciSendStringW(const string,long,uint,int);          // версия для передачи NULL в качестве строки в x64
   int mciSendStringW(const string,int,uint,int);           // версия для передачи NULL в качестве строки в x86
   int mciSendStringW(const string,string &,uint,int);      // версия для передачи строки в x86/x64
   int mciGetErrorStringW(int,string &,uint);               // получение текста ошибки в x86/x64
#import
//+------------------------------------------------------------------+
//| Подпапка песочницы                                               |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   const string ExtMQL="MQL5";
#else
   const string ExtMQL="MQL4";
#endif
//+------------------------------------------------------------------+
//| Вызов правильной версии функции (от битности процесса)           |
//+------------------------------------------------------------------+
int mciSendString(string str)
  {
   if(_IsX64)
      return(mciSendStringW(str,(long)0,256,0));
//---
   return(mciSendStringW(str,(int)0,256,0));
  }
//+------------------------------------------------------------------+
//| Открытие файла                                                   |
//+------------------------------------------------------------------+
int SoundOpen(const string name,const string path)
  {
   static string data_path=NULL;
//---
   if(data_path==NULL)
      data_path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\"+ExtMQL+"\\Files\\";
//---   
   return(mciSendString("OPEN \""+data_path+path+"\" TYPE MpegVideo ALIAS \""+name+"\""));
  }
//+------------------------------------------------------------------+
//| Воспроизведение с позиции (по умолчанию с позиции 0)             |
//+------------------------------------------------------------------+
int SoundPlay(const string name,long from_pos=0)
  {
   return(mciSendString("PLAY \""+name+"\" from "+IntegerToString(from_pos)));
  }
//+------------------------------------------------------------------+
//| Закрытие файла                                                   |
//+------------------------------------------------------------------+
int SoundClose(const string name)
  {
   return(mciSendString("CLOSE \""+name+"\""));
  }
//+------------------------------------------------------------------+
//| Получение описания ошибки                                        |
//+------------------------------------------------------------------+
string SoundErrDesc(int err)
  {
   string desc;
   StringInit(desc,256);
   mciGetErrorStringW(err,desc,256);
   return(desc);
  }
//+------------------------------------------------------------------+
//| Получение текущей позиции в файле                                |
//+------------------------------------------------------------------+
long SoundPos(const string name)
  {
   string res;
   StringInit(res,128);
   if(mciSendStringW("STATUS \""+name+"\" POSITION",res,256,0)==0)
      return(StringToInteger(res));
//---
   return(-1);
  }
//+------------------------------------------------------------------+
//| Получение длины файла                                            |
//+------------------------------------------------------------------+
long SoundLen(const string name)
  {
   string res;
   StringInit(res,128);
   if(mciSendStringW("STATUS \""+name+"\" LENGTH",res,256,0)==0)
      return(StringToInteger(res));
//---
   return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int res;
   res=SoundOpen("music","1.mp3");   
   if(res!=0)
      Print("SoundError: ",SoundErrDesc(res));
   else
     {
      res=SoundOpen("music2","1.mp3");
      if(res!=0)
         Print("SoundError: ",SoundErrDesc(res));
      else
        {
         long len=SoundLen("music");   

         SoundPlay("music2");
         SoundPlay("music",len/2);
         
         while(!IsStopped())
           {
            long pos=SoundPos("music");            
            
            Comment(pos,"/",len,"\n",SoundPos("music2"),"/",len);
            
            if(pos==len)
               SoundPlay("music");
           }
         //---
         SoundClose("music");
         SoundClose("music2");
        }
     }
  }
//+------------------------------------------------------------------+

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий