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

 

@STARIJ Спасибо, я не торопился писать ObjectSet! Это уже давно написано, не закоментировал, да и коду не мешает! э т так чтоб не забыть! Вы написали StringSubstr(str,20,7) , я ж не думал что это всё буквально! После ужина понял, что дело было в пробелах! Нужно было считать каждый символ и пробел! Спасибо Друг!!!!


 

Здравствуйте, уважаемые. Очередной вопрос новичка в мкл4. Для определения нового бара использую рекомендуемую учебником пользовательскую функцию Fun_New_Bar():


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
Однако срабатывает она почему-то не всегда. Вставил проверку принтом:
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Так вот, то открываются позиции на новом баре, то печатает "Нового бара нет" и открывает позицию в текущем баре. Не могу понять почему. Спасибо.

 
novichok2018:

Здравствуйте, уважаемые. Очередной вопрос новичка в мкл4. Для определения нового бара использую рекомендуемую учебником пользовательскую функцию Fun_New_Bar():

Однако срабатывает она почему-то не всегда. Вставил проверку принтом:

Так вот, то открываются позиции на новом баре, то печатает "Нового бара нет" и открывает позицию в текущем баре. Не могу понять почему. Спасибо.

как Вы различаете Новый бар и Текущий бар? Как часто выполняется приведенная часть кода - каждый тик или только в момент формирования нового бара?

 
STARIJ:

как Вы различаете Новый бар и Текущий бар? Как часто выполняется приведенная часть кода - каждый тик или только в момент формирования нового бара?

Новый бар - по функции. Текущий - в котором закрылась позиция, но время бара не истекло. Код выполняться должен в момент формирования нового бара. Вернее, не так. Часть кода, где определяются условия на закрытие позиции - выполняется каждый тик, а на открытие - в новом баре.

 
novichok2018:

Новый бар - по функции. Текущий - в котором закрылась позиция, но время бара не истекло. Код выполняться должен в момент формирования нового бара. Вернее, не так. Часть кода, где определяются условия на закрытие позиции - выполняется каждый тик, а на открытие - в новом баре.

Короче, тут все ясно. Но когда пишете и видите, что надо написать точнее, верните курсор назад и исправьте. А то трудно читать - то так, то иначе.

Код исполняется каждый тик. Т.е. все время задается вопрос Есть новый бар? Есть новый бар? Есть новый бар? и каждый раз печатается сообщение об отсутствии нового бара. И вот появился новый бар. Ордер открывается? ну погодите. Сначала посылается команда на сервер. А пока приходят тики и Есть новый бар? Есть новый бар? и каждый раз печатается сообщение об отсутствии нового бара.И вот наконец сервер открыл ордер - Вы смотрите на время и удивляетесь. А вы вставьте Принт(TimeCurrent()) перед открытием ордера, на 4 строчки ниже первого. А лучше использовать Alert - сразу на экран. Сразу видно...

И еще: вместо if(New_Bar==false)  if(New_Bar==true)  можно использовать if(!New_Bar)  if(New_Bar)  а то у Вас получается масляное масло

 
STARIJ:

Короче, тут все ясно. Но когда пишете и видите, что надо написать точнее, верните курсор назад и исправьте. А то трудно читать - то так, то иначе.

Код исполняется каждый тик. Т.е. все время задается вопрос Есть новый бар? Есть новый бар? Есть новый бар? и каждый раз печатается сообщение об отсутствии нового бара. И вот появился новый бар. Ордер открывается? ну погодите. Сначала посылается команда на сервер. А пока приходят тики и Есть новый бар? Есть новый бар? и каждый раз печатается сообщение об отсутствии нового бара.И вот наконец сервер открыл ордер - Вы смотрите на время и удивляетесь. А вы вставьте Принт(TimeCurrent()) перед открытием ордера, на 4 строчки ниже первого. А лучше использовать Alert - сразу на экран. Сразу видно...

И еще: вместо if(New_Bar==false)  if(New_Bar==true)  можно использовать if(!New_Bar)  if(New_Bar)  а то у Вас получается масляное масло

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

 
novichok2018:

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

Сначала посылается команда на сервер. А пока приходят тики и Есть новый бар? Есть новый бар? и каждый раз печатается сообщение об отсутствии нового бара.И вот наконец сервер открыл ордер - Вы смотрите на время и удивляетесь. А вы вставьте Принт(TimeCurrent()) перед открытием ордера, на 4 строчки ниже первого. А лучше использовать Alert - сразу на экран. Сразу видно... команда на открытие ордера была послана раньше, по новому бару

 

Подскажите, как возможно сделать так, чтобы между 2 линиями индикатора было закрашивание цветом?

Как в ишимоку

 
Roman Sharanov:

Подскажите, как возможно сделать так, чтобы между 2 линиями индикатора было закрашивание цветом?  Как в ишимоку

Посмотрите, как там сделано... И в терминале наверное есть...

 

Здравствуйте, начал изучать MQL4 по видеоурокам за 2013 год, в точности переписываю код из ролика добавляя незначительные изменения из другого ролика нужные мне, в итоге получаю 25 ошибок. Пытался искать решение этих ошибок но как я понял изменился билд терминала и с в следствии произошли некие изменения в написании кода. Буду благодарен если кто-то поможет отредактировать код или хотя бы даст дельный совет, заранее спасибо.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

//-------------------------------------------------------------------+

Ошибки

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