PlaySound при открытии и закрытии позиции

 
 Здраствуйте! подскажите пожалуйста как заставить советник воспроизводить звуковой сигнал  PLaySound при окрытии Buy,Sell и при закрытии Buy,Sell
В данном советнике и будет ли воспроизводится сигнал при тестированнии? Спасибо.
extern int  _MagicNumber = 1122;
 
int start()
{
//---- Запоминаем значения индикатора для дальнейшего анализа
    double MACD_1 = iMACD( Symbol(), 0, 12, 26, 9, PRICE_CLOSE, 
                    MODE_MAIN, 1 );
    double MACD_2 = iMACD( Symbol(), 0, 12, 26, 9, PRICE_CLOSE, 
                     MODE_MAIN, 2 );
 
    int _GetLastError = 0, _OrdersTotal = OrdersTotal();
    //---- перебираем все открытые позиции
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
  //---- если при выборе позиции возникла ошибка, переходим к следующей
        if ( !OrderSelect( z, SELECT_BY_POS ) )
        {
            _GetLastError = GetLastError();
            Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - 
                  Error #", _GetLastError );
            continue;
        }
 
// если позиция открыта не по текущему инструменту, пропускаем её
        if ( OrderSymbol() != Symbol() ) continue;
 
// если MagicNumber не равен _MagicNumber, пропускаем 
// эту позицию
        if ( OrderMagicNumber() != _MagicNumber ) continue;
 
        //---- если открыта БАЙ-позиция,
        if ( OrderType() == OP_BUY )
        {
            //---- если МАКД пересёк 0-ю линию вниз,
            if ( NormalizeDouble( MACD_1, Digits + 1 ) <  0.0 && 
                  NormalizeDouble( MACD_2, Digits + 1 ) >= 0.0)
            {
                //---- закрываем позицию
                if ( !OrderClose( OrderTicket(), OrderLots(), 
                    Bid, 5, Green ) )
                {
                    _GetLastError = GetLastError();
                    Alert( "Ошибка OrderClose № ", _GetLastError );
                    return(-1);
                }
            }
// если сигнал не изменился, выходим - пока рано открывать 
// новую позицию
            else
            { return(0); }
        }
        //---- если открыта СЕЛЛ-позиция,
        if ( OrderType() == OP_SELL )
        {
            //---- если МАКД пересёк 0-ю линию вверх,
            if(NormalizeDouble( MACD_1, Digits + 1 ) >  0.0 && 
               NormalizeDouble( MACD_2, Digits + 1 ) <= 0.0)
            {
                //---- закрываем позицию
                if(!OrderClose( OrderTicket(), OrderLots(), 
                   Ask, 5, Red ) )
                {
                    _GetLastError = GetLastError();
                    Alert( "Ошибка OrderClose № ", 
                          _GetLastError );
                    return(-1);
                }
            }
// если сигнал не изменился, выходим - пока рано открывать 
// новую позицию
            else return(0);
        }
    }
 
//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет|
//| проверяем, есть ли возможность открыть позицию                   |
//+------------------------------------------------------------------+
 
    //---- если МАКД пересёк 0-ю линию вверх,
    if ( NormalizeDouble( MACD_1, Digits + 1 ) >  0.0 && 
          NormalizeDouble( MACD_2, Digits + 1 ) <= 0.0    )
    {
        //---- открываем БАЙ позицию
        if(OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5, 0.0, 
           0.0, "MACD_test", 
              _MagicNumber, 0, Green ) < 0 )
        {
            _GetLastError = GetLastError();
            Alert( "Ошибка OrderSend № ", _GetLastError );
            return(-1);
        }
        return(0);
    }
    //---- если МАКД пересёк 0-ю линию вниз,
    if ( NormalizeDouble( MACD_1, Digits + 1 ) <  0.0 && 
          NormalizeDouble( MACD_2, Digits + 1 ) >= 0.0    )
    {
        //---- открываем СЕЛЛ позицию
        if(OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 
           0.0, "MACD_test", 
              _MagicNumber, 0, Red ) < 0 )
        {
            _GetLastError = GetLastError();
            Alert( "Ошибка OrderSend № ", _GetLastError );
            return(-1);
        }
        return(0);
    }
 
    return(0);
}
 
extern bool     UseSound = true;  // Использовать звуковой сигнал
extern string   NameSound  = "expert.wav";  // Наименование звукового файла
.........................................
.........................................
..........................................
 
 
if(OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 0.0, "MACD_test", _MagicNumber, 0, Red )==true){
  if(UseSound==true){PlaySound(NameSound);}  
}
Принцип, думаю, понятен.
 
drknn:
extern bool     UseSound = true;  // Использовать звуковой сигнал
extern string   NameSound  = "expert.wav";  // Наименование звукового файла
.........................................
.........................................
..........................................
 
 
if(OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 0.0, "MACD_test", _MagicNumber, 0, Red )==true){
  if(UseSound==true){PlaySound(NameSound);}  
}
Принцип, думаю, понятен.


Спасибо за ответ но у меня не получается ,звука нет,во время тестирования должен быть звук или нет?

  //---- открываем СЕЛЛ позицию
        if((OrderSend( Symbol(), OP_SELL, Lots, Bid, 5,
        Ask+StopLoss*Point,Bid-TakeProfit*Point,"eurusdm15",_MagicNumber, 0, Red ) ==true)< 0) 
 
              {
            _GetLastError = GetLastError();
            Alert( "Ошибка OrderSend № ", _GetLastError );
            
               {
    if(UseSound==true)
    {
    PlaySound(NameSound);
    }
    }
            return(-1);
 
        }
        return(0);
    }
 
    return(0);
}
 


К сожалению звука нет

Проверьте пожалуйста правильно я написал здесь или нет

  //---- открываем СЕЛЛ позицию
        if((OrderSend( Symbol(), OP_SELL, Lots, Bid, 5,
        Ask+StopLoss*Point,Bid-TakeProfit*Point,"eurusdm15",_MagicNumber, 0, Red ) ==true)< 0) 
 
              {
            _GetLastError = GetLastError();
            Alert( "Ошибка OrderSend № ", _GetLastError );
            
               {
    if(UseSound==true)
    {
    PlaySound(NameSound);
    }
    }
            return(-1);
 
        }
        return(0);
    }
 
    return(0);
}
И если можно на закрытие позиции подскажите как правильно написать
 
string SMB=Symbol();
   double SL,TP,Prise;
   int digits=MarketInfo(SMB,MODE_DIGITS);
   
   Prise=MarketInfo(SMB,MODE_BID);
   Prise=NormalizeDouble(Prise,digits);
   SL=Ask+StopLoss*Point;
   SL=NormalizeDouble(SL,digits);
   TP=Bid-TakeProfit*Point;
   TP=NormalizeDouble(TP,digits);
   
   if(!(OrderSend(SMB,OP_SELL,Lots,Prise,5,SL,TP,"eurusdm15",_MagicNumber,0,Red )){ 
     _GetLastError = GetLastError();
     Alert("Ошибка OrderSend № ", _GetLastError," при установке Sell-ордера");
   }         
   else{
     if(UseSound){
       PlaySound(NameSound);
     }
   }
В Вашем коде если установка Селл-ордера удачна, то функция ни как не может вернуть значение меньше нуля. Сама конструкция if() у Вас написана не верно - знак "<" явно лишний, а чтоб Ваша конструкция сработала, нужно было писать не true, а false и убрать знак сравнения.
 
Ставьте фигурные скобки красиво, ровно - иначе запутаться в них раз плюнуть.
 
drknn:
Ставьте фигурные скобки красиво, ровно - иначе запутаться в них раз плюнуть.

Спасибо за ответ

Я переделал

//+------------------------------------------------------------------+
//|                                                 Gbpusdm5fast.mq4 |
//|                       Copyright © 2006, Mirakhmedov Anvar        |
//|                                                                  |
//+------------------------------------------------------------------+
 
#property copyright "Copyright © 2007, Mirakhmedov Anvar"
 
extern int  _MagicNumber = 23;
extern double Lots =0.1;
extern double step0 = 0.00021;
extern double step1 = 0.001;
extern double rsibuy = 70;
extern double rsisell = 30;
extern double _point =5;
extern double StopLoss = 500;
extern double TakeProfit = 500;
extern double _point1 =80;
 
int start()
 
{
int ticket;
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
    //---- перебираем все открытые позиции
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
  //---- если при выборе позиции возникла ошибка, переходим к следующей
        if ( !OrderSelect( z, SELECT_BY_POS ) )
        {
            _GetLastError = GetLastError();
         
            continue;
        }
 
// если позиция открыта не по текущему инструменту, пропускаем её
        if ( OrderSymbol() != Symbol() ) continue;
 
// если MagicNumber не равен _MagicNumber, пропускаем 
// эту позицию
        if ( OrderMagicNumber() != _MagicNumber ) continue;
 
        //---- если открыта БАЙ-позиция,
        if ( OrderType() == OP_BUY )
        {
            //---- если МАКД пересёк 0-ю линию вниз,
     if((Open[0]-Close[0])> _point1*Point ||
            iSAR(NULL,0,step0,0.1,0)>Close[0]) 
           
            {
                //---- закрываем позицию
                if ( !OrderClose( OrderTicket(), OrderLots(), 
                    Bid, 5, Green ) )
                {
                    _GetLastError = GetLastError();
                    Alert( "Ошибка OrderClose № ", _GetLastError );
                    return(-1);
                }
            }
// если сигнал не изменился, выходим - пока рано открывать 
// новую позицию
           else
            { return(0); }
        }
        //---- если открыта СЕЛЛ-позиция,
        if ( OrderType() == OP_SELL )
        {
        if((Close[0]-Open[0])> _point1*Point||
          iSAR(NULL,0,step0,0.1,0)<Close[0])
        
          
            {
                //---- закрываем позицию
                if(!OrderClose( OrderTicket(), OrderLots(), 
                   Ask, 5, Red ) )
                {
                    _GetLastError = GetLastError();
                    Alert( "Ошибка OrderClose № ", 
                          _GetLastError );
                    return(-1);
                }
            }
// если сигнал не изменился, выходим - пока рано открывать 
// новую позицию
            else return(0);
        }
    }
 
//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет|
//| проверяем, есть ли возможность открыть позицию                   |
//+------------------------------------------------------------------+
         if(iSAR(NULL,0,step0,0.1,0)<Close[0]
  && iRSI(NULL,0,14,PRICE_CLOSE,0)>rsibuy &&
   (Close[0]-Open[0])> _point*Point)
 
        {
       ticket = (OrderSend( Symbol(), OP_BUY, Lots, Ask, 5, 0.0, 
           0.0, "Gbpusdm5fast",
              _MagicNumber, 0, Green ) );
 
     if(ticket>0)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                       Alert("BUY orders opened : ",OrderOpenPrice());
      }
           else 
        Print("Error opening BUY orders : ",GetLastError()); 
        return(0);
   }
       
     if(iSAR(NULL,0,step0,0.1,0)>Close[0]
  && iRSI(NULL,0,14,PRICE_CLOSE,0)<rsisell &&
       (Open[0]-Close[0])> _point*Point)
    {
        //---- открываем СЕЛЛ позицию
        ticket = (OrderSend( Symbol(), OP_SELL, Lots, Bid, 5, 0.0, 
           0.0, "Gbpusdm5fast",
              _MagicNumber, 0, Red ));
                         
                          if(ticket>0)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                       Alert("SELL orders opened : ",OrderOpenPrice());
      }
           else 
        Print("Error opening SELL orders : ",GetLastError()); 
        return(0);
   }
    
 
    return(0);
}

Теперь мне нужно что бы при закрытии позиции срабатывал Alert()

Помогите пожалуйста.

 
Чтобы срабатывал Аlert при закрытии позиции в каком случае? В смысле, при наступлении каких условий должен сработать алерт?
 
drknn:
Чтобы срабатывал Аlert при закрытии позиции в каком случае? В смысле, при наступлении каких условий должен сработать алерт?

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