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

 
Alexandr Ivanov:

Ну вот и я не нашел...

Печаль. Значит надо оценивать, какое количество тиков приходит за 1 бар, и из этого делать вывод - то ли это цены открытия, то ли это все тики.

Сделать MT4-советник кроссплатформенным - пять минут (один раз!) при должной сноровке. Далее тестируете (много раз) в MT5 на реальных или кастомных тиках, а торгуете в MT4.

 

Всем привет. Имеется скрипт, меняющий ТФ на всех открытых чартах по выбору

Нужно сделать одобный, меняющий шаблоны

Но для этого покажите хотя бы что такое шаблон с точки зрения кода

 

Здравствуйте. Есть готовый индикатор SMI. Но он не работает. При первом запуске отрисовывает, а потом надо при каждом новом баре нажимать на обновление или переходить на другой тайм фрейм. Почему? Может здесь уже поднимался такой вопрос, тогда просто можно ссылку. Заранее спасибо.

Файлы:
SMI.mq4  8 kb
 

Прошу объяснить почему не открылся ордер.

вот строчки с журнала:

2017.11.24 20:00:00.061 '5390918': requote 1.19357 / 1.19368 for open sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

2017.11.24 19:59:59.515 '5390918': instant order sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

Проскальзывание составило 11 пипс. В советнике проскальзывание разрешено в размере 27 пипс. Проверка открытия ордера выдал  ошибку: error 138 (новые цены).

Прошу объяснить почему не открылся ордер?

 
RichLux:

Прошу объяснить почему не открылся ордер.

вот строчки с журнала:

2017.11.24 20:00:00.061 '5390918': requote 1.19357 / 1.19368 for open sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

2017.11.24 19:59:59.515 '5390918': instant order sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

Проскальзывание составило 11 пипс. В советнике проскальзывание разрешено в размере 27 пипс. Проверка открытия ордера выдал  ошибку: error 138 (новые цены).

Прошу объяснить почему не открылся ордер?

Смените дилинг, ну или тип счёта, чтобы не было таких проблем. Берите счёт с маркет исполнением - забудьте об инстант.

 

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

например сигнал для входа пересечение скользящих средних с разным периодом, тейк профит 50 пунктов. если можно в mql5

у меня как только достигает тейкпрофита и закрывает сделку тут же открывает новую  хотя нового сигнала/пересечения еще не было .

 
Доброго времени суток. Посмотрите пожалуйста код. Робот не удаляет горизонтальные линии при появлении новых
//+------------------------------------------------------------------+
//|                                                          2.0.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.1;
extern int    StopLoss        = 20;
extern int    TakeProfit      = 80;
extern int    Magic           = 568422685;
extern int    Slippage        = 3; // Проскальзывание
extern int    Shag            = 40; // Шаг для трейлингстопа
extern int    Tral_dist       = 40; // Дистанция трейлингстопа
extern bool   Use_traling     = true; // Использование трейлингстопа true - Включено, false - Выключено
extern bool   Use_shag        = false; // Использование шага. true - Включено, false - Выключено
extern bool   Use_bezubitok   = true; // Использование безубытка. true - Включено, false - Выключено



//      Параметры индикатора moving_averages
extern string  MA             = "Параметры Скользащей средней";
extern int     MA_Period      = 3; // Период
extern int     MA_Shift       = 0; // Сдвиг
extern int     MA_Method      = 0; // 0-простая, 1-экспонециальная, 2-сглаженная, 3-линейно-взвешенная

//      Параметры разворотных свечей
extern string Comment2 = "Параметры разворотных свечей";
extern bool _Doji           = false;
extern ENUM_TIMEFRAMES     TimeFrame       = PERIOD_M5; // Период разворотной свечи
extern ENUM_TIMEFRAMES     LittleTimeFrame = PERIOD_M1; // Период точки входа
extern int                 ATR_period      = 14;        // Период индикатора волотильности

//      Параметры уровней области разворота
extern string Comment3 = "Параметры уровней области разворота";
extern int UpLineSell = 4;    // Верхняя линия ОР для продаж (пункт от High)
extern int DownLineSell = 4;  // Нижняя линия ОР для продаж (пункт от High)
extern int UpLineBuy = 4;     // Верхняя линия ОР для покупок (пункт от Low)
extern int DownLineBuy = 4;   // Нижняя линия ОР для покупок (пункт от Low)

double sl, tp, dist, shag, ma1, ma2;
int ticket;



int DojiCandle = 0;               //Счетчик баров "Дожи"
int DojiCandleBuy = 0;            //Счетчик входных баров на разворотном баре "Дожи" Buy
int DojiCandleSell = 0;           //Счетчик входных баров на разворотном баре "Дожи" Sell
int lineDojiCandle = 0;           //Счетчик уровней области разворота по паттерну "Дожи"


// Переменные функции "Новый бар"
bool New_Bar = false;



// Переменные функции паттерна "Дожи"
bool BuyDoji = false;
bool SellDoji = false;
bool TradeUpDoji = false;
bool TradeDownDoji = false;
double UpLine_Doji;
double DownLine_Doji;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  if (Digits == 3 || Digits ==5 )
  {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
   UpLineSell *= 10;
   DownLineSell *= 10;
   UpLineBuy *= 10;
   DownLineBuy *= 10;
  }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int magic = Magic;
   int shag_ = Shag;
   
   double Open1 = NormalizeDouble (iOpen(Symbol(), TimeFrame,1),Digits);
   double Close1 = NormalizeDouble (iClose(Symbol(), TimeFrame,1),Digits);
   double High1 = NormalizeDouble (iHigh(Symbol(), TimeFrame,1),Digits);
   double Low1 = NormalizeDouble (iLow(Symbol(), TimeFrame,1),Digits);
   
   Fun_New_Bar();
   Doji();

     ma1 = iCustom(NULL, 0,"moving_averages",MA_Period, MA_Shift, MA_Method, 0, 1);
     ma2 = iCustom(NULL, 0,"moving_averages",MA_Period, MA_Shift, MA_Method, 0, 2);
     

   if(_Doji == true)
     {
     if(SellDoji == true)
       {
           if(!ObjectCreate(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJ_ARROW_DOWN,0,TimeCurrent(),High[1] + 70*Point))
             {
             Print("Не удалось создать метку вниз");
             }
             ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrChocolate);//--- установка цвета
             ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установка стиля линии
             ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установка толщины линии
             ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отображение на переднем (false) или заднем (true) плане
             DojiCandle ++;
             
           if(!ObjectCreate(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJ_HLINE,0,TimeCurrent(),UpLine_Doji))
             {
             Print("Не удалось создать верхнюю линию");
             }
             ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_COLOR,clrChocolate);//--- установим цвет прямоугольника 
             ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
             ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
             ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
             
           if(!ObjectCreate(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJ_HLINE,0,TimeCurrent(),DownLine_Doji))
             {
             Print("Не удалось создать нижнюю линию");
             }
             ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника 
             ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
             ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
             ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
             lineDojiCandle ++;
           
         if(Open1 == Close1)
           {
             if(!ObjectCreate(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJ_ARROW_DOWN,0,TimeCurrent(),High[1] + 70*Point))
               {
               Print("Не удалось создать метку вниз");
               }
               ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrChocolate);//--- установка цвета
               ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установка стиля линии
               ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установка толщины линии
               ObjectSetInteger(ChartID(),"Arrow_Down_Doji"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отображение на переднем (false) или заднем (true) плане
               DojiCandle ++;
               Print ("Дожи крест Down");
            
             if(!ObjectCreate(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJ_HLINE,0,TimeCurrent(),UpLine_Doji))
               {
               Print("Не удалось создать верхнюю линию");
               }
               ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_COLOR,clrOrangeRed);//--- установим цвет прямоугольника 
               ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
               ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
               ObjectSetInteger(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
                  
             if(!ObjectCreate(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJ_HLINE,0,TimeCurrent(),DownLine_Doji))
               {
               Print("Не удалось создать нижнюю линию");
               }
               ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника 
               ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
               ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
               ObjectSetInteger(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
               lineDojiCandle ++; 
            }
        }
         
      static int switch12 = 0;
      static int switch22 = 0;
      static int switch32 = 0;
      
      if(ma2 > UpLine_Doji && ma2 > DownLine_Doji && ma1 > UpLine_Doji && ma1 > DownLine_Doji)
        {
        UpLine_Doji = 0;
        DownLine_Doji = 0;
        }
      
      if(ma2 > DownLine_Doji)
        {
        if(ma1 < DownLine_Doji)
          {
          switch12 = 1;
          Print("пересечение дожи 1");
          }
        }
         
      if(ma2 < DownLine_Doji)
        {
        if(ma1 > DownLine_Doji)
          {
          if(switch12 == 1)
            {
            switch22 = 1;
            Print("пересечение дожи 2");
            }
          }
        }
         
       if(ma2 > DownLine_Doji)
         {
         if(Close[1] < DownLine_Doji)
           {
           if(switch12 == 1)
             {
             if(switch22 == 1)
               {
               switch32 = 1;
               Print("пересечение дожи 3");
               }
             }
           }
         }
         
       if(switch12 == 1)
         {
         if(switch22 == 1)
           {
           if(switch32 == 1)
             {
             if(!ObjectCreate(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell),OBJ_ARROW_SELL,0,TimeCurrent(),Low[1] + 50*Point))
               {
               Print("Не удалось создать метку вниз");
               }
               ObjectSetInteger(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell),OBJPROP_COLOR,clrChocolate);//--- установка цвета
               ObjectSetInteger(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell),OBJPROP_STYLE,STYLE_SOLID);//--- установка стиля линии
               ObjectSetInteger(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell),OBJPROP_WIDTH,1);//--- установка толщины линии
               ObjectSetInteger(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell),OBJPROP_BACK,false);//--- отображение на переднем (false) или заднем (true) плане
               DojiCandleSell ++;
               Print("Точка входа SELL по разворотной свече 'Дожи'");
               UpLine_Doji = 0;
               DownLine_Doji = 0;
               
             if(ObjectFind(ChartID(),"Arrow_Sell_Doji"+IntegerToString(DojiCandleSell)))
               {
               switch12 =0;
               switch22 =0;
               switch32 =0;
               }
                         
             if(ObjectFind(ChartID(),"UpLine_Doji"+IntegerToString(lineDojiCandle)) && ObjectFind(ChartID(),"DownLine_Doji"+IntegerToString(lineDojiCandle)))
               {
               ObjectDelete("UpLine_Doji"+IntegerToString(lineDojiCandle));
               ObjectDelete("DownLine_Doji"+IntegerToString(lineDojiCandle));
               Print("Линии удалены");
               }
               Print("Не удалось удалить верхнюю и нижнюю линии"); 
             }
           }
         }
     
     }
   

      
   
 }
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//+------------------------------------------------------------------+
//    Функция определения нового бара                                |
//+------------------------------------------------------------------+
void Fun_New_Bar()
{ 
   datetime TimeBar0 = iTime(Symbol(),TimeFrame,0);
   static datetime New_Time=0;                     // Время текущего бара
   New_Bar=false;                                 // Нового бара нет 
   if(New_Time != TimeBar0)                       // Сравниваем время 
   { 
      New_Time = TimeBar0;                        // Теперь время такое 
      New_Bar = true;                             // Поймался новый бар 
   } 
}

//+------------------------------------------------------------------+
//    Функция паттерна Дожи для бычьего и медвежьего рынка          |
//+------------------------------------------------------------------+
void Doji()
{
//Параметры Дожи
   double Open1 = NormalizeDouble (iOpen(Symbol(), TimeFrame,1),Digits);
   double Close1 = NormalizeDouble (iClose(Symbol(), TimeFrame,1),Digits);
   double High1 = NormalizeDouble (iHigh(Symbol(), TimeFrame,1),Digits);
   double Low1 = NormalizeDouble (iLow(Symbol(), TimeFrame,1),Digits);
   double Open2 = NormalizeDouble (iOpen(Symbol(), TimeFrame,2),Digits);
   double Close2 = NormalizeDouble (iClose(Symbol(), TimeFrame,2),Digits);
   double High2 = NormalizeDouble (iHigh(Symbol(), TimeFrame,2),Digits);
   double Low2 = NormalizeDouble (iLow(Symbol(), TimeFrame,2),Digits);
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR(Symbol(),TimeFrame,ATR_period,1);
   
   BuyDoji = false;
   SellDoji = false;
   
//Математическое описание патерна Дожи
   if(Close1 < High1 - NormalizeDouble (0.3*(High1-Low1),Digits )&& 
      Open1 < High1 - NormalizeDouble (0.3*(High1-Low1),Digits )&& 
      Close1 > High1 - NormalizeDouble (0.7*(High1-Low1),Digits )&& 
      Open1 > High1 - NormalizeDouble (0.7*(High1-Low1),Digits )&& 
      MathAbs(Close1-Open1) <= NormalizeDouble (0.4*(High1-Low1),Digits )&&
      MathAbs(Close2-Open2) > 0.8*ATR && MathAbs(High1-Low1) > 0.6*ATR)
      {
         if((Close2 - Open2) > 0 && New_Bar)
         { 
            UpLine_Doji = High1 + UpLineSell*Point();
            DownLine_Doji = High1 - DownLineSell*Point();
            SellDoji = true;
            Print ("Down Doji"); // Условие разворота в медвежий тренд
         }
         if((Close2 - Open2) < 0)
         {
            UpLine_Doji = High1 + UpLineBuy*Point();
            DownLine_Doji = High1 - DownLineBuy*Point();
            BuyDoji = true;
            Print ("Up Doji"); // Условие разворота в бычий тренд
         }
      }
      
}

С помощью переменных 

      static int switch12 = 0;
      static int switch22 = 0;
      static int switch32 = 0;

прописывается условие точки входа

 
voron_026:
Доброго времени суток. Посмотрите пожалуйста код. Робот не удаляет горизонтальные линии при появлении новых

С помощью переменных 

прописывается условие точки входа

Потому, что к имени линии добавляется счётчик который перед удалением увеличивает значение на единицу.

 
Я вас понял. Как тогда реализовать удаление линий. Мне нужно, чтобы линии удалялись, как только появляется новый паттерн со своими линиями
 
voron_026:
Я вас понял. Как тогда реализовать удаление линий. Мне нужно, чтобы линии удалялись, как только появляется новый паттерн со своими линиями

А свои предположения есть?

Может сначала удалить, а потом создать? Или не удалять, а только менять координаты? Какой смысл в удалении и создании новых?

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