Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes - page 1350

 
Buba_rus:

Good afternoon.
The Expert Advisor is supposed to check the conditions and open orders when a new bar appears.

I got the error "function declarations are allowed on global, namespace or class scope only". Translated it into "function declarations are allowed on global, namespace or class scope only".
I still don't understand it, I am too dumb. Please tell me or tell me where to read. Thanks in advance).

First of all, make sure you place the code correctly so it's readable.

There's a function for posting code like this, it's easier for everyone to read your code to help.

 

Buba_rus:

Still don't understand anything, dumbass. Please tell me or tell me where to read it. Thanks in advance!

Where did this piece of code come from? I need the whole code to see the error.

 
MakarFX:

First of all, make sure the code is properly posted so it's readable.

There's a function for posting code like this, making it easier for everyone to read your code to help.

bool New_Bar=false;            // Флаг нового бара
bool Work=true;               // Эксперт будет работать
string Symb;                  // Название финансового инструмента

//---------------------------------------------
//+------------------------------------------------------------------+
//| Блок 2
//| Запуск эксперта 
//|                               |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert ("Запуск эксперта");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Блок 3
//| Рабочая часть эксперта  
//|                               
//+------------------------------------------------------------------+
void OnStart ()
  {
//+------------------------------------------------------------------+
//| Блок 4
//| Задаём переменные  
//|                               
//+------------------------------------------------------------------+
int 
Total,    // Колличество ордеров в окне
Tip=-1,   // Тип выбранного ордера (В=0, S=1)
Ticket;   // Номер ордера
// Колличество баров для 2-го условия 
//---------------------------------------------
double 
MA_1_t,     // Значение МА1 текущее
MA_2_t,     // Значение МА2 текущее
// Колличество лотов в выбранном ордере

// Максимальное колличество лотов
Free,       // Текущее колличество свободных средств
Bar_Close1=iClose (NULL, 0, 1),  // Цена закрытия 1 бара
Bar_Close2=iClose (NULL, 0, 2),  // Цена закрытия 2 бара
Bar_Close3=iClose (NULL, 0, 3),  // Цена закрытия 3 бара
// Цена закрытия 4 бара
Lot,      // 
Price,
Lts,        // Минимум свободных средств 
SL,         // SL выбранного ордера 
TP;         // TP выбранного ордера
//---------------------------------------------
bool
Bars_Y1=false,    // 1 критерий закрытие Bars_X подряд выше друг друга
Bars_Y2=false,    // 1 критерий закрытие Bars_X подряд ниже друг друга
Open_B=false,     // Критерий открытия Bay
Open_S=false;     // Критерий открытия Sell

//+------------------------------------------------------------------+
//| Блок 5
//| Предварительная обработка  
//|                               
//+------------------------------------------------------------------+
if (Bars < Period_MA_2)     // Недостаточно баров
   { 
   Alert ( "Недостаточно баров в окне. Эксперт не работает.");
   return;                  // Выход из start ()
   }
   
if (Work==false)
   {
   Alert ("Критическая ошибка. Эксперт не работает.");
   return;                 // Выход из start () 
   }

//--------------------------------------------- Новый бар
 Fun_New_Bar();                      // Обращение к ф-ии
   if (New_Bar==false)               // Если бар не новый..
      return;                        // ..то уходим

void Fun_New_Bar ()                  // Появление нового бара
{
  static datetime New_Time=Time[0];  // 
  New_Bar=false;                     // Не новый бар
  if(New_Time!=Time[0])              // Проверка времени
  {
     New_Time=Time[0];               // 
     New_Bar=true;                   //
  }
}
 
Buba_rus:

Where are you getting it from?

Period_MA_2

It's not all code again... it's up to you.

here are the errors

'Period_MA_2' - undeclared identifier   Wai_v_5.0.mq4   64      12
variable 'Total' not used       Wai_v_5.0.mq4   31      1
variable 'Ticket' not used      Wai_v_5.0.mq4   33      1
variable 'MA_1_t' not used      Wai_v_5.0.mq4   37      1
variable 'MA_2_t' not used      Wai_v_5.0.mq4   38      1
variable 'Free' not used        Wai_v_5.0.mq4   42      1
variable 'Lot' not used Wai_v_5.0.mq4   47      1
variable 'Price' not used       Wai_v_5.0.mq4   48      1
variable 'Lts' not used Wai_v_5.0.mq4   49      1
variable 'SL' not used  Wai_v_5.0.mq4   50      1
variable 'TP' not used  Wai_v_5.0.mq4   51      1
1 errors, 10 warnings           2       11
 
MakarFX :

Where is this piece of code from? You need all the code to see the error

I did not immediately see and did not understand that I had to discard the entire Expert Advisor.

 extern double StopLoss= 200 ;   // SL для открываемого ордера
extern double TakeProfit= 300 ; // TP для открываемого ордера
extern double Lots= 5 ;         // Колличество лотов не должно превышать
extern double Lots_X= 0.3 ;     // Размер лота
extern double Prots= 0.4 ;       // Процент свободных средств

//---------------------------------------------

extern int Period_MA_1= 10 ;     // Период МА_1 быстрая
extern int Period_MA_2= 50 ;     // Период МА_2 медленная

//---------------------------------------------
bool isNewBar();               // Функция нового бара???
bool Work= true ;               // Эксперт будет работать
string Symb;                   // Название финансового инструмента

//---------------------------------------------

//+------------------------------------------------------------------+
//| Блок 2
//| Запуск эксперта 
//|                               |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   Alert ( "Запуск эксперта" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Блок 3
//| Рабочая часть эксперта  
//|                               
//+------------------------------------------------------------------+
void OnStart ()
  {
//+------------------------------------------------------------------+
//| Блок 4
//| Задаём переменные  
//|                               
//+------------------------------------------------------------------+
int 
Total,     // Колличество ордеров в окне
Tip=- 1 ,   // Тип выбранного ордера (В=0, S=1)
Ticket;   // Номер ордера
// Колличество баров для 2-го условия 
//---------------------------------------------
double 
MA_1_t,     // Значение МА1 текущее
MA_2_t,     // Значение МА2 текущее
// Колличество лотов в выбранном ордере

// Максимальное колличество лотов
Free,       // Текущее колличество свободных средств
Bar_Close1= iClose ( NULL , 0 , 1 ),   // Цена закрытия 1 бара
Bar_Close2= iClose ( NULL , 0 , 2 ),   // Цена закрытия 2 бара
Bar_Close3= iClose ( NULL , 0 , 3 ),   // Цена закрытия 3 бара
// Цена закрытия 4 бара
Lot,       // 
Price,
Lts,         // Минимум свободных средств 
SL,         // SL выбранного ордера 
TP;         // TP выбранного ордера
//---------------------------------------------
bool
Bars_Y1= false ,     // 1 критерий закрытие Bars_X подряд выше друг друга
Bars_Y2= false ,     // 1 критерий закрытие Bars_X подряд ниже друг друга
Open_B= false ,     // Критерий открытия Bay
Open_S= false ;     // Критерий открытия Sell

//+------------------------------------------------------------------+
//| Блок 5
//| Предварительная обработка  
//|                               
//+------------------------------------------------------------------+
if ( Bars < Period_MA_2)     // Недостаточно баров
   { 
   Alert ( "Недостаточно баров в окне. Эксперт не работает." );
   return ;                   // Выход из start ()
   }
   
if (Work== false )
   {
   Alert ( "Критическая ошибка. Эксперт не работает." );
   return ;                 // Выход из start () 
   }


//+------------------------------------------------------------------+
//| Блок 6
//| Учёт ордеров  
//|                               
//+------------------------------------------------------------------+
Symb= Symbol ();   // Название финансового инструмента
Total= 0 ;         // Колличество ордеров
for ( int i= 1 ; i<= OrdersTotal (); i++)           // Цикл перебора ордер
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb) continue ;       // Не наш фин. инструм
         if (OrderType()> 1 )                     // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 5 )                           // Не более одного орд
           {
             Alert ( "Рыночных ордеров больше 5-и. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }

//+------------------------------------------------------------------+
//| Блок 7
//| Определение торговых критериев  
//|                               
//+------------------------------------------------------------------+
//--------------------------------------------- Новый бар
bool isNewBar()
  {
   static datetime last_time= 0 ;   //в статической переменной будем помнить время открытия последнего бара
   datetime lastbar_time= SeriesInfoInteger ( Symbol (), Period (), SERIES_LASTBAR_DATE );   // текущее время
   if (last_time== 0 )   // если это первый вызов функции
     {
      last_time=lastbar_time;   // установим время и выйдем 
       return ( false );
     }
     
   if (last_time!=lastbar_time) // если время отличается
     {
      last_time=lastbar_time; // запомним время и вернем true
       return ( true );
     }

   return ( false ); // дошли до этого места - значит бар не новый, вернем false
  }
//--------------------------------------------- 1 условие
MA_1_t= iMA ( NULL , 0 ,Period_MA_1, 0 , MODE_LWMA , PRICE_TYPICAL , 0 );   //MA_1

MA_2_t= iMA ( NULL , 0 ,Period_MA_2, 0 , MODE_LWMA , PRICE_TYPICAL , 0 );   //MA_2

//--------------------------------------------- 2 условие
if (Bar_Close1 > Bar_Close2 > Bar_Close3 ) // Условие на Buy
   {
   Bars_Y1= true ; // Условие выполнено
   }

if ( Bar_Close1 < Bar_Close2 < Bar_Close3) // Условие на Sell
   {
   Bars_Y2= true ; // Условие выполнено
   }

//--------------------------------------------- Критерий
if (MA_1_t > MA_2_t && Bars_Y1== true )     // Если МА1 выше МА2 и цены закрытия у Bars_x баров 
   {                                     // подряд выше друг друга
   Open_B= true ;                           // Критерий открытия Buy
   }
   
if (MA_1_t < MA_2_t && Bars_Y2== true )     // Если МА1 ниже МА2 и цены закрытия у Bars_x баров
   {                                     // подряд ниже друг друга
   Open_S= true ;                           // Критерий открытия Sell
   }  
 
//+------------------------------------------------------------------+
//| Блок 8
//| Закрытие или модернизация ордеров  
//|                               
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| Блок 9
//| Вычисление свободных средств  
//| Вычисление стоимости ордеров                              
//+------------------------------------------------------------------+
RefreshRates();                 // Обновление данных
Free=AccountFreeMargin();       // Свободн средства
Lts= MathFloor (Free*Prots);   // Минимум свободных средств
if (Lts> Free)                 // 
     {
       Alert ( "Не хватает денег!" );
       return ;                                   // Выход из start()
     }
     
//+------------------------------------------------------------------+
//| Блок 10
//| Открытие ордеров  
//|
//+------------------------------------------------------------------+
 while ( true )                                     // Цикл закрытия орд.
     {
       if (Total== 0 && Open_B== true )             // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         SL=Bid - StopLoss* Point ;               // Вычисление SL откр.
         TP=Bid + TakeProfit* Point ;             // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lots_X,Ask, 2 ,SL,TP); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Open_S== true )             // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                         // Обновление данных
         SL=Ask + StopLoss* Point ;     // Вычисление SL откр.
         TP=Ask - TakeProfit* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lots_X,Bid, 2 ,SL,TP); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }

//-------------------------------------------------------------------
 return ;                                       // Выход из start()
  }
//+------------------------------------------------------------------+
//| Блок 11
//| Обработка ошибок  
//|                               
//+------------------------------------------------------------------+
int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while (RefreshRates()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }

//+------------------------------------------------------------------+
//| Блок 12
//| Проверка стоп приказов  
//|                               
//+------------------------------------------------------------------+





//+------------------------------------------------------------------+
//| Блок 13
//| Прекращение исполнения эксперта  
//|                               
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   Alert ( "Эксперт выключен!" ); 
  }
 
Buba_rus :

I did not immediately see and did not understand that I had to discard the entire Expert Advisor.

I highlighted what was wrong

 extern double StopLoss= 200 ;   // SL для открываемого ордера
extern double TakeProfit= 300 ; // TP для открываемого ордера
extern double Lots= 5 ;         // Колличество лотов не должно превышать
extern double Lots_X= 0.3 ;     // Размер лота
extern double Prots= 0.4 ;       // Процент свободных средств

//---------------------------------------------

extern int Period_MA_1= 10 ;     // Период МА_1 быстрая
extern int Period_MA_2= 50 ;     // Период МА_2 медленная

//---------------------------------------------
//bool isNewBar();               // Функция нового бара???
bool Work= true ;               // Эксперт будет работать
string Symb;                   // Название финансового инструмента

//---------------------------------------------

//+------------------------------------------------------------------+
//| Блок 2
//| Запуск эксперта 
//|                               |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   Alert ( "Запуск эксперта" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Блок 3
//| Рабочая часть эксперта  
//|                               
//+------------------------------------------------------------------+
void OnStart ()
  {
//+------------------------------------------------------------------+
//| Блок 4
//| Задаём переменные  
//|                               
//+------------------------------------------------------------------+
int 
Total,     // Колличество ордеров в окне
Tip=- 1 ,   // Тип выбранного ордера (В=0, S=1)
Ticket;   // Номер ордера
// Колличество баров для 2-го условия 
//---------------------------------------------
double 
MA_1_t,     // Значение МА1 текущее
MA_2_t,     // Значение МА2 текущее
// Колличество лотов в выбранном ордере

// Максимальное колличество лотов
Free,       // Текущее колличество свободных средств
Bar_Close1= iClose ( NULL , 0 , 1 ),   // Цена закрытия 1 бара
Bar_Close2= iClose ( NULL , 0 , 2 ),   // Цена закрытия 2 бара
Bar_Close3= iClose ( NULL , 0 , 3 ),   // Цена закрытия 3 бара
// Цена закрытия 4 бара
Lot,       // 
Price,
Lts,         // Минимум свободных средств 
SL,         // SL выбранного ордера 
TP;         // TP выбранного ордера
//---------------------------------------------
bool
Bars_Y1= false ,     // 1 критерий закрытие Bars_X подряд выше друг друга
Bars_Y2= false ,     // 1 критерий закрытие Bars_X подряд ниже друг друга
Open_B= false ,     // Критерий открытия Bay
Open_S= false ;     // Критерий открытия Sell

//+------------------------------------------------------------------+
//| Блок 5
//| Предварительная обработка  
//|                               
//+------------------------------------------------------------------+
if ( Bars < Period_MA_2)     // Недостаточно баров
   { 
   Alert ( "Недостаточно баров в окне. Эксперт не работает." );
   return ;                   // Выход из start ()
   }
   
if (Work== false )
   {
   Alert ( "Критическая ошибка. Эксперт не работает." );
   return ;                 // Выход из start () 
   }


//+------------------------------------------------------------------+
//| Блок 6
//| Учёт ордеров  
//|                               
//+------------------------------------------------------------------+
Symb= Symbol ();   // Название финансового инструмента
Total= 0 ;         // Колличество ордеров
for ( int i= 1 ; i<= OrdersTotal (); i++)           // Цикл перебора ордер
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb) continue ;       // Не наш фин. инструм
         if (OrderType()> 1 )                     // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 5 )                           // Не более одного орд
           {
             Alert ( "Рыночных ордеров больше 5-и. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }

//+------------------------------------------------------------------+
//| Блок 7
//| Определение торговых критериев  
//|                               
//+------------------------------------------------------------------+
//--------------------------------------------- 1 условие
MA_1_t= iMA ( NULL , 0 ,Period_MA_1, 0 , MODE_LWMA , PRICE_TYPICAL , 0 );   //MA_1

MA_2_t= iMA ( NULL , 0 ,Period_MA_2, 0 , MODE_LWMA , PRICE_TYPICAL , 0 );   //MA_2

//--------------------------------------------- 2 условие
if (Bar_Close1 > Bar_Close2 > Bar_Close3 ) // Условие на Buy
   {
   Bars_Y1= true ; // Условие выполнено
   }

if ( Bar_Close1 < Bar_Close2 < Bar_Close3) // Условие на Sell
   {
   Bars_Y2= true ; // Условие выполнено
   }

//--------------------------------------------- Критерий
if (MA_1_t > MA_2_t && Bars_Y1== true )     // Если МА1 выше МА2 и цены закрытия у Bars_x баров 
   {                                     // подряд выше друг друга
   Open_B= true ;                           // Критерий открытия Buy
   }
   
if (MA_1_t < MA_2_t && Bars_Y2== true )     // Если МА1 ниже МА2 и цены закрытия у Bars_x баров
   {                                     // подряд ниже друг друга
   Open_S= true ;                           // Критерий открытия Sell
   }  
 
//+------------------------------------------------------------------+
//| Блок 8
//| Закрытие или модернизация ордеров  
//|                               
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| Блок 9
//| Вычисление свободных средств  
//| Вычисление стоимости ордеров                              
//+------------------------------------------------------------------+
RefreshRates();                 // Обновление данных
Free=AccountFreeMargin();       // Свободн средства
Lts= MathFloor (Free*Prots);   // Минимум свободных средств
if (Lts> Free)                 // 
     {
       Alert ( "Не хватает денег!" );
       return ;                                   // Выход из start()
     }
     
//+------------------------------------------------------------------+
//| Блок 10
//| Открытие ордеров  
//|
//+------------------------------------------------------------------+
 while ( true )                                     // Цикл закрытия орд.
     {
       if (Total== 0 && Open_B== true )             // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         SL=Bid - StopLoss* Point ;               // Вычисление SL откр.
         TP=Bid + TakeProfit* Point ;             // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lots_X,Ask, 2 ,SL,TP); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Open_S== true )             // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                         // Обновление данных
         SL=Ask + StopLoss* Point ;     // Вычисление SL откр.
         TP=Ask - TakeProfit* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lots_X,Bid, 2 ,SL,TP); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }

//-------------------------------------------------------------------
 return ;                                       // Выход из start()
  }
//+------------------------------------------------------------------+
//| Блок 11
//| Обработка ошибок  
//|                               
//+------------------------------------------------------------------+
int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while (RefreshRates()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }

//+------------------------------------------------------------------+
//| Блок 12
//| Проверка стоп приказов  
//|                               
//+------------------------------------------------------------------+





//+------------------------------------------------------------------+
//| Блок 13
//| Прекращение исполнения эксперта  
//|                               
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   Alert ( "Эксперт выключен!" ); 
  }
//--------------------------------------------- Новый бар
bool isNewBar()
  {
   static datetime last_time= 0 ;   //в статической переменной будем помнить время открытия последнего бара
   datetime lastbar_time= SeriesInfoInteger ( Symbol (), Period (), SERIES_LASTBAR_DATE );   // текущее время
   if (last_time== 0 )   // если это первый вызов функции
     {
      last_time=lastbar_time;   // установим время и выйдем 
       return ( false );
     }
     
   if (last_time!=lastbar_time) // если время отличается
     {
      last_time=lastbar_time; // запомним время и вернем true
       return ( true );
     }

   return ( false ); // дошли до этого места - значит бар не новый, вернем false
  }

if (isNewBar()== true )

yellow highlighted unnecessary, you can delete

the function highlighted in green must be outside of OnStart(),

where you need to define a new bar , use the highlighted brown

 

Hello. Happy holidays to everyone and good luck in the new year.

The Expert Advisor trades on DeMark points, using a simple indicator on these points. I would like to ensure that the data on the points would be saved when the terminal is shut down. And on startup, the Expert Advisor could use the saved data and then work according to the program. Is it possible? I understand that this can be done using a function like FileOpen(). I have never done it. Please advise how to do it correctly. Here are a couple of functions to calculate the price of two points. The others are similar. How to save the data of these functions.

double PriceDemUp2()
{
   double priceUp = NormalizeDouble(iCustom(NULL, 0, "DeMark Point", LevelDP, 0, LevelDP+1), Digits);
   
   static double   priceUp1 = 0;
   static double   priceDw1 = 0;
   static double   priceUp2 = 0;
   static double   priceDw2 = 0;  
   static datetime timeUp1  = 0;
   static datetime timeDw1  = 0; 
   static datetime timeUp2  = 0;
   static datetime timeDw2  = 0;
   static datetime time     = 0;
   
   if(time != Time[0])
   {
      if(priceUp != 0)
      {
         if(priceUp2 != priceUp1)
         {
            timeUp2  = timeUp1;
            priceUp2 = priceUp1;
         }
         if(priceUp1 != iHigh(NULL, 0, BarPointDemUp()))
         {
            timeUp1  = iTime(NULL, 0, BarPointDemUp());
            priceUp1 = iHigh(NULL, 0, BarPointDemUp());
         }
      }
      time = Time[0];
   }
   return(priceUp2);
}
///////////////////////////////////////////////////////////
double PriceDemUp1()
{
   double priceUp = NormalizeDouble(iCustom(NULL, 0, "DeMark Point", LevelDP, 0, LevelDP+1), Digits);
   
   static double   priceUp1 = 0;
   static double   priceDw1 = 0;
   static double   priceUp2 = 0;
   static double   priceDw2 = 0;  
   static datetime timeUp1  = 0;
   static datetime timeDw1  = 0; 
   static datetime timeUp2  = 0;
   static datetime timeDw2  = 0;
   static datetime time     = 0;
   
   if(time != Time[0])
   {
      if(priceUp != 0)
      {
         if(priceUp2 != priceUp1)
         {
            timeUp2  = timeUp1;
            priceUp2 = priceUp1;
         }
         if(priceUp1 != iHigh(NULL, 0, BarPointDemUp()))
         {
            timeUp1  = iTime(NULL, 0, BarPointDemUp());
            priceUp1 = iHigh(NULL, 0, BarPointDemUp());
         }
      }
      time = Time[0];
   }
   return(priceUp1);
}
 
Youri Lazurenko:

Hello. Happy holidays to everyone and good luck in the new year.

The Expert Advisor trades on DeMark points, using a simple indicator on these points. I would like to ensure that the data on the points would be saved when the terminal is shut down. And on startup, the Expert Advisor could use the saved data and then work according to the program. Is it possible? I understand that this can be done using a function like FileOpen(). I have never done it. Please advise how to do it correctly. Here are a couple of functions to calculate the price of two points. The others are similar. How to save the data of these functions.

I would add to the Expert Advisor the creation of objects on DeMark points and use these objects for trading

ArrowUpCreate(0,"ArrowUp",0,date,price,сolor);
 
MakarFX:

I would add to the Expert Advisor to create objects according to DeMark points and trade on these objects

Thank you for your reply. But if I'm not mistaken, your tip concerns MQL5. My EA is based on MQL4.

I'm not a programmer, an amateur, for myself.
 
Youri Lazurenko:

Thank you for your reply. But if I'm not mistaken, your advice concerns MQL5. My EA is in MQL4.

I am not a programmer, amateur, for myself.

mql4 is also possible here

Графические объекты - Стандартные функции - Учебник по MQL4
Графические объекты - Стандартные функции - Учебник по MQL4
  • book.mql4.com
Графический объект - это изображение в окне финансового инструмента, которое можно выделить, переместить, изменить или удалить. К графическим объектам относятся, например, горизонтальные и вертикальные линии, канал линейной регрессии, уровни Фибоначчи, прямоугольник, текстовая метка и пр. Такие изображения, как индикаторные линии, уровни...