从头开始自学MQL5语言 - 页 75

 

大家今天好,心情好

我继续学习MQL5编程语言。我对Vasiliy Sokolov的代码 做了一个小改动,按照专家顾问算法的原意,每天只开一个仓。变化以黄色显示。

最好的问候,弗拉基米尔。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Зададим условия для открытия позиций BUY и SELL
   double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
   price=NormalizeDouble(price,digits);

   if(IsMainPositionOpen() == false && IsTimeForOpen())
     {
      if(TickUP()==(price+point))
         OpenBUY();
      else
        {
         if(TickDOWN()==(price-point))
            OpenSELL();
        }
     }
   if(IsTimeForClose())
      CloseALL();
 
Vasiliy Sokolov:

OnInit块也是想多了,还是写得不太正确。首先,你应该尽量写标识符,而不是数字。返回INIT_SUCCEEDED,而不是-1。第二,这里的开关是过度的。应该使用'如果'或'开关'。首先你必须写一个,然后写另一个--只是油。

第三,我们需要监控所有的账户类型。我们有Demo,然后我们有Real。然后是竞赛。但是,即使没有第三个账户,也应该有一个存根,可以抓住所有其他的变体

可能解释一下例外情况的工作原理会更合理,否则就无法理解为什么对你不知道的东西要有任何控制。

在最夸张的意义上,它应该是这样的。

1.启动一个程序来运行

2.通过算法工作,从两个方向退出来。

a) 是的--算法正确。

b) 错--该算法没有发挥作用

同时,在a)方面的工作意味着这里满足了程序员想要实现的所有选项,而在b)方面则是其他所有的选项,而这并不重要,如果需要或不需要。也就是说,程序员只实现他/她想要的功能,其他的都应该被排除在外。

 
Konstantin:

解释例外情况的工作原理可能更有意义,否则就无法理解为什么你甚至要控制你不知道的东西。

在最夸张的情况下,它应该是这样的。

1.启动一个程序来运行

2.通过算法工作,从两个方向退出来。

a) 是的--算法正确。

b) 错--该算法没有发挥作用

同时,在a)方面的工作意味着这里满足了程序员想要实现的所有选项,而在b)方面则是其他所有的选项,而这并不重要,如果需要或不需要。也就是说,程序员只实现他或她插入的功能,而其他的东西都应该作为异常抛出。

你好,康斯坦丁!谢谢你的澄清。

亲爱的参与者我 想再次感谢你们所有的建设性建议和意见,这些建议和意见对我学习MQL5编程语言 很有帮助。

现在我暂停了,因为我的主要工作不允许我把很多时间和注意力放在自学上,但现在主要的结果已经达到了--我理解了编程的基本原理,阅读了第三方代码并编写了自己的功能。

我将公布 Trailing_Stop (v.1).mq5 专家顾问的版本,并对每行代码进行详细的评论,以编程学校一年级学生可以接受的形式公布,正如我之前承诺的那样,但要晚一点。

问候,弗拉基米尔。

 

大家今天好,心情好

我继续学习MQL5编程语言。最后,我有足够的时间来写一个版本的专家顾问,在每一行代码上都有详细的评论,其形式可供编程学校的一年级学生使用。由于专家顾问的代码相当庞大,我将其作为一个文件发布,名为Trailing_Stop_gv.22.mq5。

在发布代码之前,我们在策略测试器中检查了专家顾问。没有发现问题。专家顾问中使用的是净值化的头寸核算系统。这种会计制度意味着在账户的一个时间点上,只能有一个相同符号(证券)的未平仓头寸。

在这个时间点上,专家顾问已经实现了以下能力。

  1. 检查交易账户,你打算在上面安装它。如果专家顾问将被安装在一个模拟账户上,那么在信息框中会出现继续工作的许可。如果试图将专家顾问安装到真实账户,信息窗口将显示警告,说它不能继续工作,然后它将从交易终端的工作窗口自动删除。
  2. 一个交易日,在莫斯科时间上午9点整,自动在第一个刻度线的方向上开一个头寸。例如,如果在莫斯科时间上午9点,第一个刻度线是向上的,那么买入头寸将被打开;如果第一个刻度线是向下的,那么卖出头寸将被打开。
  3. 设置地段大小。
  4. 设置止损大小。
  5. 指定相对于开盘价的水平,在此水平上,止损被移至盈亏平衡点。
  6. 设置止损的尾随步骤。

这个版本的专家顾问实现了瓦西里-索科洛夫之前建议的大部分提示

警告!!!

这个专家顾问是根据模拟账户的自学计划开发的,它只用于培训目的!它不是用来在真实账户上进行交易和盈利的!

真诚的,弗拉基米尔。

附加的文件:
 
MrBrooklin:

大家今天好,心情好

我继续学习MQL5编程语言。最后,我有足够的时间来写一个版本的专家顾问,在每一行代码上都有详细的评论,其形式可供编程学校的一年级学生使用。由于专家顾问的代码相当繁琐,我将其作为一个名为Trailing_Stop(v.2).mq5 的文件发布

在发布代码之前,我们在策略测试器中检查了专家顾问。没有发现问题。专家顾问中使用的是净值化的头寸核算系统。这种会计制度意味着在账户的一个时间点上,同一符号(金融工具)只能有一个未结头寸。

在这个时间点上,专家顾问已经实现了以下能力。

  1. 检查交易账户,你打算在上面安装它。如果专家顾问将被安装在一个模拟账户上,那么在信息框中会出现继续工作的许可。如果试图将专家顾问安装到真实账户,信息窗口将显示警告,说它不能继续工作,然后它将从交易终端的工作窗口自动删除。
  2. 每个交易日,在莫斯科时间上午9点整,自动在第一个刻度的方向上建立一个头寸。例如,如果在莫斯科时间上午9点,第一个刻度线是向上的,那么买入头寸将被打开;如果第一个刻度线是向下的,那么卖出头寸将被打开。
  3. 设置地段大小。
  4. 设置止损大小。
  5. 指定相对于开盘价的水平,在此水平上,止损被移至盈亏平衡点。
  6. 设置止损的尾随步骤。

这个版本的专家顾问实现了瓦西里-索科洛夫之前建议的大部分提示

警告!!!

这个专家顾问是根据模拟账户的自学计划开发的,它只用于培训目的!它不是用来在真实账户上进行交易和盈利的!

真诚的,弗拉基米尔。

你好! - 它不能编译。

拖曳_停顿_gv.22.mq5

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

想通了--不含括号的名称创建Trailing_Stop(v.2) 专家顾问

 
SanAlex:

你好!--它不能编译。

你好!刚刚从网站上下载了文件,并在我的MetaEditor中进行了检查,一切编译正常。

问候,弗拉基米尔。

 
MrBrooklin:

你好!刚刚从网站上下载了文件,并在我的MetaEditor中进行了检查,一切编译正常。

问候,弗拉基米尔。

谢谢你的工作。我在创建专家顾问时没有正确输入名称。

 
SanAlex:

谢谢你的工作。我在创建专家时没有正确地输入名字,一切都正常。

我的荣幸!

问候,弗拉基米尔。

 

亲爱的参与者

我想再次感谢你们所有的建设性建议、提示和意见,这有助于我学习MQL5编程语言的 基础知识。特别感谢Vasily Sokolov!上帝保佑你们所有人!

向大家致以崇高的敬意,弗拉基米尔。

 

大家今天好,心情好

我继续学习MQL5编程语言。我目前正在为一个新的EA编写代码。我面临着一个问题,我不完全了解如何解决。任务似乎很简单--我想让我的专家顾问在货币对的图表上工作,这是在EA的输入参数中设置的。如果我们试图(例如,错误地)将其安装在另一个货币对的图表上,专家顾问应该发出无法继续工作的警告。

以下是程序代码的概要。

input string Symbol_Main="GBPUSDrfd";  //Валютная пара, на которую ставим советник

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   /* Определим график валютной пары, на который будем устанавливать советник*/
   string currency_chart=SymbolInfoString(Symbol(),SYMBOL_DESCRIPTION);
   if(currency_chart==Symbol_Main) //если график валютной пары совпадает со входным параметром
     {
      /* выводим окно сообщений на торговом терминале и продолжаем работу советника */
      MessageBox("Работа советника на данной валютной паре разрешена!");
      return(INIT_SUCCEEDED); //возвращаем для функции OnInit значение означающее "удачная инициализация"
     }
   else //в противном случае, если график валютной пары не совпадает со входным параметром
     {
      /* выводим окно сообщений на торговом терминале и закрываем советник */
      MessageBox("Работа советника на данной валютной паре запрещена! Выходим!");
      return(INIT_FAILED); //возвращаем для функции OnInit значение означающее "неудачная инициализация"
     }
  }

编译器没有显示任何错误。不起作用的代码用黄色标出。也许这是因为我不太理解 SYMBOL_DESCRIPTION 标识符的含义 -- 字符的字符串描述我试图使用其他标识符,但结果是一样的。也许, 这里根本就不需要SymbolInfoString() 函数 ?我写了货币对GBPUSDrfd 的名字,只是因为我打算使用Alpha-Forex的专家顾问,而这个经纪商的所有符号都以rfd 结尾。

尊敬的专家顾问,请告诉我应该朝什么方向思考!?

问候,弗拉基米尔。