MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1350

 
Buba_rus:

こんにちは。
Expert Advisorは条件を確認し、新しいバーが表示されたら注文を出すことになっています。

関数宣言はグローバル、名前空間、クラススコープでのみ許可されています」というエラーが出ました。関数宣言はグローバル、名前空間、クラススコープでのみ許可される」と訳した。
やはり理解できない、私は頭が悪すぎるのだ。教えてください、またはどこを読めばいいのか教えてください。ありがとうございました)。

まず、コードが読めるように正しく配置すること。

このようなコードを投稿する機能があります、あなたのコードを読むことで誰もが助けやすくなります。

 

Buba_rus:

まだ何も理解してないのかよ、アホか。教えてください、またはどこで読めるか教えてください。ありがとうございました。

このコード片はどこから来たのか?エラーを確認するためにコード全体が必要です。

 
MakarFX:

まず、コードが読めるようにきちんと掲載されているかを確認します。

このようにコードを投稿する機能があります、あなたのコードを読むことでみんなが助けやすくなります。

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:

どこから入手しているのですか?

Period_MA_2

また、すべてのコードではない...それはあなた次第です。

以下はエラーです。

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

このコードはどこから来たのですか?エラーを確認するには、すべてのコードが必要です

私はすぐには見ず、エキスパートアドバイザー全体を破棄しなければならないことを理解していませんでした。

 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 :

私はすぐには見ず、エキスパートアドバイザー全体を破棄しなければならないことを理解していませんでした。

何が悪かったのかを強調しました

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 )

黄色で強調表示されている不要な場合は、削除できます

緑で強調表示されている関数は、OnStart()の外部にある必要があります。

新しいバーを定義する必要がある場合は、強調表示された茶色を使用します

 

こんにちは。皆さん、良いお年をお迎えください。

Expert Advisorはデマークのポイントで取引し、このポイントに簡単なインジケータを使用します。端末をシャットダウンしても、ポイントのデータは確実に保存されるようにしたい。そして、Expert Advisorは起動時に保存されたデータを使用し、プログラムに従って動作することができます。可能なのでしょうか?FileOpen()ような 関数を使えば可能なのは理解しています。やったことがない。正しい方法をアドバイスしてください。ここでは、2点の価格を計算する関数をいくつか紹介します。他も似たようなものです。これらの機能のデータを保存する方法。

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:

こんにちは。皆さん、良いお年をお迎えください。

Expert Advisorはデマークのポイントで取引し、このポイントに簡単なインジケータを使用します。端末をシャットダウンしたときに、ポイントのデータを確実に保存したい。そして、Expert Advisorは起動時に保存されたデータを使用し、プログラムに従って動作することができます。可能なのでしょうか?FileOpen()のような 関数を使えば可能なのは理解しています。やったことがない。正しい方法をアドバイスしてください。ここでは、2点の価格を計算する関数をいくつか紹介します。他も似たようなものです。これらの機能のデータを保存する方法。

Expert Advisorにデマークのポイントにオブジェクトを作成する 機能を追加し、これらのオブジェクトを取引に使用します。

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

Expert Advisorにデマークのポイントに基づいたオブジェクトを作成 し、そのオブジェクトで取引することを追加します。

ご返信ありがとうございました。しかし、私が間違っていなければ、あなたの情報はMQL5に関するものです。私のEAはMQL4が ベースになっています。

自分にはプログラマーというアマチュアはいない。
 
Youri Lazurenko:

ご返信ありがとうございました。しかし、私の記憶違いでなければ、あなたのアドバイスはMQL5に関するものです。私のEAはMQL4 です。

私はプログラマーではなく、アマチュア、自分自身のためです。

mql4はこちらでも 可能です。

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