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

 
MrBrooklin:

今后,根据自学计划,任务是一步步 修改脚本,即。

  1. 添加止损和止盈。
  2. 添加尾部。
  3. 增加最大的风险。
  4. 扩大未决订单 的范围。
真诚的,弗拉基米尔。
当然很遗憾的是,你没有听从教程的建议。你将学会如何放线、下单等,但无论如何你都无法写出一个策略,因为你没有理论基础。所有这些行和脚本都不能帮助你理解基本的编程东西,没有这些东西你就不能走远。我在头4个月里只是学习,甚至没有尝试写任何东西。当然,我可以像你一样厚颜无耻,但这种知识的质量很低--在基础知识方面有很多空白,将来必须填补......
 
Реter Konow:
当然,你不应该听从辅导员的建议。你可能已经掌握了如何设置线路、订单等知识,但无论如何你都无法制定策略,因为你还没有理论基础。所有这些行和脚本都不能帮助你理解基本的编程东西,没有这些东西你就不能走远。我在头4个月里只是学习,甚至没有尝试写任何东西。当然,我可以像你一样明目张胆地,但这种知识的质量很差。基础知识总是有差距的,这些差距将不得不在未来填补......

你好,彼得!我根据需要学习课本,即当我看到自己的知识差距时。现在,我觉得我将不得不稍作停顿,更仔细地研究教科书。所有来自论坛参与者的建议都被考虑在内,我正在努力坚持。而现在我很惊讶,在这么短的时间内,我竟然只用MQL5参考书 就能写出东西来。

问候,弗拉基米尔。

 
MrBrooklin:

祝大家晚上好,心情好!

我粘贴了一个新的脚本New6.mq5,它可以帮助你在当前图表上与当前价格有一定距离的地方放置一个SellStop和一个BuyStop挂单,并有固定的手数。在这个脚本中,我试图按照我之前的承诺,以清晰易懂的形式描述一切,供一个一年级的程序员参考。

我只在编写脚本时使用了从MQL5参考资料 中获取的信息!

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

这是一个很好的例子。我建议把它作为一个起点。基础知识。

MrBrooklin:

今后,根据自学计划,任务是一步一步 地修改脚本,即

  1. 添加止损和止盈。
  2. 添加尾部。
  3. 增加最大的风险。
  4. 扩大选择挂单
真诚的,弗拉基米尔。

不,不。先不要连接新的功能。现在改进现有的逻辑。同时,摆脱脚本实现中的问题(它们已经显示出来了)。如果你想知道要改写什么,我会告诉你。

 
Vasiliy Sokolov:

这个例子是个好例子。我建议把它作为一个起点。基线。

不,不。先不要插入任何新功能。现在改进现有的逻辑。同时,摆脱脚本实施中的问题(它们已经显示出来了)。你到底需要改写什么,如果你会感兴趣,我会告诉你。

你好,瓦西里!当然,告诉我你需要改写的内容,这对我来说是很有趣的!

问候,弗拉基米尔。

 
MrBrooklin:

你好,瓦西里!当然,告诉我你需要改写什么,我非常感兴趣!

真诚的,弗拉基米尔。

程序员有两个问题:编译器产生的错误和架构问题。当你是一个新手时,你专注于与编译器斗争,而你的最终目标是一个能正确工作的程序。然而,很快,一个初学者的程序就会变成所谓的意大利面条代码,作者自己也无法很快弄清楚。这就是为什么我建议你不要把注意力放在最终脚本的编译器和正确性上,而是放在架构问题上。这就像学习弹钢琴:首先你要学会如何正确地握住手指,正确地坐在琴前,没有人要求初学者弹奏巴赫。

//+------------------------------------------------------------------+
//|                                                         New6.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"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

你有两组参数来决定你的脚本的行为:第一组是静态设置的,作为一个宏。第二个是由用户在图表上加载脚本时 设置的。现在,如果不重新编译这个脚本,用户将无法选择要下的订单的类型。这不是好事。因此,最好放弃这些宏,而采用附加参数。

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

因此,我们定义了一个新的枚举,并将其作为用户的一个选择参数来实现。

 
Vasiliy Sokolov:

程序员有两个问题:编译器错误和架构问题。当你是一个初学者时,你专注于与编译器斗争,你的最终目标是一个能正确工作的程序。然而,很快,一个初学者的程序就会变成所谓的意大利面条代码,作者自己也无法很快弄清楚。这就是为什么我建议你不要把注意力放在最终脚本的编译器和正确性上,而是放在架构问题上。这就像学习弹钢琴:首先你要学会如何正确地握住手指,正确地坐在琴前,没有人要求初学者弹奏巴赫。

你有两组参数来决定你的脚本的行为:第一组是静态设置的,作为一个宏。第二个是由用户在图表上加载脚本时 设置的。现在,如果不重新编译这个脚本,用户将无法选择要下的订单的类型。这不是好事。因此,最好放弃这些宏,而采用附加参数。

因此,我们定义了一个新的枚举,并将其作为用户的一个选择参数来实现。

很好,事实上,你已经提示了我在脚本的逐步 修改步骤 4中所写的内容,即扩大挂单 的选择。

谢谢你!

问候,弗拉基米尔。

 

你的代码的下一个问题是,它蔓延成一个长的程序表。所有的初学者都是这样写的。而这是一个多年来一直伴随着他们的问题。学会将你的算法分成几个部分,从最基本的开始,比如这个脚本。有两种方法可以做到这一点:通过函数和类。类的概念一开始太难掌握了,所以我建议你把重点放在与函数的工作上。思考职能的重要性。

  • 所有在MQL中编写的代码(例如CodeBase中的所有脚本、指标和专家顾问)不是在系统函数内就是在用户函数内。
  • 任何MQL代码都会调用几十个内置的MQL函数。所有与MetaTrader及其交易环境的互动都是通过调用一个系统函数来进行的。
  • 任何不依赖外部参数的函数总是返回相同的结果。这样的功能可以简单地从一个脚本/指标/顾问中复制到另一个脚本/指标/顾问中,并能正常工作。另一方面,复制一段任意的程序性代码是不可能成功的。
  • 你可以编写任何自定义函数,做有用的工作。而通过这样做,它将以你需要的方式扩展标准的MQL功能。例如,你认为:"如果MQL有这样的功能....,那该多酷啊"。- 但为什么不自己写呢?
 
Vasiliy Sokolov:

你的代码的下一个问题是,它蔓延成一个长的程序表。所有的初学者都是这样写的。而这是一个多年来一直伴随着他们的问题。学会将你的算法分成几个部分,从最基本的开始,比如这个脚本。有两种方法可以做到这一点:通过函数和类。类的概念一开始太难掌握了,所以我建议你把重点放在与函数的工作上。思考职能的重要性。

  • 所有在MQL中编写的代码(例如CodeBase中的所有脚本、指标和专家顾问)不是在系统函数内就是在用户函数内。
  • 任何MQL代码都会调用几十个内置的MQL函数。所有与MetaTrader及其交易环境的互动都是通过调用一个系统函数来进行的。
  • 任何不依赖外部参数的函数总是返回相同的结果。这样的功能可以简单地从一个脚本/指标/顾问中复制到另一个脚本/指标/顾问中,并能正常工作。另一方面,复制一段任意的程序性代码是不可能成功的。
  • 你可以编写任何自定义函数,做有用的工作。而通过这样做,它将以你需要的方式扩展标准的MQL功能。例如,你认为:"如果MQL有这样的功能....,那该多酷啊"。- 但为什么不自己写呢?

谢谢你,瓦西里提供了如此全面的建议。我一定会考虑到这一点,并努力做到最好。

问候,弗拉基米尔。

 
Vasiliy Sokolov:

你的代码的下一个问题是,它蔓延成一个长的程序表。所有的初学者都是这样写的。而这是一个多年来一直伴随着他们的问题。学会将你的算法分成几个部分,从最基本的开始,比如这个脚本。有两种方法可以做到这一点:通过函数和类。类的概念一开始太难掌握了,所以我建议你把重点放在与函数的工作上。思考职能的重要性。

  • 所有在MQL中编写的代码(例如CodeBase中的所有脚本、指标和专家顾问)不是在系统函数内就是在用户函数内。
  • 任何MQL代码都会调用几十个内置的MQL函数。所有与MetaTrader及其交易环境的互动都是通过调用这个或那个系统功能进行的。
  • 任何不依赖外部参数的函数总是返回相同的结果。这样的功能可以简单地从一个脚本/指标/顾问中复制到另一个脚本/指标/顾问中,并能正常工作。另一方面,复制一段任意的程序性代码是不可能成功的。
  • 你可以编写任何自定义函数,做有用的工作。而通过这样做,它将以你需要的方式扩展标准的MQL功能。例如,你认为:"如果MQL有这样的功能....,那该多酷啊"。- 但为什么不自己写呢?
瓦西里,这个人甚至还没有掌握阵列的方法。对他来说,现在听这种讲座还太早了)。
 
Реter Konow:
瓦西里,这个人甚至还没有掌握阵列的方法。对他来说,现在听这种讲座还太早了)。

彼得,所有建设性的建议对我来说都是很重要的,包括你的建议。

问候,弗拉基米尔。