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

 
2047728:
Здравствуйте, начал изучать MQL4 по видеоурокам за 2013 год, в точности переписываю код из ролика добавляя незначительные изменения из другого ролика нужные мне, в итоге получаю 25 ошибок. Пытался искать решение этих ошибок но как я понял изменился билд терминала и с в следствии произошли некие изменения в написании кода. Буду благодарен если кто-то поможет отредактировать код или хотя бы даст дельный совет, заранее спасибо.

И чем это Вам поможет? В следующий раз сразу же во Фриланс обращайтесь

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price,TP,lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *= 10;
      Step       *= 10;
      Slippage   *= 10;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
  {
   bool check;
   if(CountTrades()==0)
     {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);

      if(ima_1>ima_2)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
         if(ticket>0)
           {
            TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
            check=OrderModify(ticket,OrderOpenPrice(),0,TP,0);
           }
        }
      else if(ima_1<ima_2)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red);
         if(ticket>0)
           {
            TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
            check=OrderModify(ticket,OrderOpenPrice(),0,TP,0);
           }
        }

     }
   else
     {
      int order_type= FindLastOrderType();
      if(order_type == OP_BUY)
        {
         price=FindLastOrderPrice(OP_BUY);
         if(Ask<=price-Step*Point)
           {
            lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket=OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,"",Magic,0,Blue);
            if(ticket>0)
               ModifiOrders(OP_BUY);
           }
        }
      else if(order_type==OP_SELL)
        {
         price = FindLastOrderPrice(OP_SELL);
         if(Bid<= price + Step * Point)
           {
            lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket=OrderSend(Symbol(),OP_BUY,lastlot,Bid,Slippage,0,0,"",Magic,0,Red);
            if(ticket>0)
               ModifiOrders(OP_SELL);
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
  {
   double avgprice=0,
   order_lots=0;
   bool check;
   price=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otype)
           {
            price+=OrderOpenPrice()*OrderLots();
            order_lots+=OrderLots();
           }
        }
     }
   avgprice=NormalizeDouble(price/order_lots,Digits);

   if(otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if(otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otype)
            check=OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0);
        }
     }
  }
//+------------------------------------------------------------------+
double FindLastLots(int otype)
  {
   double oldlots=0;
   int oldticket=0;

   ticket=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otype)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               oldlots= OrderLots();
               ticket = oldticket;
              }
           }
        }
     }
   return(oldlots);
  }
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
  {
   double oldopenprice=-1;
   int    oldticket=0;

   ticket=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otype)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               oldopenprice=OrderOpenPrice();
               ticket=oldticket;
              }
           }
        }
     }
   return(oldopenprice);
  }
//+------------------------------------------------------------------+
int FindLastOrderType()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            return(OrderType());
        }
     }
   return(-1);
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count= 0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) count++;
        }
     }
   return(count);
  }
//-------------------------------------------------------------------+
 
2047728:

Здравствуйте, начал изучать MQL4 по видеоурокам за 2013 год, в точности переписываю код из ролика добавляя незначительные изменения из другого ролика нужные мне, в итоге получаю 25 ошибок. Пытался искать решение этих ошибок но как я понял изменился билд терминала и с в следствии произошли некие изменения в написании кода. Буду благодарен если кто-то поможет отредактировать код или хотя бы даст дельный совет, заранее спасибо.

Добавляйте изменения по одному и исправляйте ошибки - постепенно научитесь. Хотите выучить язык - начинайте с простых примеров

 

Добрый день! Помогите пожалуйста разобраться в коде индикатора. Имеется нулевой уровень, на его основе нужно заполнить первый уровень. Что не делаю не чего не получается. Вот код индикатора:

//+---------------------------------------------------------------------------------------------------------+
//|                                                                                        Trend Levels.mq5 |
//|                                                                                                   Serzh |
//+---------------------------------------------------------------------------------------------------------+
#property copyright "Serzh"
#property version   "1.00"

//--------------------------------Входные параметры----------------------------------------------------------

#property indicator_chart_window                 // Индикатор отображается в окне графика
#property indicator_buffers 4                    // К-во индикаторных буферов
#property indicator_plots   2                    // К-во графических серий

//--------------------------------Инициализация графических серий--------------------------------------------

#property indicator_label1  "Максимумы 1-го ровня"         // Название индикаторной серии
#property indicator_type1   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color1  clrDarkGreen                   // Цвет линии индикатора
#property indicator_width1  2                              // Толщина линии индикатора

#property indicator_label2  "Минимумы 1-го ровня"          // Название индикаторной серии
#property indicator_type2   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color2  clrCrimson                     // Цвет линии индикатора
#property indicator_width2  2                              // Толщина линии индикатора

//--------------------------------Инициализация индикаторных массивов----------------------------------------

 double Max_1[],Min_1[];                                             // Индикаторные массивы
 double Max_0[],Min_0[];                                             // Вспомогательные массивы
   
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnInit                                          |
//+---------------------------------------------------------------------------------------------------------+
int OnInit()

  {
  
   EventSetTimer(_Period);                                 // Установка Таймера

//-----------------------------------------------------------------------------------------------------------
   
   SetIndexBuffer(0,Max_1,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   SetIndexBuffer(1,Min_1,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   
   PlotIndexSetInteger(0,PLOT_ARROW,159);                  // Установка кода символа для PLOT_ARROW
   PlotIndexSetInteger(1,PLOT_ARROW,159);                  // Установка кода символа для PLOT_ARROW
   
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-10);            // Установка сдвига символа в пикселях
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,10);             // Установка сдвига символа в пикселях
    
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);               // Установка пустого значения
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);               // Установка пустого значения

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

   SetIndexBuffer(2,Max_0,INDICATOR_CALCULATIONS);                   // Присвоение индикаторного массива буферу
   SetIndexBuffer(3,Min_0,INDICATOR_CALCULATIONS);                   // Присвоение индикаторного массива буферу
   
   ArraySetAsSeries(Max_0,true);                                     // Установка индексаци массива как в таймсерии
   ArraySetAsSeries(Min_0,true);                                     // Установка индексаци массива как в таймсерии
   
//--------------------------------Инициализация массивов-----------------------------------------------------
   
   return(INIT_SUCCEEDED);

  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnCalculate                                     |
//+---------------------------------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,                     // Всего баров
                const int prev_calculated,                 // Расчитаных баров
                const datetime &time[],                    // Время открытия
                const double &open[],                      // Цена открытия
                const double &high[],                      // Максимальная цена
                const double &low[],                       // Минимальная цена
                const double &close[],                     // Цена закрытия
                const long &tick_volume[],                 // Тиковый объем
                const long &volume[],                      // Объем
                const int &spread[])                       // Спред
  {
//--------------------------------Объявление переменных------------------------------------------------------

 int i0, i_1max, i_1min, i_1maxH=0, i_1minH=0;                                 // Индексы
 
 int Max_1Index=0, Min_1Index=0;                                               // Индексы максимальных и минимальных баров

 int Step_0, Step_1max, Step_1min;                                             // Шаги циклов
 
 int Start_1max, Start_1min;                                                   // Стартовая позиция
 
 int Stop_1maxA=0, Stop_1minA=0, Stop_1maxB=0, Stop_1minB=0;                   // Ограничитель дальнейших действий
 
 int Shift_max1=0, Shift_min1=0;                                               // Шифты
 
 int TotalMax_0=0, TotalMin_0=0;                                               // Всего баров в нулевых массивах
 int TotalMax_1=0, TotalMin_1=0;                                               // Всего баров в массивах 1-го уровня
 
 int imax_0=0, imin_0=0, imax_1=0, imin_1=0;                                   // Инициализаторы массивов

 
//--------------------------------Расчет 0-го уровня индикатора----------------------------------------------

  if(prev_calculated<4) Step_0=1;                                              // Если расчетов еще небыло Step_0=1
  else Step_0=rates_total-3;                                                   // Если расчеты уже были Step_0=rates_total-3
  
  for(i0=Step_0;i0<rates_total-2;i0++)                                         // Цикл для расчетов
    {
     if (high[i0+1]<high[i0] && high[i0]>=high[i0-1]) Max_0[i0]=high[i0];      // Присвоение значения массиву Max_0
     else Max_0[i0]=0;                                                         // Присвоение 0 значения массиву
     TotalMax_0=ArrayRange(Max_0,imax_0);                                      // Всего баров в массиве Max_0
         
     if (low[i0+1]>low[i0] && low[i0]<=low[i0-1])     Min_0[i0]=low[i0];       // Присвоение значения массиву Min_0
     else Min_0[i0]=0;                                                         // Присвоение 0 значения массиву
     TotalMin_0=ArrayRange(Min_0,imin_0);                                      // Всего баров в массиве Min_0
    }

//--------------------------------Расчет максимума 1-го уровня индикатора------------------------------------

  if (TotalMax_1<2) Step_1max=1;                                               // Если расчетов еще небыло Step_1max=1
  else Step_1max=TotalMax_0-1;                                                 // Если расчеты уже были Step_1max=TotalMax_0-1
  
  for (i_1max=Step_1max;i_1max<TotalMax_0-1;i_1max++)                          // Главный цикл для заполнения массива Max_1
      {
       if (Max_0[i_1max]>Min_0[i_1max] && Stop_1maxA<1)                        // Нахождение ситуации когда Max_0 больше Min_0
          {
           Start_1max=i_1max;                                                  // Определение стартовой позиции
           Stop_1maxA=1;                                                       // Задается значение пераметру Stop_1maxA
           Stop_1minA=0;                                                       // Задается значение пераметру Stop_1minA
           
           for (i_1maxH=i_1max;Max_0[i_1maxH]>=Min_0[i_1maxH];i_1maxH++)       // Цикл для подсчета к-ва баров
           {Shift_max1++;}                                                     // Подсчет к-ва баров для расчета максимального индекса
           Max_1Index=ArrayMaximum(Max_0,Start_1max,Shift_max1);               // Вычисление максимального индекса
          }
       if (i_1max==Max_1Index) Max_1[i_1max]=Max_0[i_1max];                    // Присвоение значения массиву Max_1
       else Max_1[i_1max]=0;                                                   // Присвоение 0 значения массиву Max_1
       TotalMax_1=ArrayRange(Max_1,imax_1);                                    // Всего баров в массиве Max_1
       
       if (Max_0[i_1max]<Min_0[i_1max] && Stop_1minA<1)                        // Нахождение ситуации когда Max_0 меньше Min_0
          {
           Stop_1maxA=0;                                                       // Изменение параметра Stop_1maxA
           Stop_1minA=1;                                                       // Изменение параметра Stop_1minA
          }
      }

//--------------------------------Расчет минимума 1-го уровня индикатора-------------------------------------

  if (TotalMin_1<2) Step_1min=1;                                               // Если расчетов еще небыло Step_1min=1
  else Step_1min=TotalMin_0-1;                                                 // Если расчеты уже были Step_1min=TotalMin_0-1
  
  for (i_1min=Step_1min;i_1min<TotalMin_0-1;i_1min++)                          // Главный цикл для заполнения массива Min_1
      {
       if (Min_0[i_1min]>Max_0[i_1min] && Stop_1minB<1)                        // Нахождение ситуации когда Min_0 больше Max_0
          {
           Start_1min=i_1min;                                                  // Определение стартовой позиции
           Stop_1minB=1;                                                       // Задается значение пераметру Stop_1minB
           Stop_1maxB=0;                                                       // Задается значение пераметру Stop_1maxB
           
           for (i_1minH=i_1min;Min_0[i_1minH]>=Max_0[i_1minH];i_1minH++)       // Цикл для подсчета к-ва баров
           {Shift_min1++;}                                                     // Подсчет к-ва баров для расчета минимального индекса
           Min_1Index=ArrayMinimum(Min_0,Start_1min,Shift_min1);               // Вычисление максимального индекса
          }
       if (i_1min==Min_1Index) Min_1[i_1min]=Min_0[i_1min];                    // Присвоение значения массиву Min_1
       else Min_1[i_1min]=0;                                                   // Присвоение 0 значения массиву Min_1
       TotalMin_1=ArrayRange(Min_1,imin_1);                                    // Всего баров в массиве Min_1
       
       if (Min_0[i_1min]<Max_0[i_1min] && Stop_1maxB<1)                        // Нахождение ситуации когда Min_0 меньше Max_0
          {
           Stop_1minB=0;                                                       // Изменение параметра Stop_1minB
           Stop_1maxB=1;                                                       // Изменение параметра Stop_1maxB
          }
      }

//--------------------------------------------------------------   
  return(rates_total);
  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события Таймер                                          |
//+---------------------------------------------------------------------------------------------------------+
   void OnTimer(){}
//+---------------------------------------------------------------------------------------------------------+

//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnDeinit                                        |
//+---------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();                                                 // Удаление Таймера
   Print(__FUNCTION__,"_Код причины деинициализации = ",reason);     // Причина деинициализации
  }
 

Помогите пожалуйста.

Ни как не получается создать скрипт  по этой теме вот страница https://www.mql5.com/ru/articles/1368

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Пишем скрипт для сохранения данных с графика в файл *.csv (файл s_ExportChartToCSV_v1.mq4 приложения):

int start(){
   int h=FileOpen(Symbol()+Period()+".csv",FILE_WRITE|FILE_CSV,",");
      for(int i=Bars-1;i>=0;i--){
         FileWrite(h,TimeToStr(Time[i],TIME_DATE),TimeToStr(Time[i],TIME_MINUTES),Open[i],High[i],Low[i],Close[i],Volume[i]);
      }
   FileClose(i);
   return(0);
}

Исполняем скрипт на графиках нестандартных таймфреймов. В результате работы скрипта в каталоге experts/filies получаем стандартные файлы *.csv с данными нестандартных таймфреймов.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Если можно сделаете скрипт

заранее благодарен  

Тестирование экспертов на нестандартных таймфреймах
Тестирование экспертов на нестандартных таймфреймах
  • 2009.05.18
  • Dmitry Fedoseev
  • www.mql5.com
Цена на рынке меняется с достаточно большой частотой, чтобы для технического анализа было удобно пользоваться графиком непосредственного изменения цены, так называемого тикового графика. Для упрощения восприятия изменений цены и обеспечения возможности использования в анализе большие интервалы времени используется отображение графиков в виде...
 

с каких пор в тестере стратегий начал начисляться своп? 

или я не замечал? 

почему бы его не включить в HTML версию отчета? 

 
Vladislav Andruschenko:

с каких пор в тестере стратегий начал начисляться своп? 

или я не замечал? 

почему бы его не включить в HTML версию отчета? 

Всегда так было.

Поэтому результаты тестов при одинаковых настройках бывает немного отличаются из-за изменения свопа. Или результаты в оптимизации и тестах отличаются, если оптимизация долгой была и за это время своп изменился.

 
Sergey Basov:

Всегда так было.

Поэтому результаты тестов при одинаковых настройках бывает немного отличаются из-за изменения свопа. Или результаты в оптимизации и тестах отличаются, если оптимизация долгой была и за это время своп изменился.


никогда не обращал на это внимание! я думал свопа в мт4 в тестере стратегий не было. 

 
Ребя подскажите. не могу в MQL5 для генерации советника найти сигналы по индикатору ADX
 

Всем добрый вечер!

Вопросик такой, В тестере ордер модифицируется без всяких проблем, а вот на демо счёте эта модификация не проходит.

Модифицируется стоплосс. В тестре стоплосс может стоять хоть 1 пункт от текущей цены, а вот на демо счёте даже если ставить стоп на расстоянии спреда + ещё 6-8 пунктов приходится.

MODE_STOPLEVEL=0,  MODE_FREEZELEVEL=0.  ДЦ Альпари.

Подскажите пожалуйста, почему так и как правильно сделать модификацию.

 
Valerius:

Всем добрый вечер!

Вопросик такой, В тестере ордер модифицируется без всяких проблем, а вот на демо счёте эта модификация не проходит.

Модифицируется стоплосс. В тестре стоплосс может стоять хоть 1 пункт от текущей цены, а вот на демо счёте даже если ставить стоп на расстоянии спреда + ещё 6-8 пунктов приходится.

MODE_STOPLEVEL=0,  MODE_FREEZELEVEL=0.  ДЦ Альпари.

Подскажите пожалуйста, почему так и как правильно сделать модификацию.

0 означает плавающий стоп. В тестере спред фиксированный. Если поставили 1 значит 1 будет всегда. А вот в реале он плавает.