被错误困扰的是没有交易业务 - 页 14

 
Maxim Kuznetsov:

想一想,在 "停止 "会发生什么。(你已经有了Margin Call,Steppe比以前更接近了)

你的交易将被强行平仓,但你忽略了这样一个选项,你会在每一个刻度线上 寻找它(在历史上,它很长)并发送错误的订单。

只是为那些有 "超过10年的MQL编程 "的人补充一下

如果事情能够发生,它肯定会发生。

暂停交易和追加保证金并不那么正常,但这是很自然的,EA应该为它们做好准备。

交易条件可能会改变,它们不是恒定的。StopLevel跳跃,甚至有时会改变杠杆率。

用户可以很容易地设置/改变止损/止盈或平仓,甚至是无意的 - 专家顾问应该对此作出反应。

用户可以用Magic开仓/平仓(或者不小心把Magic=0,用手交易)--机器人会怎么做?

在不重新启动EA的情况下,余额被存入/提取--机器人能够做到这一点是非常重要的(最近有一个话题--一个人刚刚输了钱)

终端可能会重新启动,并需要很长的时间来更新,或者连接可能会失去相当长的时间 - 所有这些和离线发生的一切都应该被考虑在内

验证器只检查1-2%的 "最低限度的候选人",人们仍然抱怨...

 
Renat Akhtyamov:

似乎是按顺序写的,问题-答案

该主题的所有页面都可以访问。

雷纳特,我理解你在计算认股权证。我不明白为什么?


Maxim Kuznetsov:

只是为每个有 "超过10年的MQL编程 "的人补充。

如果事情能够发生,它肯定会发生。

跌停和补仓不是那么正常,但这是很自然的,EA必须为它们做好准备。

交易条件可能会改变,它们不是恒定的。StopLevel跳跃,甚至有时会改变杠杆率。

用户可以很容易地设置/改变止损/止盈或平仓,甚至是无意的 - 专家顾问应该对此作出反应。

用户可以用Magic开仓/平仓(或者不小心把Magic=0,用手交易)--机器人会怎么做?

在不重新启动EA的情况下,余额被存入/提取--机器人能够做到这一点是非常重要的(最近有一个话题--一个人刚刚输了钱)

终端可能会重新启动,并需要很长的时间来更新,或者连接可能会失去相当长的时间 - 所有这些和离线发生的一切都应该被考虑在内

验证器只被1-2%的 "最低限度的候选人 "检查,人们仍然抱怨......

马克西姆,你在说什么?我曾征求过什么建议,当我得到一个停止的时候该怎么办。从第6页开始阅读论坛,在我看来,我已经非常详细地阐述了我的问题。

 
Andrey Kaunov:

雷纳特,我理解你在计算认股权证。我不明白为什么?


马克西姆,你在说什么?我是否征求过关于如何处理停业的建议?阅读论坛的第6页,我想我已经很详细地阐述了我的问题。

因为现实中的门票不是0,,,,N

 
哦,你是说我的小代码。所以有什么样的票并不重要。雷纳特有一个二维数组。在单元格[0]中,它写了一张票,而在单元格[1]中,它计算了订单。我们可以用不同的变量来做,但我决定用这种方式做。
 
Andrey Kaunov:

雷纳特,我理解你在计算认股权证。我不明白为什么?


马克西姆,你在说什么?我是否征求过关于如何处理停业的建议?从第6页开始阅读论坛,在我看来,我已经非常详细地陈述了我的问题。

以你10年的经验,我可以给你什么建议......原则上没有什么:-)

你无视我的建议,要求为你的EA提供验证器。

---

你在NZDUSD上得到一个止损,一个订单被关闭,你的EA的逻辑并不重要,你仍然选择它并发送OrderClose,你得到的是假的。这个惊人的操作在每一次打勾 时都会重复,整个过程都会变慢,检查被取消。而这是在最简单的层面上。

关于贸易条件检查--见前14页

 
Andrey Kaunov:

请注意你的这个帖子。

关于交易、自动交易系统和交易策略测试的论坛

厌倦了没有交易业务的错误

Andrey Kaunov, 2020.07.25 11:42

我会试试的,雷纳特,谢谢你的提示。

弗拉基米尔,你能建设性地理解这个问题吗?我不是要检查该地段的保证金等吗?哪些检查必须通过...... "这篇文章对我来说已经像一本圣经 了。我在上面发布了代码片段。我已经根据你在文章中的建议修改了代码,完全符合要求。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

但我仍然得到 "没有交易"。

好吧,如果函数总是发送0.0手并且不允许打开交易,我把它改为发送最小手数。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

而我得到的历史记录显示,交易确实发生了(见下面的屏幕截图)。但是,最低的一批当然来的很奇怪,但是让它来吧。但交易是存在的!

这种情况是非常奇怪的验证器,使得最低手数为0.2,存款为1美元。


自然,不会有任何交易!而 这是用一个完全足够的代码。顺便说一下,我已经删除了指标等的所有条件,以便测试。专家顾问一启动,交易就开始了。

那么,验证器是做什么的?我认为到目前为止,它所做的唯一一件事就是让程序员们大吃一惊!

请注意,我没有要求改变验证器中的任何东西。我们可以简单地看到测试日志。我们将了解测试是在什么参数下运行的,以及在什么存款上。最后,我们至少可以用打印来检查代码中的错误所在,并尽可能快地修复它。我们不会在整整一个星期内将手指指向天空,只试图将一个错误定位。我们不是在对着干,是吗?我理解,我们正在努力共同赚取一些东西。

你的第一张截图。你已经附和着说NZDUSD没有交易的信息。而在14页中,你一直在与这个磨坊争吵。

但第一张截图中的主要错误不是这个。它是通知你在英镑兑美元上测试时间过长。由于测试持续时间太长,验证器暂停了测试。

在GBPUSD,M30上运行代码分析器,让它交易三小时。然后看一下瓶颈,并解决它们。

 
Maxim Kuznetsov:


---

你在NZDUSD上有一个止损,你已经关闭了一个订单,你的EA的逻辑并不关心,你仍然选择它并发送OrderClose,你得到的是假的。这 个惊人的操作在每一次打勾 时都会重复,整个过程都会变慢,检查被取消。而这是在最简单的情况下。

关于检查贸易条件--见前14页。

马克西姆,你在阅读代码时很不专心。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

如果订单被关闭,标记中提到的条件不会让OrderClose()函数跑掉,这是第一件事。其次,如果在NZDUSD上至少有一个订单是开放的,验证器就不会返回 "没有交易"。

Artyom Trishkin:

...

在GBPUSD,M30上运行代码分析器,让它交易三小时。然后看一下瓶颈,并解决它们。

好的,阿尔乔姆。我会试一试的。

 
Andrey Kaunov:

马克西姆,你读代码的时候很不专心。

标记所指定的条件不会让OrderClose()函数逃脱,这是第一件事。其次,如果在NZDUSD上至少有一个订单被打开,验证器就不会返回 "没有交易"。


坦率地说,我已经厌倦了充当歪曲代码的调试员,并试图与作者的自信心作斗争。指定的错误就在那里,自己看吧

如果你不知道该怎么做,你将不得不为自己的利益做一些事情。验证器与此无关

 
马克西姆,我不是要求你个人去调试什么。代码是歪的,很好,但它通过了验证。这个问题是完全不同的。
 
Artyom Trishkin:

...

在GBPUSD,M30上运行代码分析器,让它交易三个小时。然后看到瓶颈并解决它们。

Artyom,代码分析器 没有显示任何瓶颈。整个代码运行平稳,没有任何病态的漫长过程。

这整个故事的底线是这样的。不管是用什么方法,我终于通过了验证。它完全不依赖于代码(如果它是正确的,没有任何明显的错误,正如本文中提到的)。验证器是如何工作的,显然只有其创造者知道。代码在2次后被检查,然后在第三次时被检查。有时它连续通过几次,有时根本没有。更重要的是,我只改变输入参数(这些参数并不关键),或者转移重新排列时不会改变任何东西的行,甚至删除或添加注释(这些注释不应该以任何方式影响工作文件)。

一般来说,通过或失败的验证,只取决于 "心情 "验证器(网络中的电压,某种电力流,或谁知道其他什么)。因此,在通常的测试器中,正常参数下的代码从未挂起,也没有出现任何故障,在任何对和TF 上都是如此。