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

 
MrBrooklin:

我创建了一个标准模板。这是我开始写代码的地方,在这里我开始发布那些已经写好的片段。我还没有想过用我自己的函数的算法框架,谢谢你的提示!也感谢你对网赚账户的提示!


有这样一种来自识字编程的技术--它可以让你写得非常快、非常明白。

一般来说,以文学的方式,在评论中写出你要做的事情(只是主要的直接顺序)。

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

基本上都是。此外,在每个评论之后,你写一个3-5行(一般来说是一点点)的代码。你的整个功能从开始到结束应该适合你看到的屏幕。如果你得到更多,这意味着必须将片段分离成独立的函数/方法。

当这样一个基本的东西开始在测试器中工作时,你可以归纳,添加现实生活中的条件,例如步骤变化或频率,考虑到市场条件,完美是没有限制的......。

 
Maxim Kuznetsov:

摘要,有一种识字编程技术,可以让你写得非常快和清晰。

一般来说,以文学的方式,在评论中写出你要做的事情(只写主要的直接顺序)。

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

基本上都是。此外,在每个评论之后,你写一个3-5行(一般来说是一点点)的代码。你的整个功能从开始到结束应该适合你看到的屏幕。如果你得到更多,这意味着必须将片段分离成独立的函数/方法。

当这样一个基本的东西开始在测试器中工作时,你可以归纳,添加现实生活中的条件,例如步骤变化或频率,考虑到市场条件,完美是没有限制的......。

你好,马克西姆!你的提示很有帮助。我坐在这里想知道如何填写一个标准的EA模板。

问候,弗拉基米尔。

 
MrBrooklin:

尊敬的编程专家!

请解释两个问题。

  1. 关于魔力号码的第一个问题--它是在输入参数中只为挂单 和未结头寸创建的(还是只为未结头寸?如果答案是 "是",那么应该出于什么目的呢? 我真的被这个问题搞糊涂了,没有一个好答案。
  2. 关于 "神奇数字 "的第二个问题--如果在当前图表中存在不止一个未平仓头寸,那么就可以应用这样的输入参数来确定每个头寸。

也许我对魔数在编程中的应用根本就有误解。

真诚的,弗拉基米尔。

当一个订单被接受执行时,它的所有特征(符号、时间、订单类型、票据)都是由终端分配的(由用户要求,由终端分配),而不是由用户分配的,位置也是如此,位置存储着它的订单信息,但可能有很多。而这个神奇的数字是一个用户标识符。引用。

当我们创建一个新的待处理请求时,我们需要以某种方式标记它--以便程序可以知道这个特定的订单是由NAMI在这个特定的待处理请求上下的--也就是说,我们需要唯一地识别并将一个订单或头寸与一个特定的待处理请求联系起来。

NAMI在意义上是缺失的。然后Artem把订单的分类放到Magik号上。为什么不呢?前2位数字表示什么,例如订单类型,后4位数字表示订单的日期。

关于某物的算法。最初定义初始条件。我们的符号上有订单,我们不考虑它们,或者我们考虑它们。在创建算法时没有初始条件的返工,更有甚者,代码可以是永恒的)

 
Maxim Kuznetsov:

摘要,有一种识字编程技术,可以让你写得非常快和清晰。

一般来说,识字-编程风格,在评论中写出你将做什么(只是主要的直接序列)......

...基本上都是。接下来,在每个评论之后,你写代码3-5(一般来说不多)行。整个功能从开始到结束应该适合你看到的屏幕。如果你得到的更多,就意味着你必须将片段分离成独立的函数/方法。

马克西姆,请你检查一下我的提示是否正确,或者还有什么需要补充的吗?我是指测试部分,因为我还没有写代码。

问候,弗拉基米尔。

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

马克西姆,请看看我是否理解了你的提示,或者还有什么需要补充的吗?我指的是测试部分,除了代码之外。

真诚的,弗拉基米尔。

初始条件。我们计算出我们的符号上有一个位置,我们在图表上看到它。

如果我们有头寸,那就只有一个,要么买,要么卖。因此,我们首先在我们的符号上寻找位置。要求/获得特征。确定头寸类型--买入或卖出。以此类推,贯穿全篇。

 
Valeriy Yastremskiy:

当一个订单被接受执行时,它的所有特征(符号、发行时间、订单类型、票据)都是由终端分配的(由用户要求,由终端分配),而不是由用户分配的,和仓位一样,仓位存储了它的订单信息,但可以有很多。而这个神奇的数字是一个用户标识符。引用。

当我们创建一个新的待处理请求时,我们需要以某种方式标记它--以便程序可以知道这个特定的订单是由NAMI在这个特定的待处理请求上下的--也就是说,我们需要唯一地识别并将一个订单或头寸与一个特定的待处理请求联系起来。

NAMI在意义上是缺失的。然后Artem把订单的分类放到Magik号上。为什么不呢?前2位数字表示什么,例如订单类型,后4位数字表示订单的日期。

关于某物的算法。最初定义初始条件。我们的符号上有订单,我们不考虑它们,或者我们考虑它们。在创建算法时,如果没有初始条件的返工,更有甚者,代码可能要花很长时间)

谢谢你,瓦列里,感谢你的详细答复。很多事情都变得更清晰了。我对这个算法也有同感,但瓦西里已经解释了为什么我们在这个EA中不需要魔数。

问候,Vladimir

 
MrBrooklin:

谢谢你,瓦莱里,感谢你的详细答复。它已经澄清了很多。我对这个算法也有同样的看法,但瓦西里已经解释了为什么我们在这个EA中不需要魔术数字。

真诚的,弗拉基米尔。

我们打开了一个图表,图表符号上有一个头寸,我们不知道它是什么,我们想在盈亏平衡点打开它,然后拖动SL以减少损失,以防价格逆转。

 

在瓦莱里的纠正下,带有评论的EA模板已经有了新的面貌。

问候,弗拉基米尔。

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

弗拉基米尔,你不必长期驾驭它。让我们开始行动吧。我已经为你写了一个所需的拖尾的模板。

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

你所需要做的就是在这些函数中填入与其名称相对应的逻辑。正如你所看到的,该模板是初级的。而且在结构上与《宣言》相似。

注意,这段代码可以编译,也就是说,从编译器的角度来看,它是正确的。始终为这种状态而努力:即在开发过程中做一些小的改动,这样在做完这些改动后,代码就可以编译了。也争取让编译器报告 "0错误,o警告"。很明显,你不能带着错误运行程序,但编译器的警告应该被视为我们父亲的祈祷:如果有警告就必须纠正。这个模板是在"0错误,O警告 " 的情况下制作的--保存这个状态直到开发结束

一旦我们理解了逻辑,我们也理解了编译器,我们需要做的就是给函数配备必要的逻辑。

第二个参数,即跟踪值,将暂时移到下一个版本。这将需要额外的计算。这就是为什么它没有出现在这个模板中。拖网每隔一段时间 就会被拉起来。

 
Vasiliy Sokolov:

弗拉基米尔,你不必长久地驾驭它。让我们开始行动吧。我已经为你写了一个所需的拖尾的模板。

你所需要做的就是在这些函数中填入与其名称相对应的逻辑。正如你所看到的,该模板是初级的。而且在结构上与《宣言》相似。

注意,这段代码可以编译,也就是说,从编译器的角度来看,它是正确的。始终为这种状态而努力:即在开发过程中做一些小的改动,这样在做完这些改动后,代码就可以编译了。也争取让编译器报告 "0错误,O警告"。很明显,你不能在有错误的情况下运行程序,但必须把编译器的警告看作是我们父亲的祈祷:如果有警告,就必须改正。这个模板是以"0错误,O警告 " 制作的--保存这个状态直到开发结束

一旦我们理解了逻辑,也理解了编译器,我们需要做的就是给函数配备我们需要的逻辑。

第二个参数,即跟踪值,将暂时移到下一个版本。这将需要额外的计算。这就是为什么它没有出现在这个模板中。拖网将每隔一段时间 更新一次。

瓦西里,我当然要感谢你做了这么多工作,但这并不能帮助我理解这些函数和运算符的来源,最重要的是,它们为什么会出现。如果能达到写那段代码的目的,那就更正确了,你已经向我建议了。我真的想自己走到这一步,现在我想了。

我明白你和其他许多人一样,厌倦了我不断地拼出所有的代码行,并在现场践踏,但问题是我仍然不明白一切是如何建立的,从算法到代码写作。我必须加上缺乏英语知识的问题,因为我不得不把几乎所有的编译器错误和警告信息,以及其他英语单词复制和粘贴到谷歌翻译器中。顺便说一下,如果有人试图运行我在这个主题中发布的那些微型,甚至纳米级的代码,它们都以"0错误,0警告 " 的方式通过了编译。

现在我需要一些时间来认识,或者说理解为什么会出现这些函数和运算符。因此,简而言之,这是一种无声的恐怖。而当我不理解基本的东西时,我是个坏学生。

谢谢你和所有其他程序员对我的迟钝的容忍。虽 然我意识到你的耐心并不是无止境的。

真诚的,弗拉基米尔。