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

 


 

//Функция должна после  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++;
        }
     }
   return(new_lot);
  }
 
Sergey:

Надо хотя-бы глобальную секцию показывать, да и OnInit не кисло бы. 

Ну и распечатку результата работы программы. 

 
нормализация лота есть ?
как написано выше код нужен почти весь
 
Iurii Tokman:
нормализация лота есть ?
как написано выше код нужен почти весь

Да, нормализация есть. Параметром функции является расчитываемый размер лота, из другой функции.

Результат работы фукции : размер лота 0

void OnTick()
{
  double oto = LotsByRisk(Risk_,SL_);
   double Lot = Martin_Lot(oto);


Получим сигналы для покупки
   if(BuySignal() == true)                 // если есть сигнал на покупку
     {
      // Alert("получен сигнал на покупку");
      if(m_position.Select(_Symbol))         // если уже существует позиция по этому символу
        {
         if(m_position.PositionType()==POSITION_TYPE_SELL)
            m_trade.PositionClose(_Symbol);  // и тип этой позиции Sell, то закрываем ее
         if(m_position.PositionType()==POSITION_TYPE_BUY)
            return;                           // а если тип этой позиции Buy, то выходим
        }

      //--- Вычисляем стопы
      if(SL_==0)
         stop=0;
      else
         stop=NormalizeDouble(Ask-SL_*_Point,_Digits);
      if(TP_==0)
         take=0;
      else
         take=NormalizeDouble(Ask+TP_*_Point,_Digits);

      m_trade.Buy(Lot,_Symbol,Ask,stop,take);                                  //если дошли сюда, значит позиции нет, открываем ее
      Alert("позиции на покупку нет, открываем ее");


}
 
А глобальная секция? А распечатка? 
 

мда...

нужно в клуб телепатов

 
Алексей Тарабанов:
А глобальная секция? А распечатка? 

Глобальная секция

input double Risk_   = 3;             // риск на сделку,%
input int  TP_        = 300;
input int  SL_       = 300;

input bool                 InpMartin                     = true;           // флаг использовать Мартингейл
input double               KLot          = 1.3;            // коэффициент увеличения объема позиции;
input int                  InpMartinOrdinalNumber        = 2;              // порядковый номер убыточной сделки, начиная с которой будет производится увеличение объема;

 Журнал ничего не показывает, ошибок нет.  Для всех функций делал распринтовку. Все корректно работает, за исключение функции Martin_Lot. Думаю ошибка логическая, но сам найти не могу..

 

а эта функция где?

LotsByRisk(Risk_,SL_);
 

Это что? 

if((ticket=HistoryDealGetTicket(i))>0)   //  тикет сделки номер(i)
 
Renat Akhtyamov:

а эта функция где?

double LotsByRisk(double risk,int sloss)
  {
   double  lot_min = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);  
   double  lot_max = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);   
   double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);  
   double  lotcost = ((SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)*_Point)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE))); 
   double lot = 0;
   double UsdPerPip = 0;
   lot = AccountInfoDouble(ACCOUNT_BALANCE)*risk/100;
   UsdPerPip = lot/sloss;
   lot = NormalizeDouble(UsdPerPip/lotcost, 2);
   lot = NormalizeDouble(lot/lot_step, 0) * lot_step;
   
   if(lot < lot_min)
      lot = lot_min;
   if(lot > lot_max)
      lot = lot_max;
   return(lot);
  }
 
Алексей Тарабанов:

Это что? 

Должна быть проверка на наличие тикета сделки. С этой строкой что-то не то?

Причина обращения: