文章 "6 步创建您自己的交易机器人!"

 

新文章 6 步创建您自己的交易机器人!已发布:

如果您不清楚交易类如何构造,而且一看到面向对象编程之类的词就害怕,那么,本文正适合您。实际上,那些编写您自己的交易信号模块的细节,您无需知道。只需遵循几条简单法则即可。MQL5 向导会完成所有其余工作,而您则会得到一个即用型的交易机器人!

 

作者:MetaQuotes Software Corp.

[删除]  
一切都会好起来的--只需点击 5 次鼠标就可以创建交易机器人,可以在оптимизации параметров 交易系统的测试器中对其进行测试,可以将生成的机器人放到您的账户上进行交易,而且不需要修改任何文件。
这样的机器人可以进行交易吗?毕竟,交易类库不包含对各种错误的处理,而这即使在锦标赛中也是必要条件,更不用说在实际交易中了。更正确的说法是,您只需点击五下即可创建一个智能交易系统,以便在测试器中快速检查想法,但这样的智能交易系统不适合用于交易。
 
感谢您的工作!谢谢你提供的盒子和方块的图片!系统化 :-)
 

继续...

我想到了转换这个示例的行数:

if(m_method_fast!=MODE_SMA&& m_method_fast!=MODE_EMA&& m_method_fast!=MODE_SMMA&& m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

进入算法:

1) 两个数组:

第一个数组包含 m_method_fast 和 m_method_slow

第二个数组 包含ENUM_MA_METHOD 枚举 值。

2) 在一个循环中,取第一个数组的值,检查是否在第二个数组中找到该值。

您能告诉我如何实现这一点吗?

我知道有必要连接 CArray。但是什么类型呢?

请问谁能写出一部分代码,因为初级的基础知识和语法我还不会。

谢谢!

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих - Документация по MQL5
 
bivmail:

继续...

我想到了转换这个示例的行数:

if(m_method_fast!=MODE_SMA&& m_method_fast!=MODE_EMA&& m_method_fast!=MODE_SMMA&& m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

进入算法:

1) 两个数组:

第一个数组包含 m_method_fast 和 m_method_slow

第二个数组 包含ENUM_MA_METHOD 枚举 值。

2) 在一个循环中,取第一个数组的值,检查是否在第二个数组中找到该值。

您能告诉我如何实现这一点吗?

我知道有必要连接 CArray。但是什么类型呢?

请问谁能写出一部分代码,因为初级的基础知识和语法我还不会。

谢谢!

像这样

func(int& array1[],int& array2[])
  {
   int total1=ArraySize(array1);
   int total2=ArraySize(array2);
//---
   for(int i=0;i<total1;i++)
     {
      for(int j=0;j<total2;j++)
        {
         if(array1[i]==array2[j])
           {
            // 找到了
           }
        }
     }
  }
 

是的,我在《C++ 入门》中已经讲到这一点了 :-)

除了没有 ENUM_MA_METHOD 这种数据类型之外

我怎样才能知道这个枚举包含什么类型的数据?是否可以循环ENUM_MA_METHOD枚举 本身?

我现在看到两种方法:

//描述两个数组的第一种方法

  ENUM_MA_METHOD l_array_enum_ma_method[3];

  l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

  print("array size %d", ArraySize(l_array_enum_ma_method));

  print("ENUM_MA_METHOD size %d", ArraySize(ENUM_MA_METHOD));

  

   ENUM_MA_METHOD l_array_select_method[1];

   l_array_select_method[0]=m_MethodFast;

   l_array_select_method[1]=m_MethodSlow;

   //根据计划进一步

   

   //第二种方法,连接图书馆

   //#include <Arrays\ArrayInt.mqh>

     CArrayInt *l_array_enum_ma_method=new CArrayInt;

   l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

   l_array_enum_ma_method.Sort();

   //--- 搜索元素

   if(l_array_enum_ma_method.Search(m_MethodFast)!=-1) printf("Element found");

   else                        printf("Element not found");

   //--- 删除数组

   delete l_array_enum_ma_method;

第二种方法需要连接特定类型的库,而 ENUM_MA_METHOD 是什么类型?

嗯......奇怪,我点击了回复,结果是一个新的帖子....

 
查看如何正确插入代码
 
bivmail:

是的,我在《C++ 入门》中已经讲到这一点了 :-)

除了没有 ENUM_MA_METHOD 这种数据类型之外

我怎样才能知道这个枚举包含什么类型的数据?是否可以循环ENUM_MA_METHOD枚举 本身?

我现在看到两种方法:

第二种方法需要连接特定类型的库,而 ENUM_MA_METHOD 是什么类型?

嗯......奇怪,我点击了回复,结果是一个新的帖子....

第一种方法

 ENUM_MA_METHOD l_array_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};
//--- 再往下

第二种方法

#include <Arrays\ArrayInt.mqh>

CArrayInt l_array_enum_ma_method;
//---
l_array_enum_ma_method.Add(MODE_SMA);
l_array_enum_ma_method.Add(MODE_EMA);
l_array_enum_ma_method.Add(MODE_SMMA);
l_array_enum_ma_method.Add(MODE_LWMA);
//--- 再往下

我不明白为什么需要这么多步骤?

 

哎呀......非常感谢,这就是我想做的......关。

在第一种情况下,我已经看到了这种记录方式,但我还没有意识到我需要什么、

至于第二种情况,我对 ArrayInt 感到困惑。我以为既然是 Int,就意味着只存储数值,但 、

编译器似乎将 MODE_SMA 转换成了数字,而在取回数值时,有必要将其隐式转换(使用括号)为类型(ENUM_MA_METHOD),即类似下面的内容。

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

附注:在第三节 3.参数设置方法 中,我们应该删除过早声明的行,我认为

 CiCustom          m_fast_ma;        // 指标作为一个对象
   CiCustom          m_slow_ma;        // 指标作为一个对象
 
bivmail:

附注:在第三节 3.参数设置方法 中,我认为应该删除过早声明的行:

已删除,谢谢。
 

我正兴奋不已,但却无法解决这个问题(通讯--我读到过内存地址转移的信息,但也没有用):

编译器返回错误信息 "m_MethodFast" - 需要常量表达式,"m_MethodSlow" - 需要常量表达式。

当然,这些都是傻瓜才会问的问题。也许我应该在另一个主题中提出这样的问题,这样就不会堵塞这篇文章了?

//描述两个数组的第一种方法
//int *Finger_m_MethodFast;
//int *Finger_m_MethodSlow;
//Finger_m_MethodFast=&m_MethodFast;
//Finger_m_MethodFast=&m_MethodSlow;
// int l_array1_select_method[]={Finger_m_MethodFast,Finger_m_MethodFast};
   ENUM_MA_METHOD l_array1_select_method[]={m_MethodFast,m_MethodSlow};
   ENUM_MA_METHOD l_array2_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};

   int total_array1=ArraySize(l_array1_select_method);
   int total_array2=ArraySize(l_array2_enum_ma_method);
   bool NoErrorsFlag=false;
   for(int i_array1=0;i_array1<total_array1;i_array1++)
     {

      for(int i_array2=0;i_array2<total_array2;i_array2++)
        {
         if(l_array1_select_method[i_array1]=l_array2_enum_ma_method[i_array2])
           {
            NoErrorsFlag=true;
           }
        }
      if(!NoErrorsFlag)
        {
         PrintFormat("平滑类型 %s 移动平均无效!",EnumToString(l_array1_select_method[i_array1]));
        }

     }

   if(!NoErrorsFlag)
     {
      return(false);
     }