Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Увеличивай свой рейтинг. Выполняй заказы в сервисе Фриланс!
Виктор
352
Виктор 2009.12.20 16:09 

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

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

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

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

Файлы:
Petro Mohyla
1150
Petro Mohyla 2009.12.20 16:30  

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

Виктор
352
Виктор 2009.12.20 16:49  
Choomazik >>:

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

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

Виктор
352
Виктор 2009.12.20 17:24  
Есть мысли как можно высвободить маржу??????
Виктор
352
Виктор 2009.12.20 17:26  
И как можно учесть стоплевел при совокупном выставлении уровня тайкпрофит???
Виктор
352
Виктор 2009.12.20 21:34  
Вот, дописал блок контроля просадки, вроде получше стало
Виктор
352
Виктор 2009.12.20 21:35  

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

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

Виктор
352
Виктор 2009.12.21 08:59  

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

Иногда выскакивает ошибка 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;       
  }
Yuri
634
Yuri 2009.12.21 17:04  

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

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


Виктор
352
Виктор 2009.12.25 20:54  

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

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

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

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

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

PapaYozh
3768
PapaYozh 2009.12.26 11:57  
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 неверный.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий