新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 483

 
2047728:
你好,我已经开始使用2013年的视频教程学习MQL4。 我正在完全按照视频改写代码,加入了另一个视频的一些小改动,结果我有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:

你好,我已经开始使用2013年的视频教程学习MQL4,我一直在完全按照视频改写代码,从另一个视频中添加一些小改动,因为我需要它们。 结果我得到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);
}

在非标准时间段的图表上执行脚本。脚本运行的结果是,我们收到了标准的*.csv文件,其中有非标准的时间框架数据,在目录 experts/filies 中。

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

预先感谢

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

从什么时候开始,策略测试器 开始收取交换费用了?

还是我没有注意到?

为什么不把它包括在报告的HTML版本中?

 
Vladislav Andruschenko:

从什么时候开始,策略测试器 开始收取交换费用了?

还是我没有注意到?

为什么不把它包括在报告的HTML版本中?

它一直都是这样。

这就是为什么相同设置的测试结果可能因交换变化而略有不同。或者优化和测试的结果不同,如果优化的时间很长,而且在这段时间内交换发生了变化。

 
Sergey Basov:

这种情况一直存在。

这就是为什么相同设置的测试结果可能因交换变化而略有不同。或者在优化和测试中的结果不同,如果优化时间长,而交换在这段时间内发生了变化。


我从来没有注意到这一点!我以为在mt4的策略 测试器中没有交换。

 
我在MQL5中找不到用于生成EA的ADX指标信号,请告知。
 

大家晚上好!

在策略测试器中,订单的修改没有任何问题,但在模拟账户中,这种修改却不起作用。

止损被修改。在测试器中,止损可以离当前价格 只有1个点,但在模拟账户中,即使我们将止损设置在点差+6-8个点的距离上。

mode_stoplevel=0, mode_freezelevel=0。

请告知原因和如何做正确的修改。

 
Valerius:

大家晚上好!

在策略测试器中,订单的修改没有任何问题,但在模拟账户中,这种修改却不起作用。

止损被修改。在测试器中,止损可以离当前价格 只有1个点,但在模拟账户中,即使我们将止损设置在点差+6-8个点的距离上。

mode_stoplevel=0, mode_freezelevel=0。

请告知原因和如何做正确的修改。

0表示一个浮动的停止。在测试器中,传播是固定的。如果你设置了1,那么1就会一直存在。但在现实生活中,它是浮动的。