Советник на основе свечных комбинаций, трудности написания

 

Добрый день всем. Пытаюсь написать советник на основе свечных комбинаций, но как оказалось это не так легко. Когда советник был готов (я так думал) в его работе оказались ошибки, которые я начал исправлять. На данном этапе я не могу справится с 1й проблемой ПОМОГИТЕ ПОЖАЛУЙСТА.

Итак. Советник я попытался максимально упростить, чтоб легче было в нем разобраться. Свечную комбинацию использую самую элементарную - ДОДЖ. После того как образовался додж (Open[i]==Close[i]) я жду подтверждающего сигнала-цена закрытия следующего бара должна быть выше максимума High[i] < Close[1] (покупка) или цена закрытия следующего бара должна быть ниже минимума доджа Low[i] > Close[1] (продажа).

Сигнал на покупку:

-когда выполнилось условие цена закрытия 1го бара после доджа (Close[1]), выше его максимума. Покупаем сразу, как только Ask>High[1] (цена выше максимума, 1го бара после доджа).

Сигнал на продажу:

-когда выполнилось условие цена закрытия 1го бара после доджа (Close[1]), нижу его минимума. Продаем сразу, как только Ask<Low[1] (цена нижу минимума, 1го бара после доджа).

Проблема в том, что:

-сигнал на покупку бывает срабатывает когда цена Ask не пробила максимум бара High[1], а равна ей или на 1-2 пункта нижу.

-сигнал на продажу бывает срабатывает когда цена Ask не пробила минимум бара Low[1], а равна ей или на 1-2 пункта выше.

ПОМОГИТЕ ПОЖАЛУЙСТА. На форуме не нашел похожих тем.

extern int       Lots=1;    //объём торгов    
extern int       Target=15; //тейк профит

int    MagicNumber = 89354658;
string MagicName = "DojiTrader";

int      eDirection = 0; //условие
int      SigP = 0;       //условие
int      OpenTime=1;     
/////////////////////////////////////////////////////////////////////////////////////////////
int start()
  {      
   int orders = 0;
   int i = 0;           
   for(i = 0; i < OrdersTotal(); i++ )  
      {
      OrderSelect(i,SELECT_BY_POS);     
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1
         break;
      }
   }
///////////////////////////////////////////////////////////////////////////////////////////// 
   for(i = 1; i < OrdersTotal(); i++ )  //количество открытых ордеров на 1 больше
      {
      OrderSelect(i,SELECT_BY_POS);  
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; 
         break;
      }
   }   
 ///////////////////////////////////////////////////////////////////////////////////////////////  
   if(orders < 1 )
      {
         for(i = 1; i < Bars; i++ )
      {
            //Определяем додж
            if(Open[i]==Close[i])
         {
            eDirection = 1;
            break;
         }    
     }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      if(i < 3 && i > 0)
      {      
         //Определяем подтверждающие сигналы
        if(SigP == 0)
          {      
           if(High[i] < Close[1]&&Ask>High[1])
            {
               SigP = 1; //сигнал на покупку             
            }
           if(Low[i] > Close[1]&&Ask<Low[1])
             {
               SigP = -1; //сигнал на продажу
             }
          }                       
      }
      else
      {
         SigP = 0;
      }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      //Додж покупаем
      if (eDirection==1 && SigP ==1 && iBarShift(NULL,0,OpenTime) != 0 && Ask>High[1])
       {
         OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Low[i]-3*Point,Ask+15*Point,MagicName,MagicNumber,0,Green);
         OpenTime = iTime(NULL,0,0);
       }
      //Додж продаём
      if(eDirection == 1 && SigP==-1 && iBarShift(NULL,0,OpenTime) != 0 && Ask<Low[1])
       {
        OrderSend(Symbol(),OP_SELL,Lots,Bid,5,High[i]+3*Point,Bid-Target*Point,MagicName,MagicNumber,0,Red);
        OpenTime = iTime(NULL,0,0);
       }
   }    
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   return(0);
  }
Файлы:
jbqhjbzt.mq4  4 kb
 

В прикреплённом файле индикатор, отслеживающий паттерны. Может пригодится (можно глянуть в его код).

Файлы:
 
TarasBY:

В прикреплённом файле индикатор, отслеживающий паттерны. Может пригодится (можно глянуть в его код).


Что такое паттерны?) У меня есть индикатор который отображает свечные комбинации, теперь я хочу по этому индикатору написать советник. В этом индикаторе который Вы мне скинули другая логика чем в том что у меня есть, но отображение комбинаций одно.
 
Fantar:


Проблема в том, что:

-сигнал на покупку бывает срабатывает когда цена Ask не пробила максимум High[1], а равна ей или на 1-2 пункта нижу.

-сигнал на продажу бывает срабатывает когда цена Ask не пробила минимум бара High[1], а равна ей или на 1-2 пункта выше.

ПОМОГИТЕ ПОЖАЛУЙСТА. На форуме не нашел похожих тем.

Так и должно быть.

High[1] это бид.

А Аsk ровно на спред выше.

 
Fantar:

Что такое паттерны?) У меня есть индикатор который отображает свечные комбинации, теперь я хочу по этому индикатору написать советник. В этом индикаторе который Вы мне скинули другая логика чем в том что у меня есть, но отображение комбинаций одно.

Паттерн - это и есть свечная комбинация.

Я не писал этот индикатор, поэтому про логику формирования паттернов ничего сказать не могу.

 

Приветствую всех!

У меня вот обнаружились ссылки на заявленную тему ветки:

https://www.mql5.com/ru/code/11200 - индюк по свечным паттернам

https://www.mql5.com/ru/forum/107681/page2 - аналог. ветка в тему

 

Всем спасибо, вроде этот вопрос наладил теперь работает нормально:)

Народ подскажите теперь как в этот код вставить трал??? тоже не чё не получается:(((

Допустим при достижение Т/Р, S/L и Т/Р подымались или опускались на 5 пунктов. Буду очень БЛАГОДАРЕН кто подскажет!!!

 
Народ ну подскажите кто то:(
 
Fantar:
Народ ну подскажите кто то:(


Посмотрите в CodeBase в библиотеках. Там этих тралов на любой вкус.

На вскидку:

https://www.mql5.com/ru/forum/131859

https://www.mql5.com/ru/code/7108

 
Fantar:
Народ ну подскажите кто то:(
Может здесь что-то понравится?!
 

Я нашёл но не пойму куда надо что вставлять, мне надо вставить вот этот трал.

//+------------------------------------------------------------------+
//|                                            TrailingByShadows.mq4 |
//|                                                              I_D |
//|                                            http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D"
#property link      "http://www.mymmk.com/"

extern   int   iTicket;             // уникальный номер (тикет) открытой позиции
extern   int   iTmfrm;         // период, по барам которого следует тралить (1, 5, 15, 30, 60, 240, 1440, 10080, 43200)
extern   int   iBars_n = 3;         // кол-во баров, по которым следует тралить
extern   int   iIndent = 3;         // отступ от тени бара, на котором размещается стоплосс
extern   bool  bTrlinloss = false;  // следует ли тралить на участке лоссов (между курсом стоплосса и открытия)

//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ                                       |
//| При запуске эксперта ему необходимо указать уникальный номер     |
//| (тикет) открытой позиции, а также определить параметры трейлинга:|
//| количество баров, по теням которых необходимо трейлинговать      |
//| (от 1 и больше) и отступ (пунктов) - расстояние от макс. (мин.)  |
//| свечи, на которое переносится стоплосс (от 0), переключатель     |
//| trlinloss указывает, следует ли трейлинговать на участке         |
//| "стоплосс-курс открытия позиции.                                 |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {   
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   TrailingByShadows(iTicket,iTmfrm,iBars_n,iIndent,bTrlinloss);
   return(0);
  }
//+------------------------------------------------------------------+

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
   {  
   
   int i; // counter
   double new_extremum;
   
   // проверяем переданные значения
   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY), находим минимум bars_n свечей
   if (OrderType()==OP_BUY)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i);
         else 
         if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
         }         
      
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()))            
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL), находим минимум bars_n свечей
   if (OrderType()==OP_SELL)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i);
         else 
         if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
         }         
           
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }      
      }      
   }
//+------------------------------------------------------------------+
Файлы:
obnrqwqy.mq4  4 kb
Причина обращения: