Профи, не проходите мимо, оцените пожалуйста эксперта

 

Здравствуйте.

Пару месяцев назад увидел ветку https://www.mql5.com/ru/forum/112887 ,прочитал, скачал советника, кое чего изменил, переделал. Пару месяцев тестировал на демо, теперь хочу ставить на реал, вернее уже как бы стоит и удалось даже заработать 20$. Но при депозите в 480$ cъел всё маржу и хорошо что рынок развернулся и всё хорошо закончилось.

Так как у меня нет опыта в программировании советников для работы на реале, прошу посмотреть тех у кого есть, может увидите касяки или появятся предложения по доработке.Код не большой и не займёт много времени что б разобратся.

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

Файлы:
 

Проверьте функцию LotSize и расставьте скобки в конструкции с if(). По-моему там локальная инициализация переменной lot, не понимаю почему компайлер молчит...

 
Choomazik >>:

Проверьте функцию LotSize и расставьте скобки в конструкции с if(). По-моему там локальная инициализация переменной lot, не понимаю почему компайлер молчит...

функция взета гдето с форума.Спасибо, не проверял её, только дело не в ней а в остальном алгоритме, как он реализован?

 
Есть мысли как можно высвободить маржу??????
 
И как можно учесть стоплевел при совокупном выставлении уровня тайкпрофит???
 
Вот, дописал блок контроля просадки, вроде получше стало
Файлы:
 

Может ещё появятся мысли по улучшению

Вроде перспектива у него есть.....

 

Подскажите как учесть при совокупном выставлении уровня Тэйкпрофита для пачки ордеров, допустимый уровень стоплевел

Иногда выскакивает ошибка 130

void modify()
 {
    x1=0;
    y1=0;
    profit_buy=0;
    profit_sell=0;
    n_buy =0;
    n_sell =0;
    op_buy =0;
    op_sell =0;
    op_buy_sred =0;
    op_sell_sred =0;
    lots_buy =0;
    lots_sell =0;
    t_p_buy =0;
    t_p_sell =0;
    delta_buy =0;
    delta_sell =0;
    max = 0;
    spred = MarketInfo(Symbol(),MODE_SPREAD);
   //======================
   int j=OrdersTotal()-1;
   for (int i=j;i>=0;i--)
      {
        OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()==magic_buy && OrderSymbol()==Symbol())
           {
             n_buy=n_buy+1;
             op_buy=op_buy+OrderOpenPrice();
             lots_buy=lots_buy+OrderLots();
           }  
        if(OrderMagicNumber()==magic_sell && OrderSymbol()==Symbol())
           {
             n_sell=n_sell+1;
             op_sell=op_sell+OrderOpenPrice();
             lots_sell=lots_sell+OrderLots();
           }
      }
    //---------------
    if(n_buy>0)
     { 
       op_buy_sred=op_buy/n_buy;
       op_buy_sred=NormalizeDouble( op_buy_sred,Digits); 
       delta_buy=0.1/lots_buy;
       delta_buy=NormalizeDouble(delta_buy,2)* target_1*Point;
       t_p_buy=op_buy_sred+delta_buy; 
       t_p_buy=NormalizeDouble(t_p_buy,Digits);
       
     }
    if(n_sell>0)
     { 
       op_sell_sred=op_sell/n_sell;  
       op_sell_sred=NormalizeDouble( op_sell_sred,Digits);
       delta_sell=0.1/lots_sell;
       delta_sell=NormalizeDouble(delta_sell,2)* target_1*Point; 
       t_p_sell=op_sell_sred-delta_sell;
       t_p_sell=NormalizeDouble(t_p_sell,Digits);
      
    }   
    
    if(t_p_buy!=t_p_buy1&&t_p_buy!=0)
      {
        t_p_buy1 = t_p_buy;
         j=OrdersTotal()-1;
        for (i=j;i>=0;i--)
          {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY && OrderMagicNumber()==magic_buy&& OrderSymbol()==Symbol())
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),t_p_buy,0,Blue);
           
          }
     }  
    if(t_p_sell!=t_p_sell1&&t_p_sell!=0)
      {
        t_p_sell1 = t_p_sell;
         j=OrdersTotal()-1;
        for (i=j;i>=0;i--)
          {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL && OrderMagicNumber()==magic_sell&& OrderSymbol()==Symbol())
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),t_p_sell,0,Blue);
           
          }
     }
      return;       
  }
 

Оптимизация за последний год и прогон с теми же параметрами за 2 года, лот постоянный. По теории вроде как стратегия рабочая. Правильно?

Отчёт уже за 2 года.


 

В теории и надеюсь на практике.

Главная особенность это гарантированная не большая прибыль немного, но часто.

Основная задача максимально снизить возможную просадку.

Может ещё кто знает как можно улучшить эксперта?

Пока мыслей новых нет.

 
Vitya писал(а) >>

Подскажите как учесть при совокупном выставлении уровня Тэйкпрофита для пачки ордеров, допустимый уровень стоплевел

Иногда выскакивает ошибка 130

После того, как Вы расчитали новый уровень установки TP, сравните разницу между ним и текущей ценой со значением

MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point

и в случае необходимости скорректируйте расчитанный уровень TP.

Но хочу отрбатить Ваше внимание на одну тонкость. При групповой модификации ордеров цена может сдвинуться ближе к значению расчитанного TP и тогда Вы вновь получите ошибку 130, но часть ордеров будет модифицирована. Для борьбы с этим явлением стоит добавить внешнюю переменную, которая будет содержать количество добавочных пунктов к значению stoplevel. Т.о. Ваш код можно поправить так:

extern   int   STOPLEVEL_addition = 1;

//
// . . .
//

void modify()
{
//
// . . .
//
   if( n_buy>0 )
   {
      op_buy_sred = op_buy / n_buy;
      op_buy_sred = NormalizeDouble( op_buy_sred, Digits );
      delta_buy   = 0.1 / lots_buy;
      delta_buy   = NormalizeDouble( delta_buy, 2 ) * target_1 * Point;
      t_p_buy     = op_buy_sred + delta_buy;
      if ( ( t_p_buy - Bid ) < ( ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point ) )
         t_p_buy  = Bid + ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point;
      t_p_buy     = NormalizeDouble( t_p_buy, Digits);
   }
   if( n_sell>0 )
   { 
      op_sell_sred= op_sell / n_sell;  
      op_sell_sred= NormalizeDouble( op_sell_sred, Digits );
      delta_sell  = 0.1 / lots_sell;
      delta_sell  = NormalizeDouble( delta_sell, 2 ) * target_1 * Point;
      t_p_sell    = op_sell_sred - delta_sell;
      if ( ( Ask - t_p_sell ) < ( ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point ) )
         t_p_sell = Ask - ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point;
      t_p_sell    = NormalizeDouble( t_p_sell, Digits );
   }   
//
// . . .
//
   return;       
}  //modify()

И еще пара замечаний

1) Мне кажется Вы злоупотребляете нормализацией значений. Достаточно нормализовать t_p_buy и t_p_sell, смысла в нормализации значений op_buy_sred, delta_buy, op_sell_sred и delta_sell я не вижу.

2) Если Вы модифицируете ордера с разным значением OrderLots(), то расчет op_buy_sred и op_sell_sred неверный.

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