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

 
Buba_rus:

Добрый день.
Согласно задумке советник должен проверять условия и открывать ордера при появлении нового бара. 

Выдаёт ошибку "function declarations are allowed on global, namespace or class scope only". Перевёл :"объявления функций разрешены только в глобальной области, пространстве имен или классе". 
Всё равно ничего не понял, тупенький. Расскажите пожалуйста или подскажите где прочесть. Заранее спасибо!)

Для начала код размести нормально, чтоб можно было читать

Есть вот такая функция для размещения кода, всем будет удобнее читать твой код чтобы помочь.

 

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(),

там где нужно определить новый бар используй выделенное коричневым

 

Здравствуйте. Всех с прошедшими праздниками, всем удачи в новом году.

Советник торгует по точкам ДеМарка, используя простенький индикатор по этим точкам. Нужно, чтобы при выключении терминала, сохранялись данные точек. А при запуске советник мог использовать сохраненные данные, а дальше работать по программе. Возможно ли это. Я так понимаю, что это можно сделать при помощи функции типа  FileOpen(). Но никогда не делал. Подскажите как правильно. Вот пара функций для вычисления цены двух точек. Остальные аналогичны. Как сохранить данные этих функций.

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:

Здравствуйте. Всех с прошедшими праздниками, всем удачи в новом году.

Советник торгует по точкам ДеМарка, используя простенький индикатор по этим точкам. Нужно, чтобы при выключении терминала, сохранялись данные точек. А при запуске советник мог использовать сохраненные данные, а дальше работать по программе. Возможно ли это. Я так понимаю, что это можно сделать при помощи функции типа  FileOpen(). Но никогда не делал. Подскажите как правильно. Вот пара функций для вычисления цены двух точек. Остальные аналогичны. Как сохранить данные этих функций.

я бы добавил в советник создание объектов по точкам ДеМарка и уже по этим объектам торговать

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

я бы добавил в советник создание объектов по точкам ДеМарка и уже по этим объектам торговать

Спасибо за ответ. Но, если я не ошибаюсь, ваш совет касается MQL5. Мой советник на языке  MQL4.

Я не программист, любитель, для себя.
 
Youri Lazurenko:

Спасибо за ответ. Но, если я не ошибаюсь, ваш совет касается MQL5. Мой советник на языке  MQL4.

Я не программист, любитель, для себя.

mql4 тоже можно вот

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