Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1350

 
Buba_rus:

Buon pomeriggio.
L'Expert Advisor dovrebbe controllare le condizioni e aprire gli ordini quando appare una nuova barra.

Ho ottenuto l'errore "le dichiarazioni di funzione sono consentite solo su ambito globale, spazio dei nomi o classe". L'ho tradotto in "le dichiarazioni di funzione sono permesse solo nell'ambito globale, namespace o classe".
Ancora non lo capisco, sono troppo stupido. Per favore, ditemi o ditemi dove leggere. Grazie in anticipo).

Prima di tutto, assicuratevi di posizionare il codice correttamente in modo che sia leggibile.

C'è una funzione per postare codice come questo, è più facile per tutti leggere il tuo codice per aiutare.

 

Buba_rus:

Continui a non capire nulla, idiota. Per favore, ditemi o ditemi dove leggerlo. Grazie in anticipo!

Da dove viene questo pezzo di codice? Ho bisogno di tutto il codice per vedere l'errore.

 
MakarFX:

Prima di tutto, assicuratevi che il codice sia inserito correttamente in modo che sia leggibile.

C'è una funzione per postare codice come questo, rendendo più facile per tutti leggere il tuo codice per aiutare.

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:

Da dove lo prendi?

Period_MA_2

Non è tutto un codice di nuovo... dipende da te.

ecco gli errori

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

Da dove viene questo pezzo di codice? Hai bisogno di tutto il codice per vedere l'errore

Non ho visto subito e non ho capito che l'intero Expert Advisor doveva essere scartato.

 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 :

Non ho visto subito e non ho capito che dovevo scartare l'intero Expert Advisor.

Ho evidenziato cosa non andava

 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 )

evidenziato in giallo non necessario, è possibile eliminare

la funzione evidenziata in verde deve essere esterna a OnStart(),

dove devi definire una nuova barra , usa il marrone evidenziato

 

Salve. Buone vacanze a tutti e buona fortuna per il nuovo anno.

L'Expert Advisor fa trading sui punti DeMark, utilizzando un semplice indicatore su questi punti. Vorrei fare in modo che i dati dei punti vengano salvati quando il terminale viene spento. E all'avvio, l'Expert Advisor potrebbe utilizzare i dati salvati e poi lavorare secondo il programma. È possibile? Ho capito che questo può essere fatto usando una funzione come FileOpen(). Non l'ho mai fatto. Per favore, consigliatemi come farlo correttamente. Ecco un paio di funzioni per calcolare il prezzo di due punti. Gli altri sono simili. Come salvare i dati di queste funzioni.

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:

Salve. Buone vacanze a tutti e buona fortuna per il nuovo anno.

L'Expert Advisor fa trading sui punti DeMark, utilizzando un semplice indicatore su questi punti. Vorrei fare in modo che i dati dei punti vengano salvati quando il terminale viene spento. E all'avvio, l'Expert Advisor potrebbe utilizzare i dati salvati e poi lavorare secondo il programma. È possibile? Ho capito che questo può essere fatto usando una funzione come FileOpen(). Non l'ho mai fatto. Per favore, consigliatemi come farlo correttamente. Ecco un paio di funzioni per calcolare il prezzo di due punti. Gli altri sono simili. Come salvare i dati di queste funzioni.

Aggiungerei all'Expert Advisor la creazione di oggetti sui punti DeMark e userei questi oggetti per il trading

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

Aggiungerei all'Expert Advisor di creare oggetti basati sui punti DeMark e fare trading su questi oggetti

Grazie per la vostra risposta. Ma se non mi sbaglio, il tuo consiglio riguarda MQL5. Il mio EA è basato su MQL4.

Non sono un programmatore, un dilettante, per me stesso.
 
Youri Lazurenko:

Grazie per la vostra risposta. Ma se non mi sbaglio, il tuo consiglio riguarda MQL5. Il mio EA è in MQL4.

Non sono un programmatore, dilettante, per me stesso.

mql4 è anche possibile qui

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