Трендовый советник (эксперт). Жду отзывов.

 

Предлагаю обсудить моего трендового советника. Тестировался на EURUSD H1 за 2006 год и, по моему мнению, показал хорошие результаты.


Обычно (зависит от параметров) выставлен один торгующий ордер и один отложенный (STOP).

В общем, чего я буду расписывать, вот код, попробуйте и выскажите свое мнение.

//+------------------------------------------------------------------+
//|                                                         BB_2.mq4 |
//|                                          Copyright © 2006, Manin |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Manin"
#property link      "manin1@mail.ru"
#define MAGIC 011006
 
// расстояние до СтопЛосса первоначального в пунктах (0 - отключить СЛ)
extern int        SL_SO     =45;    // H1:EURUSD= H4:EURUSD= M30:EURUSD=
// расстояние до ТейкПрофита в пунктах (0 - отключить)
extern int        TP_SO     =0;
extern int        Otstup_SL =-10;   // H1:EURUSD= H4:EURUSD= M30:EURUSD=
extern int        Otstup_Open =10;  // H1:EURUSD= H4:EURUSD= M30:EURUSD=  
extern int        _PRICE    =0;     // 0-6
extern int        period    =11;    // H1:EURUSD= H4:EURUSD= M30:EURUSD=
extern double     deviation =2;     // H1:EURUSD= H4:EURUSD= M30:EURUSD=
extern double     Risk      =0.0;   // Часть свободных денег вкладываемых в лот
extern int        Slippage  =5;     // Проскальзывание
static datetime   PrevTime_OB=0; // Переменная для работы с только, что сформировавшемся баре с отложенными ордерами
static datetime   PrevTime_OS=0; // Переменная для работы с только, что сформировавшемся баре с отложенными ордерами
static datetime   PrevTime_TB=0; // Переменная для работы с только, что сформировавшемся баре с торгующими ордерами
static datetime   PrevTime_TS=0; // Переменная для работы с только, что сформировавшемся баре с торгующими ордерами
 
int start()
{
  int    _OrderTicket_BS_BB_2=0;// Ticket ордера BuyStop
  int    _OrderTicket_SS_BB_2=0;// Ticket ордера SellStop
  int    _OrderTicket_B_BB_2=0; // Ticket ордера Buy
  int    _OrderTicket_S_BB_2=0; // Ticket ордера Sell
  double _OrderOpenPrice_BS_BB_2=0;
  double _OrderOpenPrice_SS_BB_2=0;
  double _OrderStopLoss_B_BB_2=0;
  double _OrderStopLoss_S_BB_2=0;
  double _OrderTakeProfit_B_BB_2=0;
  double _OrderTakeProfit_S_BB_2=0;
  double StopLoss, TakeProfit, _OrderOpenPrice, Lots, BB_0_U, BB_0_L;
  int z, Modify_O, Modify_T, _Ticket;
  BB_0_U=iBands(NULL,0,period,deviation,0,_PRICE,MODE_UPPER,0);
  BB_0_L=iBands(NULL,0,period,deviation,0,_PRICE,MODE_LOWER,0);
                                      
//+------------------------------------------------------------------+
//| Блок управления ордерами                                         |
//+------------------------------------------------------------------+
  if (OrdersTotal()!=0)     //  
  {
    for (z=OrdersTotal()-1; z>=0; z --)
    {
      OrderSelect ( z, SELECT_BY_POS );
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderMagicNumber()!=MAGIC) continue;
      if (OrderType()==OP_BUYSTOP)
      { 
        _OrderTicket_BS_BB_2=OrderTicket();
        _OrderOpenPrice_BS_BB_2=OrderOpenPrice();
        if (PrevTime_OB!=Time[0] && _OrderOpenPrice!=NormalizeDouble(BB_0_U+Otstup_Open*Point,Digits))  // 
        {
          _OrderOpenPrice=NormalizeDouble(BB_0_U+Otstup_Open*Point,Digits);
          StopLoss=NormalizeDouble(BB_0_L,Digits);
          if (TP_SO>0) { TakeProfit=NormalizeDouble(_OrderOpenPrice+TP_SO*Point,Digits); }
          else { TakeProfit=0.0; }
          Modify_O=OrderModify(_OrderTicket_BS_BB_2,_OrderOpenPrice,StopLoss,TakeProfit,0,Blue);
          if(Modify_O>0) 
          {
            Print("BUYSTOP ордер модифицирован: ",_OrderTicket_BS_BB_2);
            PrevTime_OB=Time[0];
          } 
          else Print("Ошибка модификации BUYSTOP ордера:",GetLastError()); 
        }
      }
      if (OrderType()==OP_SELLSTOP)
      {  
        _OrderTicket_SS_BB_2=OrderTicket();
        _OrderOpenPrice_SS_BB_2=OrderOpenPrice();
        if (PrevTime_OS!=Time[0] && _OrderOpenPrice!=NormalizeDouble(BB_0_L-Otstup_Open*Point,Digits))  // 
        {
          _OrderOpenPrice=NormalizeDouble(BB_0_L-Otstup_Open*Point,Digits);
          StopLoss=NormalizeDouble(BB_0_U,Digits);
          if (TP_SO>0) { TakeProfit=NormalizeDouble(_OrderOpenPrice-TP_SO*Point,Digits); }
          else { TakeProfit=0.0; }
          Modify_O=OrderModify(_OrderTicket_SS_BB_2,_OrderOpenPrice,StopLoss,TakeProfit,0,Red);
          if(Modify_O>0) 
          {
            Print("SELLSTOP ордер модифицирован:",_OrderTicket_SS_BB_2);
            PrevTime_OS=Time[0];
          } 
          else Print("Ошибка модификации SELLSTOP ордера:",GetLastError()); 
        }
      }
      if(OrderType()==OP_BUY) 
      {
        _OrderStopLoss_B_BB_2=OrderStopLoss();
        _OrderTicket_B_BB_2=OrderTicket();
        _OrderTakeProfit_B_BB_2=OrderTakeProfit();
        if (PrevTime_TB!=Time[0] && _OrderStopLoss_B_BB_2!=NormalizeDouble(BB_0_L+Otstup_SL*Point,Digits)) 
        { 
          Modify_T=OrderModify(OrderTicket(),0,NormalizeDouble(BB_0_L+Otstup_SL*Point,Digits),_OrderTakeProfit_B_BB_2,0,Yellow);
          if(Modify_T>0) 
          {
            Print("BUY ордер модифицирован:",_OrderTicket_B_BB_2);
            PrevTime_TB=Time[0];
          } 
          else Print("Ошибка модификации BUY ордера:",GetLastError()); 
        }
      }
      if(OrderType()==OP_SELL) 
      {
        _OrderStopLoss_S_BB_2=OrderStopLoss();
        _OrderTicket_S_BB_2=OrderTicket();
        _OrderTakeProfit_S_BB_2=OrderTakeProfit();
        if (PrevTime_TS!=Time[0] && _OrderStopLoss_S_BB_2!=NormalizeDouble(BB_0_U-Otstup_SL*Point,Digits))
        {
          Modify_T=OrderModify(OrderTicket(),0,NormalizeDouble(BB_0_U-Otstup_SL*Point,Digits),_OrderTakeProfit_S_BB_2,0,Yellow);
          if(Modify_T>0) 
          {
            Print("SELL ордер модифицирован: ",_OrderTicket_S_BB_2);
            PrevTime_TS=Time[0];
          } 
          else Print("Ошибка модификации SELL ордера:",GetLastError()); 
        }
      }
      continue;
    }
  }
//+------------------------------------------------------------------+
//| Блок открытия ордеров                                            |
//+------------------------------------------------------------------+
  if(AccountFreeMargin()<100)             //Проверяем свободные средства
  {      
    Comment("Нет денег. Свободная маржа=", AccountFreeMargin()," Открытые ордера=",OrdersTotal());      
    return(0);     
  }
  // Открываем BUYSTOP позицию ------------------------------------------------------------------------
  if (_OrderTicket_BS_BB_2==0 && BB_0_L<Ask && BB_0_U>Ask && _OrderTicket_B_BB_2==0) 
  {
    _OrderOpenPrice=NormalizeDouble(BB_0_U,Digits)+Otstup_Open*Point;
    Lots=NormalizeDouble(AccountFreeMargin()*Risk/1000.0,1); //Расчитываем размер лота
    if(Lots<0.1) Lots=0.1;
    StopLoss=NormalizeDouble(BB_0_L,Digits);
    if (TP_SO>0) { TakeProfit=NormalizeDouble(_OrderOpenPrice+TP_SO*Point,Digits); }
    else { TakeProfit=0.0; }
    _Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,_OrderOpenPrice,Slippage,StopLoss,TakeProfit,"BB_2 Купили",MAGIC,0,Blue);
    if(_Ticket>0) 
    {
      Print("BUYSTOP ордер выставлен");
    } 
    else Print("Ошибка выставления BUYSTOP ордера:",GetLastError()); 
  }
  // Открываем SELLSTOP позицию ------------------------------------------------------------------------    
  if (_OrderTicket_SS_BB_2==0 && BB_0_L<Bid && BB_0_U>Bid && _OrderTicket_S_BB_2==0) 
  {
    _OrderOpenPrice=NormalizeDouble(BB_0_L,Digits)-Otstup_Open*Point; //
    Lots=NormalizeDouble(AccountFreeMargin()*Risk/1000.0,1); //Расчитываем размер лота
    if(Lots<0.1) Lots=0.1;
    StopLoss=NormalizeDouble(BB_0_U,Digits);
    if (TP_SO>0) { TakeProfit=NormalizeDouble(_OrderOpenPrice-TP_SO*Point,Digits); }
    else { TakeProfit=0.0; }
    _Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,_OrderOpenPrice,Slippage,StopLoss,TakeProfit,"BB_2 Продали",MAGIC,0,Red);
    if(_Ticket>0) 
    {
      Print("SELLSTOP ордер выставлен");
    } 
    else Print("Ошибка выставления SELLSTOP ордера:",GetLastError()); 
  }
  //------------------------------------------------------------------------------------------------------------
  return(0);
}


Конечно я понимаю, что код не идеален и требует доработки (хотя бы проверки MarketInfo(Symbol(),MODE_STOPLEVEL) для проверки не близко ли к рынку мы хотим выставить или модифицировать ордер). Но будьте снисходительны, я форексом и программированием занялся только с 8 июня 2006. Сам я еще реальных счетов не имею (если не считать 2 центовых на LiteForex).

Цели, ради которых я публикую данного советника:

  1. Получить рекомендации и комментарии людей с большим опытом.
  2. Возможно, дополнить советник, чтобы с ним можно было выйти на реальную торговлю.
  3. Может кто-то перепишет этого эксперта под Омегу и попробует там, а то больно уж мне не нравится как МТ формирует тики.
  4. Это не единственный мой советник (и не лучший), у меня есть еще один трендовый советник, который, на мой взгляд, чуть лучше этого. Я бы хотел поменяться с тем, кто написал хороший флетовый советник.

В общем пишите manin1[@]mail.ru, рад буду пообщаться.

 

А почему сдесь никто необсуждает советника.

Советы от НЕ програмистов, а пользователей автор советника принимает ?

Ну если да то я с Вашего позволения начну.

Я пользуюсь вашим экспертом но так сказазать в полуавтомате.

Для начала торговли идея не плохая.

Войти в рынок и отслеживать тренд у этого эксперта получается неплохо.

Слабое место флетовый рынок.

Когда рынок останавливается и начинается флет или разворот появляются убыточные ордера.

Неплохо было бы поставить сюда индюка чтобы отсеивал убыточные ордера или хотябы убытки

как то приблизить как то к минимуму.

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

Результаты получаются довольно таки не плохие намного лучше чем выходить по стоплосу ..

Но это все приходится делать вручную, а на это не всегда хватает времени.

Автор, если Вы следите за темой напишите свой адрес эл. почты.

 
ambravo:

А почему сдесь никто необсуждает советника.

А что тут обсуждать ? Сразу после этого пощёл вниз и упёрся в пол !

 

Эхх блин, не состоялся еще один рубщик капусты. Жаль-то как, Alfa, да? Ну одного только Боллинджера все же маловато: дисперсия на Форехе нифига не работает...

P.S. Ой, только сейчас дату первого сообщения увидел...

 

На тестере я могу тоже нарисовать а в работе он мне даже очень помогает.

Так что с этим я не соглашусь то что он сырой согласен но идея очень хорошая .

А если бы еще немного переделать то былобы очень хорошо.

Поверьте мне как практику тестеры иногда милионы прибыли показывают, а в итоге прибыли ни гроша .

А я на нем уже неплохо заработал.

 
Стратегия может выжить , если  отфильтровать только трендовое движение. Во флете будет сливать. Вобщем внутрь этого советника нужно влепить еще одного - флетового.
 
FION:
Стратегия может выжить , если отфильтровать только трендовое движение. Во флете будет сливать. Вобщем внутрь этого советника нужно влепить еще одного - флетового.
Тогда оба сливать будут: один на тренде, другой на флэте. Почему-то сливает всегда быстрее, чем другой зарабатывает !
 
Лучший трендовый советник - OP_BUY, если график ползет вправо-вверх или OP_SELL, если вправо-вниз. Если тренд есть, то будет рубить капусту, если флэт, то не будет. Но говорить, что какой-то советник хорош на тренде, но слаб во флэте равнозначно тому, что говорить этот рыбак хорош там где клюет, но слабоват на безрыбье.
 
А вот и моя картина с тестера.
 
Вот результаты тестов если интерестно посмотрите.
 
Это тесты, ambravo? Или ты примерно так и работаешь на реале? Вообще говоря, 50 модификаций на позицию - многовато. Не могу представить себе такой ДЦ, который не зарубит такую торговлю из-за избыточного количества операций.
Причина обращения: