EA N7S_AO_772012 - страница 9

 
У меня версия с тралом нормлально оптимизирутеся...
 

Навесил трал "удавка". По результатам и сетам на прошлую неделю результаты неплохи. Уменьается просадка. Растет профит. 

Тестируйте... 

Исправление кода

void trl(){
      total= OrdersTotal(); spread = MarketInfo(Symbol(), MODE_SPREAD);
  for(  i = total - 1; i >= 0; i--) 
     { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); MN=OrderMagicNumber();
       if(OrderSymbol() == Symbol() && MN>= 772012000 && MN<=772012199) 
         {  if (MN==772012055) {sl = slx; tp = tpx*slx; mn= mnx1;}
            if (MN==772012155) {sl = sly; tp = tpy*sly; mn= mny1;}
            if (MN==772012011) {sl = slX; tp = tpX*slX; mn= mnX1;}
            if (MN==772012111) {sl = slY; tp = tpY*slY; mn= mnY1;}
//Правим SL в зависимости от прибыли (от растояния в пипсах. Первый шаг = sl. ВТорой sl + sl/2 третий sl+ sl/2 + sl / 3 и т.п. 
         
           int prevticket = OrderTicket();if(OrderType() == OP_BUY) 
             {if(DayOfWeek( ) == 5 && Hour( ) >=22)  { OrderClose(prevticket,OrderLots( ) ,Bid,3,Red);} 
              if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point)) 
                 { if(BTS()< 0) { OrderClose(prevticket,OrderLots( ) ,Bid,3,Red);} 
                   else  
                   TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}}
                   //Старый вариант
                   //{ OrderModify(OrderTicket(), OrderOpenPrice(), Bid - sl * Point,0, 0, Blue);}}} 
           else {if(DayOfWeek( ) == 5 && Hour( ) >=22) { OrderClose(prevticket,OrderLots( ) ,Ask,3,Blue);} 
                  if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) 
                     {if(BTS() > 0) 
                           { OrderClose(prevticket,OrderLots( ) ,Ask,3,Blue);} 
                     else TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}}
                     //{ OrderModify(OrderTicket(), OrderOpenPrice(), Ask + sl * Point, 0, 0, Blue);}}}
          return(0);}}}
 

Сама удавка

---------------

void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3)
   { 
   double newstop = 0; // новый стоплосс
   double trldist; // расстояние трейлинга (в зависимости от "пройденного" может = trl_dist_1, trl_dist_2 или trl_dist_3)

   // проверяем переданные значения
   if ((trl_dist_1<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_2<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_3<MarketInfo(Symbol(),MODE_STOPLEVEL)) || 
   (level_1<=trl_dist_1) || (level_2<=trl_dist_1) || (level_2<=level_1) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingUdavka() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ...
      if ((Bid-OrderOpenPrice())<=level_1*Point) trldist = trl_dist_1;
      if (((Bid-OrderOpenPrice())>level_1*Point) && ((Bid-OrderOpenPrice())<=level_2*Point)) trldist = trl_dist_2;
      if ((Bid-OrderOpenPrice())>level_2*Point) trldist = trl_dist_3; 
            
      // если стоплосс = 0 или меньше курса открытия, то если тек.цена (Bid) больше/равна дистанции курс_открытия+расст.трейлинга
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
         {
         if (Bid>(OrderOpenPrice() + trldist*Point))
         newstop = Bid -  trldist*Point;
         }

      // иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга, 
      else
         {
         if (Bid>(OrderStopLoss() + trldist*Point))
         newstop = Bid -  trldist*Point;
         }
      
      // модифицируем стоплосс
      if (newstop>OrderStopLoss())   
      OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ...
      if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_1*Point) trldist = trl_dist_1;
      if (((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_1*Point) && ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_2*Point)) trldist = trl_dist_2;
      if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_2*Point) trldist = trl_dist_3; 
      
      // если стоплосс = 0 или меньше курса открытия, то если тек.цена (Ask) больше/равна дистанции курс_открытия+расст.трейлинга
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
         {
         if (Ask<(OrderOpenPrice() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         newstop = Ask + trldist*Point;
         }

      // иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга, 
      else
         {
         if (Ask<(OrderStopLoss() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         newstop = Ask +  trldist*Point;
         }
               
       // модифицируем стоплосс
      if (newstop>0)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
         else
            {
            if (newstop<OrderStopLoss())   
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
            }
         }
      }      
   }
 
Casper писал(а) >>

Идея не плохая, еще бы работала :-)

Casper исправь плз здесь

TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}}

хотя бы так или на свое усмотрение

TrailingUdavka(OrderTicket(), sl, sl+sl/2, sl/2, 2*sl, sl/4);}}


Я уже говорил, что предпочитаю давать прибыли расти и резать убытки, поэтому к трейлингам отношусь осторожно.
Удавка IMHO не лучший способ, но кому-то она наверное понравится.

Я когда дойду до необходимости трейлинга буду в первую очередь делать это по фракталам и в дополнение просто закрывать с рынка.
И еще уважаю одну мудрость, если цена долгое время не идет в нужную сторону, она обязательно пойдет против Вас!!
Удачи всем и профитов!!!
P.S.
Casper повнимательнее, помни про "эффект сборки" и о "чайниках"

 
За Два прошедших дня этой недели полноценно на демо тестировать не получалось ( пятый знак Альпари тому "виной"))) Сегодня в полночь поставил исправленное и дополненное ПО по девяти инструментам.
По тестам эти два дня прошли лучше, чем прошлая неделя. Эквити $750.
Лидеры Евро +$354 Кабель +$257 Франк (что удивляет) +$176 В минусе йена -$90 еврйена -$162 и канадец чуть-чуть(что привычно) -$15 Остальные : киви +$89, фунтйена +$77 и EURGBP +$59
 
SHOOTER777 >>:

Идея не плохая, еще бы работала :-)

Casper исправь плз здесь

TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}}

хотя бы так или на свое усмотрение

TrailingUdavka(OrderTicket(), sl, sl+sl/2, sl/2, 2*sl, sl/4);}}


Я уже говорил, что предпочитаю давать прибыли расти и резать убытки, поэтому к трейлингам отношусь осторожно.
Удавка IMHO не лучший способ, но кому-то она наверное понравится.

Я когда дойду до необходимости трейлинга буду в первую очередь делать это по фракталам и в дополнение просто закрывать с рынка.
И еще уважаю одну мудрость, если цена долгое время не идет в нужную сторону, она обязательно пойдет против Вас!!
Удачи всем и профитов!!!
P.S.
Casper повнимательнее, помни про "эффект сборки" и о "чайниках"

Чем дальше уходит цена, тем выше возможность отката. И прибыль терять не стоит. Я успел прогнать по евройене и по фунтойене при сетах за прошлую неделю. На обоих парах выше прибыль и ниже просадка.

ЧТо касается вызова - согласен. Ошибся. Там еще и условие поменять надо. Иначе он ну уж очень большой шаг изначально делает. Как-то так наверное 

            if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point) || true) 
                 { if(BTS()< 0) { OrderClose(prevticket,OrderLots( ) ,Bid,3,Red);} 
                   else  
                   TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}}
                   //{ OrderModify(OrderTicket(), OrderOpenPrice(), Bid - sl * Point,0, 0, Blue);}}} 
           else {if(DayOfWeek( ) == 5 && Hour( ) >=22) { OrderClose(prevticket,OrderLots( ) ,Ask,3,Blue);} 
                  if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point) || true) 
                     {if(BTS() > 0) 
                           { OrderClose(prevticket,OrderLots( ) ,Ask,3,Blue);} 
                     else 
                     TrailingUdavka(OrderTicket(), sl, sl, sl+sl/2, sl/2, sl/4);}} 
                     //{ OrderModify(OrderTicket(), OrderOpenPrice(), Ask + sl * Point, 0, 0, Blue);}}}

Лениво сейчас переделывать блок. Убил соответсвующие if-ы  методом указания || true. Опять таки вернуть легко будет назад.. 

Что касается "эффекта сборки" и чайника. Я раньше достаточно серьезно программил на делфи C++ и C#. Но это было лет 5-6 назад наверное. Так что тоже могу портачить, навык к сожалению теряется. Поэтому и выкладываю код. 

Опять таки форум разработчиков... 

 

По отчётам похоже что инструмент в умелых руках автора РАБОТАЕТ.

Может пора на реал или хотя бы микро-реал?

 
goldtrader >>:

По отчётам похоже что инструмент в умелых руках автора РАБОТАЕТ.

Может пора на реал или хотя бы микро-реал?

У меня на реале центовом стоит... 

 
Casper >>:

У меня на реале центовом стоит...

Можно стейт приаттачить?

 
goldtrader писал(а) >>

По отчётам похоже что инструмент в умелых руках автора РАБОТАЕТ.

Может пора на реал или хотя бы микро-реал?

Не торопитесь!!!

Советник не будет нормально работать на реале, если брокер не дремлет.

Или хотя бы у Вас должна быть возможность постоянного контроля за терминалом.

Советник не умеет работать с реквотами и т.п.

Он не умеет проверять состояние и разделять торговые потоки если ставить много инструментов.

Не хватает еще одного флага-запрета при работе во время выхода новостей и резких спекулятивных колебаний,

и запрет торговли в том же направлении на одном баре.

Нет защиты от сбоев и не проверяется правильность входных параметров.

У меня на демо было пару раз сбрасывались входные параметры.

Что это - шутки брокера - терминал у меня от Альпари, или просто глюки.

Да еще кое-чего не хватает.

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