Уважаемые Программисты не проходите мимо, помогите исправить ошибку!

 

Уважаемые Программисты не проходите мимо, помогите исправить ошибку!

Вставил в советник исполнение звукового сигнала при открытии, закрытии, изменении, закрытии по стоплоссу и ошибке.

Всё работает прекрасно, кроме закрытия по стоплоссу, видимо я не туда вставил воспроизведение звука и так как я не очень в этом понимаю прошу Вашей помощи.

Весь код выкладывать нет смысла, покажу часть где по моему мнению должен воспроизводиться звук.

Итак, есть счётчик открытых позиций и мне кажется, что где то в этом счётчике должна стоять команда для воспроизводства звука при изменении количества открытых позиций 

//+------------------------------------------------------------------+
//| Total Positions                                                  |
//+------------------------------------------------------------------+
int TotalPositions(int Type)
  {
   int cnt=0;
   if(PositionsTotal()>0)
      for(int i=PositionsTotal()-1; i>=0; i--)
         if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==MagicNumber)
           {
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && (Type==0 || Type==-1))
              {
               cnt++;
               continue;
              }
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && (Type==1 || Type==-1))
              {
               cnt++;
              }
           }
   return(cnt);
   if(UseSound)
      PlaySound(SoundStop); //Sound не работает???
  }

при вставлении перед реторном квакает на каждом тике, после реторна молчит как рыба.

Подскажите пожалуйста недоучке, что не так, как исправить и куда вставить команду звука

 
ElenaVVT:

Уважаемые Программисты не проходите мимо, помогите исправить ошибку!

Вставил в советник исполнение звукового сигнала при открытии, закрытии, изменении, закрытии по стоплоссу и ошибке.

Всё работает прекрасно, кроме закрытия по стоплоссу, видимо я не туда вставил воспроизведение звука и так как я не очень в этом понимаю прошу Вашей помощи.

Весь код выкладывать нет смысла, покажу часть где по моему мнению должен воспроизводиться звук.

Итак, есть счётчик открытых позиций и мне кажется, что где то в этом счётчике должна стоять команда для воспроизводства звука при изменении количества открытых позиций 

при вставлении перед реторном квакает на каждом тике, после реторна молчит как рыба.

Подскажите пожалуйста недоучке, что не так, как исправить и куда вставить команду звука

Пожалуйста для вставки кода используйте кнопку  Code (Ваш код я на первый раз вставил правильно и ещё применил  Стилизатор)

 
Vladimir Karputov:

Пожалуйста для вставки кода используйте кнопку   (Ваш код я на первый раз вставил правильно и ещё применил  )

Спасибо Владимир, я первый раз :)

 
ElenaVVT:

Уважаемые Программисты не проходите мимо, помогите исправить ошибку!

Вставил в советник исполнение звукового сигнала при открытии, закрытии, изменении, закрытии по стоплоссу и ошибке.

Всё работает прекрасно, кроме закрытия по стоплоссу, видимо я не туда вставил воспроизведение звука и так как я не очень в этом понимаю прошу Вашей помощи.

Весь код выкладывать нет смысла, покажу часть где по моему мнению должен воспроизводиться звук.

Итак, есть счётчик открытых позиций и мне кажется, что где то в этом счётчике должна стоять команда для воспроизводства звука при изменении количества открытых позиций 

при вставлении перед реторном квакает на каждом тике, после реторна молчит как рыба.

Подскажите пожалуйста недоучке, что не так, как исправить и куда вставить команду звука

Любую торговую операцию нужно отлавливать в OnTradeTransaction - Вы обнаружите любую сделку: вход в рынок, выход из рынка. При этом можно всегда уточнить почему был выход: из-за срабатывания Стоп лосс или Тейк профит.

Примеры:

Alert Position Open
Alert Position Open
  • www.mql5.com
При открытии позиции (или советником или вручную или при срабатывании отложенного ордера) советник сигнализирует об этом. Сработал отложенный Buy Limit ордер: Была выставлена позиция по рынку: Эксперт...
 
В вашем коде оператор "return(cnt)" завершает работу функции раньше, чем запускается воспроизведение звука. Нужно добавить условие при котором будет вопроизводиться звук.
 
//+------------------------------------------------------------------+
//| Total Positions                                                  |
//+------------------------------------------------------------------+
int TotalPositions(int Type)
  {
   int cnt=0;
   static int cnt_pre=0;
   if(PositionsTotal()>0)
      for(int i=PositionsTotal()-1; i>=0; i--)
         if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==MagicNumber)
           {
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && (Type==0 || Type==-1))
              {
               cnt++;
               continue;
              }
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && (Type==1 || Type==-1))
              {
               cnt++;
              }
           }
   if(UseSound && cnt_pre!=cnt)
      PlaySound(SoundStop); //Sound работает
   cnt_pre = cnt;
   return(cnt);
  }

Поправил ваш код.

 
bruk.g:
В вашем коде оператор "return(cnt)" завершает работу функции раньше, чем запускается воспроизведение звука. Нужно добавить условие при котором будет вопроизводиться звук.

Спасибо большое! Значит я был на верном пути. Буду тестировать, отпишусь.

 
Vladimir Karputov:

Любую торговую операцию нужно отлавливать в OnTradeTransaction - Вы обнаружите любую сделку: вход в рынок, выход из рынка. При этом можно всегда уточнить почему был выход: из-за срабатывания Стоп лосс или Тейк профит.

Примеры:

//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
   {
   }

Спасибо Владимир. Как видите Trade function у меня пустая, и функции OnTradeTransaction нет. Количество позиций ослеживается через функцию TotalPositions, как я понимаю, вот туда я и втыкал звук, возможно я ошибаюсь...

 
bruk.g:
В вашем коде оператор "return(cnt)" завершает работу функции раньше, чем запускается воспроизведение звука. Нужно добавить условие при котором будет вопроизводиться звук.

Хорошо, спасибо, тогда в этом случае он будет квакать при любом изменении в количестве открытых позиций, тоесть при открытии, закрытии по обратному сигналу, закрытии по стоплоссу.

if(!trade.Buy(lot,NULL,NormalizeDouble(lprice.ask,_Digits),sl,tp,Cmt)) 
      {Print("Buy order open error=",trade.ResultRetcode(), ". description: ",trade.ResultRetcodeDescription()); 
      if(UseSound) PlaySound(SoundError);}
   else 
      {Print("Buy order open opened success. respond=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")");
      if(UseSound) PlaySound(SoundOpenPosition); return(true);}

Так звучит открытие или ошибка

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && (Type==POSITION_TYPE_BUY || Type==-1)) {trade.PositionClose(PositionGetTicket(i),iSlippage);
   if(UseSound) PlaySound(SoundClosePosition); continue;}

Так звучит закрытие по обратному сигналу

А как мне тогда поймать закрытие по стоп лоссу/тейк профиту только???

 

Отлавливаем срабатывание Стоп лосс или Тейк профит.

Отлавливаем через OnTradeTransaction - проверяем свойство ENUM_DEAL_TYPE (Причина или источник проведения сделки), если это

DEAL_REASON_SL

Сделка проведена в результате срабатывания ордера Stop Loss

DEAL_REASON_TP

Сделка проведена в результате срабатывания ордера Take Profit


сигнализируем.


//+------------------------------------------------------------------+
//|                                              SL TP Triggered.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.001"
/*
   barabashkakvn Trading engine 3.137
*/
#include <Trade\DealInfo.mqh>
//---
CDealInfo      m_deal;                       // object of CDealInfo class
//--- input parameters
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: HistoryDealSelect(",trans.deal,")");
         return;
        }
      //---
      long reason=-1;
      if(!m_deal.InfoInteger(DEAL_REASON,reason))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: InfoInteger(DEAL_REASON,reason)");
         return;
        }
      if((ENUM_DEAL_REASON)reason==DEAL_REASON_SL)
         Alert("Stop Loss activation");
      else
         if((ENUM_DEAL_REASON)reason==DEAL_REASON_TP)
            Alert("Take Profit activation");
     }
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Сделка является отражением факта совершения торговой операции на основании ордера, содержащего торговый приказ. Каждая сделка описывается свойствами, позволяющими получить информацию о ней. Для чтения значений свойств используются функции вида Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая...
Файлы:
 
Vladimir Karputov:

Отлавливаем срабатывание Стоп лосс или Тейк профит.

Отлавливаем через OnTradeTransaction - проверяем свойство ENUM_DEAL_TYPE (Причина или источник проведения сделки), если это

DEAL_REASON_SL

Сделка проведена в результате срабатывания ордера Stop Loss

DEAL_REASON_TP

Сделка проведена в результате срабатывания ордера Take Profit


сигнализируем.


Спасибо большое Владимир!

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

...либо я могу заменить "Алерт" своей командой на воспроизведение звука?