Не работает функция расчета мартина. Что я делаю не так? Помогите разобраться... - страница 2

 
//Функция должна после  n - убыточных сделок увеличивать лот на заданный коэффициент

double Martin_Lot(double martin_L)
   {
   double new_lot = 0;
   ulong ticket=0;
   int new_loss = 0;

   if(!InpMartin)
     {
      Print("Мартингейл выключен в настройках");
      return(martin_L);
     }

// получаю доступ к истории
   datetime from_date=0;                 // с самого начала
   datetime to_date=TimeCurrent();       // по текущий момент
   HistorySelect(from_date,to_date);     // запрашиваю историю сделок в указанном интервале
   int deals=HistoryDealsTotal();        // получаю количество сделок в истории
   Print("сделок в истории = ",deals);
   for(int i=deals-1; i>=0; i--)         // обрабатываю каждую сделку (с конца??)
     {
      if((ticket=HistoryDealGetTicket(i))>0)   //  тикет сделки номер(i)
        {
         // свойства сделки
         string  symbol=           HistoryDealGetString(ticket,DEAL_SYMBOL);
         long    type  =           HistoryDealGetInteger(ticket,DEAL_TYPE);   // тип торговой операции
         long    entry =           HistoryDealGetInteger(ticket,DEAL_ENTRY);  // Направление сделки – вход в рынок, выход из рынка или разворот
         long    deal_magic=       HistoryDealGetInteger(ticket,DEAL_MAGIC);
         double  profit=           HistoryDealGetDouble(ticket,DEAL_PROFIT);  // Финансовый результат сделки
         double  deal_commission=  HistoryDealGetDouble(ticket,DEAL_COMMISSION);  // Комиссия по сделке
         double  deal_swap=        HistoryDealGetDouble(ticket,DEAL_SWAP);       // Накопленный своп при закрытии
         double  deal_volume=      HistoryDealGetDouble(ticket,DEAL_VOLUME);   // объем операции
         double  price=            HistoryDealGetDouble(ticket,DEAL_PRICE);   // Цена сделки
         datetime transaction_time=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);       // время совершения сделки
         long    position_ID=      HistoryDealGetInteger(ticket,DEAL_POSITION_ID);  // идентификатор позиции
         

         if(symbol==m_symbol.Name() && deal_magic==m_magic)
            if(entry==DEAL_ENTRY_OUT && (type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL)) //  Направление сделки. DEAL_ENTRY_OUT- Выход из рынка
              {
               if((deal_commission + deal_swap + profit)>0.0)
                 {
                  new_lot= martin_L; // лот приводим к начальному
                  new_loss = 0;              // обнуляю счетчик убыточных сделок 
                  break;
                 }
              }
        

      if(new_loss==InpMartinOrdinalNumber)  // порядковый номер убыточной сделки (№ 2), начиная с которой будет производится увеличение объема
        {
         new_lot= martin_L * KLot; //увеличиваем следующий лот на коэффициент KLot
         new_loss++; // это возможно вынести перед этой области if
        }
       }        
     }
   return(new_lot);
  }

а так?

 
Если что? Что-нибудь должно быть за скобками. 
 
Sergey:

эта фишка пишет сколько сделок в истории?

Print("сделок в истории = ",deals);
 
Renat Akhtyamov:

эта фишка пишет сколько сделок в истории?

да, пишет 1 сделка. При этом тестер график не рисует вообще
 
Aleksey Mavrin:

а так

эффекта никакого.  По прежнему на вход функции подается лот 0.1, на выходе почему -то 0

 
Sergey:
да, пишет 1 сделка. При этом тестер график не рисует вообще

а в параметрах - 2

InpMartinOrdinalNumber        = 2;              // порядковый номер убыточной сделки, начиная с которой будет производится увеличение объема;

будет 2-я убыточная, тогда и заработает скорее всего

либо искать ошибку в коде, почему не может найти вторую убыточную, если она по факту есть

 
Renat Akhtyamov:

а в параметрах - 2

будет 2-я убыточная, тогда и заработает скорее всего

либо искать ошибку в коде, почему не может найти вторую убыточную, если она по факту есть

Задачу решил. Как и предполагалось ошибка была логической. Рабочий код выкладываю, может кому пригодится. Всем спасибо, кто проявил участие.

double Martin_Lot(double martin_L)
  {
    bool ord;
   double TotalLot=0;
// если мартингейл выключен, выставляем расчитываемый "базовый лот"
   if(!InpMartin)
     {
      Print("Мартингейл выключен в настройках");
      return(martin_L);
     }

// получаю доступ к истории
   datetime from_date=0;                 // с самого начала
   datetime to_date=TimeCurrent();       // по текущий момент
   HistorySelect(from_date,to_date);     // запрашиваю историю сделок в указанном интервале
   int deals=HistoryDealsTotal();        // получаю количество сделок в истории
   Print("сделок в истории = ",deals);
   for(int i=deals-1; i>=0; i--)         // обрабатываю каждую сделку (с конца??)   
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);  // Выбирает в истории сделку для дальнейших обращений к ней  через соответствующие функции
      
      if ( ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol 
      && HistoryDealGetInteger(ticket,DEAL_MAGIC) == m_magic 
      && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT )  //  Направление сделки. DEAL_ENTRY_OUT- Выход из рынка
         {
         if ( HistoryDealGetDouble(ticket,DEAL_PROFIT) +           // Финансовый результат сделки 
              HistoryDealGetDouble(ticket,DEAL_COMMISSION) +       // Комиссия по сделке
              HistoryDealGetDouble(ticket,DEAL_SWAP) < 0 )         // Накопленный своп при закрытии
            {
            TotalLot+=HistoryDealGetDouble(ticket,DEAL_VOLUME);    // объем операции
            }
         else
            {
            break;
            }
         }
      } 
   return TotalLot == 0 ? martin_L: TotalLot;
   }
Причина обращения: