Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 827

 
yur4ik:
Здравствуйте! Помогите пожалуйста с модулем сигналов на закрытие позиций. Что я не так делаю?

Ваш файл - это модуль СИГНАЛОВ. В системе эксперта он встраивается так же как и модуль СИГНАЛОВ ПОЛЬЗОВАТЕЛЬСКОГО индикатора. Другими словами сигналы генерируемые Вашим модулем имеют ВЕС и может случится так, что этого веса не хватит для срабатывания сигнала.


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

 
Vladimir Karputov:

Ваш файл - это модуль СИГНАЛОВ. В системе эксперта он встраивается так же как и модуль СИГНАЛОВ ПОЛЬЗОВАТЕЛЬСКОГО индикатора. Другими словами сигналы генерируемые Вашим модулем имеют ВЕС и может случится так, что этого веса не хватит для срабатывания сигнала.


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

Хотелось бы в виде модуля сигналов, что бы через генератор советников собирать можно было. В момент, когда должен срабатывать данный модуль, LongCondition() и ShortCondition() во втором модуле советника возвращают нулевые значения - то есть вес=0, я правильно понимаю? Соответственно вес сигнала данного модуля должен перевесить, но он не срабатывает. В CheckCloseLong() и CheckCloseShort() я вставил строки Print("-------------"); и Print(time_GMT_DST()); которые, при нормальной работе модуля, должны делать соответствующие записи в журнал при поступлении каждого тика, я правильно понимаю? Записи не делаются, CheckCloseLong() и CheckCloseShort() не вызываются. В чем подвох?

Я конечно топорно объясняю, но я только учусь
 
yur4ik:

Хотелось бы в виде модуля сигналов, что бы через генератор советников собирать можно было. В момент, когда должен срабатывать данный модуль, LongCondition() и ShortCondition() во втором модуле советника возвращают нулевые значения - то есть вес=0, я правильно понимаю? Соответственно вес сигнала данного модуля должен перевесить, но он не срабатывает. В CheckCloseLong() и CheckCloseShort() я вставил строки Print("-------------"); и Print(time_GMT_DST()); которые, при нормальной работе модуля, должны делать соответствующие записи в журнал при поступлении каждого тика, я правильно понимаю? Записи не делаются, CheckCloseLong() и CheckCloseShort() не вызываются. В чем подвох?

Я конечно топорно объясняю, но я только учусь

Используйте методы

   //--- methods of checking if the market models are formed
   virtual int       LongCondition(void);
   virtual int       ShortCondition(void);

вместо своих CheckCloseLong и  CheckCloseShort.

 
fxsaber:

Спасибо.

 

Здравствуйте, подскажите, как сделать счетчик убыточных сделок?
Советник анализирует последнюю сделку на истории - если она убыточна, то добавляет +1 к переменной, которая и будет являться количеством подряд убыточных сделок.

Как только прибыльная сделка наступает - переменную нужно обнулить.

 
Nikita Chernyshov:

Здравствуйте, подскажите, как сделать счетчик убыточных сделок?
Советник анализирует последнюю сделку на истории - если она убыточна, то добавляет +1 к переменной, которая и будет являться количеством подряд убыточных сделок.

Как только прибыльная сделка наступает - переменную нужно обнулить.

Можно отказаться от работы с торговой историей и работать только в OnTradeTransaction() - там ловить сделку с типом "OUT" - то есть это и будет закрытие позиции. Как только такая сделка нашлась - определяем была она прибыльной или убыточной. Соответственно счётчик "losses" сбрасываем или увеличиваем.

//+------------------------------------------------------------------+
//| 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)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_commission+deal_swap+deal_profit>0)
              {
               losses=0;
              }
            else
              {
               losses++;
              }
           }
     }
  }
А проверку в торговой истории делать в OnInit() - один раз при старте советника.
 

Всем привет,

Не подскажите как можно программно очистить журнал экспертов перед выводом в него информацию :?

Только через Win API?

Спасибо!

 
Vitaliy Sendyaev:

Всем привет,

Не подскажите как можно программно очистить журнал экспертов перед выводом в него информацию :?

Только через Win API?

Спасибо!

Журнал только через Win API. 
 
Приветствую. Вопрос, в большей степени, логический.
Так называемая система антимартингейл, с ограничением количества увеличений. При закрытии в профит, следующий лот увеличивается на коэффициент. При убытке или если количество прибыльных позиций, идущих подряд, превысит указанное число, лот равен стартовому.
После превышения указанного количества прибыльных позиций, как начать цикл увеличения заново?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Приветствую. Вопрос, в большей степени, логический.
Так называемая система антимартингейл, с ограничением количества увеличений. При закрытии в профит, следующий лот увеличивается на коэффициент. При убытке или если количество прибыльных позиций, идущих подряд, превысит указанное число, лот равен стартовому.
После превышения указанного количества прибыльных позиций, как начать цикл увеличения заново?


/

Пример в коде Stop Loss Take Profit: размер лота хранится (перезаписывается, увеличивается и сбрасывается в минимум) в переменной "ExtLot" объявленной на глобальном программном уровне (в шапке). В OnTradeTransaction() отлавливается сделки с типом "выход из рынка" и проверяется как была закрыта сделка - по Тейк Профит или по Стоп Лосс:

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Если по Стоп Лосс то удваиваем лот, если по Тейк Профит - то сбрасываем размер лота в минимальное значение.


Примечание: в самом советнике немного некорректно выполняется расчёт Стоп Лосс и Тейк Профит - но скоро переопубликуется код.