Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 312

 
Aleksey Vyazmikin:

Ищите ошибку в функции - она не возвращает условие на стрелку вверх.


Спасибо Aleksey Vyazmikin, но тут проблема по серьезнее. При нахождении паттерна робот устанавливает огромное количество стрелочек по одной координате. При этом виснет терминал. Как решить такую проблему. Вы пробовали у себя на терминале запустить моего эксперта?

 
voron_026:

Спасибо Aleksey Vyazmikin, но тут проблема по серьезнее. При нахождении паттерна робот устанавливает огромное количество стрелочек по одной координате. При этом виснет терминал. Как решить такую проблему. Вы пробовали у себя на терминале запустить моего эксперта?


Проблема во первых в функции - код я не просто так добавил. Есть соответствие функции, вот стрелки и рисует. Советник запускал в визуализаторе.

А что б советник не создавал стрелки на каждом тике - сделайте проверку на новую свечу.

 
voron_026:

Спасибо Aleksey Vyazmikin, но тут проблема по серьезнее. При нахождении паттерна робот устанавливает огромное количество стрелочек по одной координате. При этом виснет терминал. Как решить такую проблему. Вы пробовали у себя на терминале запустить моего эксперта?

Для того, чтоб вам помогло как можно больше народу, нужно выкладывать не файл, а код. Скачивать файл не каждый хочет, потом его нужно открыть, а потом ещё и удалить, как-то сильно муторно всё.

 

То есть, при появлении новой свечи нужно выключить функцию ObjectCreate, правильно я понимаю?

 
Vitaly Muzichenko:

Для того, чтоб вам помогло как можно больше народу, нужно выкладывать не файл, а код. Скачивать файл не каждый хочет, потом его нужно открыть, а потом ещё и удалить, как-то сильно муторно всё.

Понял вас, выкладываю код.
#property copyright "Copyright 2017,UriyGlushko"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern string Rodot           = "Параметры робота";
extern double Lots            = 0.2;
extern int    StopLoss        = 20;
extern int    TakeProfit      = 80;
extern int    Magic           = 999999;
extern int    Slippage        = 3; // Проскальзывание

extern bool UseDojiCandles = true; // Использование патерна Доджи
extern int TimeFrame = PERIOD_H4;
int DojiCandle = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  if (Digits == 3 || Digits ==5 )
  {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
  }
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if(UseDojiCandles = true && Doji() == 1)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_ARROW_UP,0,TimeCurrent(),Low[1]-300*_Point))
         {
         Print("Не удалось создать метку вверх");
         }
         
     }
   DojiCandle ++;

   
   if(UseDojiCandles = true && Doji() == -1)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_ARROW_DOWN,0,TimeCurrent(),High[1]+300*_Point))
         {
         Print("Не удалось создать метку вниз");
         }
         
     }
   DojiCandle ++;
 

   
}
//+------------------------------------------------------------------+
//    Поиск всех объектов
//+------------------------------------------------------------------+


 




//+------------------------------------------------------------------+
//    Функция паттерна Доджи
//+------------------------------------------------------------------+
int Doji()
{
//Параметры Дожи
   double Open1 = iOpen(Symbol(), PERIOD_H4,1);
   double Close1 = iClose(Symbol(), PERIOD_H4,1);
   double High1 = iHigh(Symbol(), PERIOD_H4,1);
   double Low1 = iLow(Symbol(), PERIOD_H4,1);
   
//Параметры предыдущей свечи
   double Open2 = iOpen(Symbol(), PERIOD_H4,2);
   double Close2 = iClose(Symbol(), PERIOD_H4,2);
   double High2 = iHigh(Symbol(), PERIOD_H4,2);
   double Low2 = iLow(Symbol(), PERIOD_H4,2);
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR(Symbol(),PERIOD_H4,14,1);
   
   
//Математическое описание патерна Дожи
   if(Close1 < High1 -0.3*(High1-Low1) && 
      Open1 < High1 -0.3*(High1-Low1) && 
      Close1 > Low1 -0.7*(High1-Low1) && 
      Open1 > Low1 -0.7*(High1-Low1) && 
      MathAbs((Close1-Open1) < 0.2*(High1-Low1))&&
      MathAbs((Close2-Open2) > 0.7*ATR))
      {
         if((Close2 - Open2) > 0)
         { 
         Print ("Down"); return(-1);// Условие для продаж
         }
         if((Close2 - Open2) < 0)
         {
         Print ("Up"); return(1);// Условие для покупок
         }
      }
      return(0);
}
 
voron_026:
Понял вас, выкладываю код.

Попробуйте так:

if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_ARROW_UP,0,Time[0],Low[1]-300*_Point))
 

всем привет)я на счет впс сервера,написал адрес своего сервера к которому относится мой счет,а тут пишет что ничего не найдено ,что делать,помогите пожалуйста,спасибо

 
Vitaly Muzichenko:

Попробуйте так:


Не получилось. Советник отрисовал 7679 объектов, причем, что интересно, с нечетной нумерацией

А с функцией Доджи не пойму в чем ошибка. Почему стрелки вверх не рисуются

 
voron_026:

Не получилось. Советник отрисовал 7679 объектов, причем, что интересно, с нечетной нумерацией

А с функцией Доджи не пойму в чем ошибка. Почему стрелки вверх не рисуются

У вас проблема с поиском паттерна, попробуйте найти в кодобазе правильный код, их там много, и проблема сама решится

MQL5 Code Base
MQL5 Code Base
  • www.mql5.com
Библиотека исходных кодов на языке MQL5 для MetaTrader 5
 
Vitaly Muzichenko:

У вас проблема с поиском паттерна, попробуйте найти в кодобазе правильный код, их там много, и проблема сама решится


Решил проблему с отрисовкой большого количества объектов. Установил проверку на новый бар. Получился такой код:

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                                       Copyright 2017,UriyGlushko |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017,UriyGlushko"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern string Rodot           = "Параметры робота";
extern double Lots            = 0.2;
extern int    StopLoss        = 20;
extern int    TakeProfit      = 80;
extern int    Magic           = 999999;
extern int    Slippage        = 3; // Проскальзывание

extern bool UseDojiCandles = true; // Использование патерна Доджи
extern int TimeFrame = PERIOD_H4;
int DojiCandle = 0;
bool New_Bar = false;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  if (Digits == 3 || Digits ==5 )
  {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
  }
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
Fun_New_Bar();

   if(UseDojiCandles = true && Doji() == 1 && New_Bar == true)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_ARROW_UP,0,Time[0],Low[1]-300*_Point))
         {
         Print("Не удалось создать метку вверх");
         }
         
     }
   DojiCandle ++;

   
   if(UseDojiCandles = true && Doji() == -1 && New_Bar == true)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_ARROW_DOWN,0,Time[0],High[1]+300*_Point))
         {
         Print("Не удалось создать метку вниз");
         }
         
     }
   DojiCandle ++;
 

   
}
//+------------------------------------------------------------------+
//    Поиск всех объектов
//+------------------------------------------------------------------+


 




//+------------------------------------------------------------------+
//    Функция паттерна Доджи
//+------------------------------------------------------------------+
int Doji()
{
//Параметры Дожи
   double Open1 = iOpen(Symbol(), PERIOD_H4,1);
   double Close1 = iClose(Symbol(), PERIOD_H4,1);
   double High1 = iHigh(Symbol(), PERIOD_H4,1);
   double Low1 = iLow(Symbol(), PERIOD_H4,1);
   
//Параметры предыдущей свечи
   double Open2 = iOpen(Symbol(), PERIOD_H4,2);
   double Close2 = iClose(Symbol(), PERIOD_H4,2);
   double High2 = iHigh(Symbol(), PERIOD_H4,2);
   double Low2 = iLow(Symbol(), PERIOD_H4,2);
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR(Symbol(),PERIOD_H4,14,1);
   
   
//Математическое описание патерна Дожи
   if(Close1 < High1 -0.3*(High1-Low1) && 
      Open1 < High1 -0.3*(High1-Low1) && 
      Close1 > Low1 -0.7*(High1-Low1) && 
      Open1 > Low1 -0.7*(High1-Low1) && 
      MathAbs((Close1-Open1) < 0.2*(High1-Low1))&&
      MathAbs((Close2-Open2) > 0.7*ATR))
      {
         if((Close2 - Open2) > 0)
         { 
         Print ("Down"); return(-1);// Условие для продаж
         }
         if((Close2 - Open2) < 0)
         {
         Print ("Up"); return(1);// Условие для покупок
         }
      }
      return(0);
}
//+------------------------------------------------------------------+
//    Функция определения нового бара
//+------------------------------------------------------------------+
void Fun_New_Bar()                              // Ф-ия обнаружения .. 
  {                                             // .. нового бара 
   static datetime New_Time=0;                  // Время текущего бара 
   New_Bar=false;                               // Нового бара нет 
   if(New_Time!=Time[0])                        // Сравниваем время 
     { 
      New_Time=Time[0];                         // Теперь время такое 
      New_Bar=true;                             // Поймался новый бар 
     } 
  }  

Единственное что, в свойствах объекта порядковый номер стрелки идет не 1 2 3 ... и так далее, а 1  850427  1083295 ..... Я так понимаю, неправильно работает счетчик?

Вопрос, как завязать проверку нового бара именно на Н4. То есть нужно, чтобы робот искал паттерны именно на Н4, а график при этом мог быть любого ТФ?

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