如何开始使用MQL5

弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209

该线程讨论MQL5代码示例。将会有一些示例,这些示例说明了如何从指标中获取数据,如何对顾问程序进行编程……通常,从初学者到MQL5语言的任何问题。


如果您刚刚开始熟悉MetaTrader 5终端,那么我可以推荐以下主题:

弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2018.12.24 20:46:59  

这是我最近被问到的问题:如何从 iBearsPower 指示符?

在显示代码之前,我将从使用MQL5 EA河北体彩指标的要点开始:

步骤1:在全局程序级别,我们声明一个变量-iBearsPower指示器的句柄将存储在此变量中。

步骤2:在OnInit()中,我们创建iBearsPower指标并将句柄写入变量。注意:指标是在OnInit()中创建的。

步骤3:在OnTick()中,我们从指标中获取数据


代码中的CodeBase中有一个示例 我的系统 .

步骤1:

double ExtStopLoss=0.0;
double ExtTakeProfit=0.0;

int    handle_iBullsPower;          // variable for storing the handle of the iBullsPower indicator 
int    handle_iBearsPower;          // variable for storing the handle of the iBearsPower indicator 

double m_adjusted_point;            // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()


第2步:

     }
//--- create handle of the indicator iBearsPower
   handle_iBearsPower=iBearsPower(m_symbol.Name(),Period(),Inp_ma_period);
//--- if the handle is not created 
   if(handle_iBearsPower==INVALID_HANDLE)
     {
      //--- tell about the failure  和  output the error code 
      PrintFormat("Failed to create handle of the iBearsPower indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)


第三步:

   double bulls[];
   ArraySetAsSeries(bulls,true);
   double bears[];
   ArraySetAsSeries(bears,true);
   if(!iBullsPowerGetArray(InpBarCurrent,2,bulls) || !iBearsPowerGetArray(InpBarCurrent,2,bears))
     {
      PrevBars=0;
      return;

     }


功能 iBearsPowerGetArray: is used 复制缓冲区

//+------------------------------------------------------------------+
//| Get value of buffers for the iBearsPower in the array            |
//+------------------------------------------------------------------+
bool iBearsPowerGetArray(const int start_pos,const int count,double &arr_buffer[])
  {
//---
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      Print("This a no dynamic array!");
      return(false);
     }
   ArrayFree(arr_buffer);
   int       buffer_num=0;          // 指标缓冲区 number 
//--- reset error code 
   ResetLastError();
//--- fill a part of the iBearsPower array with values from the 指标缓冲区 that has 0 index 
   int copied=复制缓冲区(handle_iBearsPower,buffer_num,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iBearsPower indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(false);
     }
   return(result);
  }
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2018.12.25 08:04:38  

如何从几个符号的指标中接收数据。

一切都非常简单!首先,您需要在输入参数中指定字符的名称。它仍然 创建手柄 这些符号上的指示器。

因此,EA河北体彩从当前河北体彩品种和另外一个河北体彩品种接收数据( 符号1 ),平均周期在 公牛力量 参数:

 //--- input parameters 
 input string    InpSybmol_1 = "USDJPY" ;           //  符号1  (non-existent symbol -> parameter is disabled) 
 input int       Inp_BullsPower_ma_period   = 5 ;   // 公牛力量 : averaging period  


在全局程序变量的字段中,我们创建两个变量-Bulls Power指标的句柄将存储在其中:

 //--- 
 int      handle_iBullsPower_current ;               // variable for storing the handle of the iBullsPower indicator 

 int      handle_iBullsPower_symbol_1 ;             // variable for storing the handle of the iBullsPower indicator 
 int     m_digits_symbol_1;

m_digits_symbol_1 是辅助变量,它存储用于 符号1 .


创建句柄与检查符号相结合:如果存在符号,则创建一个句柄:

 //+------------------------------------------------------------------+ 
 //| Expert initialization function                                   | 
 //+------------------------------------------------------------------+ 
 int OnInit ()
  {
 //--- 
   handle_iBullsPower_symbol_1= INVALID_HANDLE ;
   m_digits_symbol_1= 0 ;
   if (m_symbol.Name(InpSybmol_1)) // sets symbol name 
     {
      m_digits_symbol_1=m_symbol. Digits ();
      CreateBullsPower(handle_iBullsPower_symbol_1,m_symbol.Name(), Period (),Inp_BullsPower_ma_period);
     }

   handle_iBullsPower_current= INVALID_HANDLE ;
   if (m_symbol.Name( Symbol ())) // sets symbol name 
      CreateBullsPower(handle_iBullsPower_current,m_symbol.Name(), Period (),Inp_BullsPower_ma_period);
 //--- 
   return ( INIT_SUCCEEDED );
  }

在CreateBullsPower函数中创建句柄:

 //+------------------------------------------------------------------+ 
 //| Create 公牛力量                                               | 
 //+------------------------------------------------------------------+ 
 bool CreateBullsPower( int                  &handle,     // handle of the indicator 
                       const      string      symbol,     // symbol name  
                       ENUM_TIMEFRAMES      timeframe,   // timeframe  
                       int                  ma_period   // averaging period  
                      )
  {
   handle= INVALID_HANDLE ;
 //--- create handle of the indicator iBullsPower 
   handle= iBullsPower (symbol,timeframe,ma_period);
 //--- if the handle is not created  
   if (handle== INVALID_HANDLE )
     {
       //--- tell about the failure  和  output the error code  
       PrintFormat ( "Failed to create handle of the iBullsPower indicator for the symbol %s/%s, error code %d" ,
                  symbol,
                   EnumToString (timeframe),
                   GetLastError ());
       //--- the indicator is stopped early  
       return ( false );
     }
 //--- 
   return ( true );
  }


它仍然需要从OnTick()中的指标接收数据(我们使用iGetArray函数获取数据)

 //+------------------------------------------------------------------+ 
 //| Expert tick function                                             | 
 //+------------------------------------------------------------------+ 
 void OnTick ()
  {
 //--- 
   string text= "" ;
   double value[];
   ArraySetAsSeries (value, true );
   int buffer= 0 ,start_pos= 0 ,count= 2 ;

   if (handle_iBullsPower_current!= INVALID_HANDLE )
       if (iGetArray(handle_iBullsPower_current,buffer,start_pos,count,value))
        {
         text=text+ "\n" +m_symbol.Name();
         for ( int i= 0 ;i<count;i++)
           {
            text=text+ " #" + IntegerToString (i)+ "+: " + DoubleToString (value[i],m_symbol. Digits ()+ 1 )+ "; " ;
           }
        }
   if (handle_iBullsPower_symbol_1!= INVALID_HANDLE )
       if (iGetArray(handle_iBullsPower_symbol_1,buffer,start_pos,count,value))
        {
         text=text+ "\n" +InpSybmol_1;
         for ( int i= 0 ;i<count;i++)
           {
            text=text+ " #" + IntegerToString (i)+ "+: " + DoubleToString (value[i],m_digits_symbol_1+ 1 )+ "; " ;
           }
        }

   Comment (text);
  }


总:

BullsPower多符号

档案:
 贾哈利
51
贾哈利 2018.12.27 06:43:29  
是否可以将OnInit()部分中的句柄部分移动到OnTick()部分中?
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2018.12.27 07:04:02  
布迪亚里 :
是否可以将OnInit()部分中的句柄部分移动到OnTick()部分中?

必须仅创建句柄。创建句柄最方便的地方是OnInit()。

弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2018.12.27 11:32:20  

使用ZigZag指标的示例。

注意极值搜索算法:如果 指标缓冲区 不等于“ 0.0”且不等于“ PLOT_EMPTY_VALUE”-这意味着我们已检测到极值。


极值搜索转到“ 之字形:要检查多少支蜡烛 吧。


工作标准算法:ONCE在OnInit()中创建一个指标。

//---
int   handle_iCustom;                  // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(Symbol(),Period(),"Examples\\ZigZag",InpDepth,InpDeviation,InptBackstep);
//--- if the handle is not created 
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure  和  output the error code 
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }


接下来,在OnTick()中,我们在使用指标句柄的同时复制了指标数据。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static long counter=0;
   counter++;
   if(counter>=15)
      counter=0;
   else
      return;
//---
   double ZigzagBuffer[];
   ArraySetAsSeries(ZigzagBuffer,true);
   int start_pos=0,count=InpCandlesCheck+1;
   if(!iGetArray(handle_iCustom,0,start_pos,count,ZigzagBuffer))
      return;

   string text="";
   for(int i=0;i<count;i++)
     {
      if(ZigzagBuffer[i]!=PLOT_EMPTY_VALUE && ZigzagBuffer[i]!=0.0)
         text=text+"\n"+IntegerToString(i)+": "+DoubleToString(ZigzagBuffer[i],Digits());
     }
   Comment(text);
  }


复制数据的功能指示符:

//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
double iGetArray(const int handle,const int buffer,const int start_pos,const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      Print("This a no dynamic array!");
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code 
   ResetLastError();
//--- fill a part of the iBands array with values from the 指标缓冲区
   int copied=复制缓冲区(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(false);
     }
   return(result);
  }


工作结果:

使用ZigZag指标的示例

档案:
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2018.12.29 11:03:05  

一个使用 OBJ_HLINE 图形对象。

顾问 OBJ_HLINE跟随价格 有两个参数: 缩进 -从当前价格缩进, 缩进 -从第一行向下缩进:

OBJ_HLINE跟随价格

顾问的工作动画:

OBJ_HLINE跟随价格

Anggono Utomo
123
Anggono Utomo 2019.08.18 07:43:37  
我的想法是使EA没有指标,仅依靠蜡烛和刻度线移动。因此,在新蜡烛形成之初,EA将 分析并计算开盘价的波动。我们分析该位置是否位于N_Tick。如果在10个刻度内 在下面形成的蜡烛 收盘价,如果对面卖,然后买。

我是mql编程的初学者,正在编写代码,我遇到的只是几个问题,用于读取刻度的程序无法运行 完全。如果有人可以纠正我制作的程序,请提供帮助。

谢谢。

void OnTick()
  {
      scanTicks();
         
  }
  
  
bool NewBar(void)
  {
   bool iNewBar=false;
   static double currPeriodProgress=0;

   double lastPeriodProgress=MathMod(TimeCurrent(),PeriodSeconds());

   if(lastPeriodProgress<currPeriodProgress) 
      iNewBar=true;
      currPeriodProgress=lastPeriodProgress;
   return(iNewBar);
  }
  
  
void scanTicks()
   {
            NewBar();
            
            double waktuSekarang;
            
            if(NewBar()==true)
            {
               waktuSekarang=MathMod(TimeCurrent(),PeriodSeconds());
            }
            
            
            MqlTick tick_array[]; 
            
            int copied=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,0,1);
            // Latest loop
            for(int i=copied-1; i>=0;i--) 
            {
                MqlTick tick = tick_array[i]; 

                //debug
                Print("Bid : ", tick.bid, " Ask : ", tick.ask, " Array ", i);
            }
   }
档案:
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2019.08.18 08:29:20  

例:

//+------------------------------------------------------------------+
//|                                                          温度mq5  |
//|                              Copyright © 2019, 弗拉基米尔·卡普托夫(Vladimir Karputov) |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, 弗拉基米尔·卡普托夫(Vladimir Karputov)"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Enum Copy Ticks Flags                                            |
//+------------------------------------------------------------------+
enum ENUM_COPY_TICKS_FLAGS
  {
   info=0,     // COPY_TICKS_INFO
   trade=1,    // COPY_TICKS_TRADE
   all=2,      // COPY_TICKS_ALL
  };
//--- input parameters
input ENUM_COPY_TICKS_FLAGS   InpFlags = trade; // The Copy Ticks Flags: 
input uint                    InpCount = 10;    // The number of ticks that you want to receive 
//---
datetime ExtPrevBars=0;        // "0" -> D'1970.01.01 00:00';
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work  上 ly at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==ExtPrevBars)
      return;
   ExtPrevBars=time_0;
//---
   MqlTick tick_array[];   // Tick receiving array 
//--- Measuring start time before receiving the ticks 
   uint start=GetTickCount();
//--- Requesting the tick history since 1970.01.01 00:00.001 (parameter from=1 ms) 
   int received=CopyTicks(Symbol(),tick_array,InpFlags,(ulong)(TimeCurrent()+60),InpCount);
   if(received!=-1)
     {
      //--- Showing information about the number of ticks  和  spent time 
      PrintFormat("%s: received %d ticks in %d ms",Symbol(),received,GetTickCount()-start);
      //--- If the tick history is synchronized, the error code is equal to zero 
      if(GetLastError()==0)
        {
         int limit=(received>10)?10:received;
         for(int i=0;i<limit;i++)
            Print("Bid : ",tick_array[i].bid," Ask : ",tick_array[i].ask," Array ",i);
        }
      else
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                     _Symbol,received,GetTickCount()-start,_LastError);
     }
  }
//+------------------------------------------------------------------+

结果:

2019.08.18 09:29:02.686 2019.03.11 02:00:00   EURUSD: received 9 ticks in 0 ms
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12343 Ask : 1.1236 Array 0
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12344 Ask : 1.12361 Array 1
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12342 Ask : 1.12359 Array 2
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12343 Ask : 1.1236 Array 3
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12341 Ask : 1.12358 Array 4
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12342 Ask : 1.12359 Array 5
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.1234 Ask : 1.12357 Array 6
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.12341 Ask : 1.12358 Array 7
2019.08.18 09:29:02.686 2019.03.11 02:00:00   Bid : 1.1234 Ask : 1.12357 Array 8
档案:
基思·沃特福德
主持人
26955
基思·沃特福德 2019.08.18 08:53:34  
Anggono Utomo:

不要双重发布!

我已删除您重复的帖子。

弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
227209
弗拉基米尔·卡普托夫(Vladimir Karputov) 2019.08.18 08:55:40  
基思·沃特福德 :

不要双重发布!

我已删除您重复的帖子。

没有人做过双重职务。我做了从一个主题到另一个主题的帖子转移: