Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1350

 
Buba_rus:

Boa tarde.
O Expert Advisor deve verificar as condições e abrir pedidos quando um novo bar aparece.

Recebi o erro "declarações de função são permitidas somente em âmbito global, de espaço de nomes ou de classe". Traduziu-o em "declarações de função permitidas apenas em âmbito global, de espaço de nomes ou de classe".
Ainda não entendo, sou muito denso. Por favor, me diga ou me diga onde ler. Agradecemos antecipadamente).

Antes de tudo, certifique-se de colocar o código corretamente para que ele seja legível.

Há uma função para postar código como esta, é mais fácil para todos lerem seu código para ajudar.

 

Buba_rus:

Ainda não entende nada, idiota. Por favor, me diga ou me diga onde ler. Obrigado de antemão!

De onde veio este pedaço de código? Eu preciso do código inteiro para ver o erro.

 
MakarFX:

Antes de mais nada, certifique-se de que o código esteja devidamente afixado para que seja legível.

Há uma função para postar código como esta, é mais fácil para todos lerem seu código para ajudar.

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:

De onde você está tirando isso?

Period_MA_2

Não é tudo código de novo... é com você.

aqui estão os erros

'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 :

De onde é esse pedaço de código? Você precisa de todo o código para ver o erro

Eu não vi imediatamente e não entendi que todo o Expert Advisor tinha que ser descartado.

 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 :

Eu não vi imediatamente e não entendi que eu tinha que descartar todo o Expert Advisor.

Eu destaquei o que estava errado

 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 )

amarelo destacado desnecessário, você pode excluir

a função destacada em verde deve estar fora de OnStart(),

onde você precisa definir uma nova barra , use o marrom destacado

 

Olá. Boas festas para todos e boa sorte no novo ano.

O Expert Advisor comercializa os pontos DeMark, usando um indicador simples sobre esses pontos. Eu gostaria de garantir que os dados sobre os pontos seriam salvos quando o terminal fosse desligado. E na partida, o Expert Advisor poderia usar os dados salvos e depois trabalhar de acordo com o programa. Isso é possível? Entendo que isto pode ser feito usando uma função como FileOpen(). Eu nunca o fiz. Por favor, informe como fazê-lo corretamente. Aqui estão algumas funções para calcular o preço de dois pontos. Os outros são semelhantes. Como salvar os dados destas funções.

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:

Olá. Boas festas para todos e boa sorte no novo ano.

O Expert Advisor comercializa os pontos DeMark, usando um indicador simples sobre esses pontos. Eu gostaria de garantir que os dados sobre os pontos seriam salvos quando o terminal fosse desligado. E na partida, o Expert Advisor poderia usar os dados salvos e depois trabalhar de acordo com o programa. Isso é possível? Entendo que isto pode ser feito usando uma função como FileOpen(). Eu nunca o fiz. Por favor, informe como fazê-lo corretamente. Aqui estão algumas funções para calcular o preço de dois pontos. Os outros são semelhantes. Como salvar os dados destas funções.

Eu adicionaria ao Expert Advisor a criação de objetos em pontos DeMark e utilizaria esses objetos para negociação

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

Eu acrescentaria ao Expert Advisor para criar objetos baseados em pontos DeMark e negociar com esses objetos

Obrigado por sua resposta. Mas se não estou enganado, sua dica diz respeito à MQL5. Minha EA é baseada na MQL4.

Eu não sou um programador, um amador, por mim mesmo.
 
Youri Lazurenko:

Obrigado por sua resposta. Mas se não estou enganado, seu conselho diz respeito à MQL5. Meu EA está em MQL4.

Não sou um programador, amador, por mim mesmo.

mql4 também é possível aqui

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