[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 366

 
lottamer:


没有虱子。

也许是EA内部缺乏规范化,导致了这种效果。

然而,当输入参数 标签出现时,优化本身并没有发生。

测试员做了一些事情,在底部你可以看到当前的过冲数(7/62),但在完成后在标签中的优化结果,和优化图是 空的!这是不可能的。

参数上的复选标记当然是....

我甚至不知道该往哪边看...


测试仪不能用不变的数据提供可重复的结果,因为测试时传播的变化是不知不觉的。

治疗方法:https://www.mql5.com/ru/forum/119830

 
Chiripaha:

空值可能表明优化特定参数的结果是无利可图的--也就是流失。尝试用Visualisation运行其中一个参数,你可能会看到这个结果。

关于归一化,我认为也不会有这样的影响,因为既然数值相同,数学数字也会完全相同--因此没有变化。

至于 "以何种方式思考"--有时最好不要思考,把问题搁置起来--想法和思路会在以后出现。你必须给你的大脑以回旋的余地,休息和思考而不紧张。


1.该顾问是有利可图的。

2.我已经用手检查过了--在参数的整个范围内都是有利可图的。 我只是想把范围扩大一点,让步子变小。

 
tara:


测试员不能用不变的数据提供可重复的结果,因为在测试过程中传播的变化是不可知的。

治疗方法:https://www.mql5.com/ru/forum/119830



差价是浮动的,不是吗?

另一件事是,它必须被巩固在历史上......

总的来说,结果略有浮动,交易数量没有变化......所以这个问题并没有让我感到太害怕......

另一件事是,优化器根本不工作!这很烦人......

这是测试人员在日志中所说的..:



2013.05.29 12:20:10 在优化过程中共进行了8次,有8个结果因不重要而被放弃。

 
tara:


测试员不能用不变的数据提供可重复的结果,因为在测试过程中传播的变化是不知不觉的。

治疗方法:https://www.mql5.com/ru/forum/119830

这也许是可能的,但我的传播尺寸是放在信息中的--当你改变它时,它就会显示出来。在测试器上,我没有注意到传播的浮动。它从经常账户的MarketInfo中获取标准参数数据,并不再改变它。

这种治疗方法改变了价差p-r,因此,你可以看到不同价差的不同优化结果。根据我的理解,这是需要链接中的软件的唯一目的。

 
lottamer:


2013.05.29 12:20:10 在优化过程中共进行了8次,有8个结果因不重要而被放弃。

嗯,这是正确的--这些结果被认为是不重要的而被抛弃了。- 这就是为什么它没有显示在结果或图表中的原因。
 
Chiripaha:
嗯,这是正确的--这些结果被标记为不重要的。- 这就是为什么它没有在结果或图表中显示出来。



我想我在这里有一个更深的问题。

我昨天的第一个问题是如何优化 用户函数内的参数

我被告知:把它们移到外部的双倍区

我做到了。

而现在优化器抛出了结果......我一定是把它们放错了。

这是代码,它是停止和获取的一个常见修饰语

以前有数字100和200,而不是STOP和TAKE。

我把数字改为 "停 "和 "取"。

而在代码的开头,我加入了

外来的双数 STOP = 100;
外来的双数 TAKE = 200。

这里有什么地方出错了吗?

(修改器本身100%有效)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

我现在看的是代码,但我允许沿途有一些评论。

这句话完全没有意义。

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

只有当你有一个多币种策略时才需要它,但那时,你必须使用

Symbol()

你将需要使用其他预定义的值,但不是这个正常的功能。

这个变量也是不必要的。

total=OrdersTotal();

因为在你的函数中,它只被应用了一次,在枚举中,由于某种原因被注释掉了,而且它只会使代码变得更加混乱。- 因此,问题是--你为什么要按顺序注释掉枚举?

这一点。

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

一般来说,最好归为一组--条件是一样的。顺便说一下,你按结构把它们写得不同。- 是对结构损失的问题。写作风格必须统一--那么你就可以看到结构,可能的错误会像雪后的颠簸一样出现。

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

从你介绍的情况来看,我没有发现任何可能影响结果的原则点。但是...你在这里只提出了一个函数(写得相当草率,除非你算上注释的枚举--这在问题中有所体现)。要说判决书--你不需要函数,你需要程序代码,因为你不知道原因在哪里,在哪里,你需要寻找它。要做到这一点,你必须在测试器中运行程序,亲眼看到可能出现的错误。然后已经运行了代码(或以相反的顺序),并寻找原因。

作为一个总体感觉,我可以说你,奥列格,有相当多的马虎(冷漠,我想说)。这可能导致1。对使用中的系统乱扔垃圾的行为。2.由于这种乱丢垃圾的行为,导致结构的损失,而且难以识别和检测虫子。所以我的建议是这样的。- 如果可能的话,扔掉代码中所有的 "垃圾"(不必要的)--错误会更容易被发现。- 这是大多数人寻求帮助的一个典型错误--粗心。

 
lottamer:


它可能比这更深。

我昨天的第一个问题是如何优化自定义函数内的参数。

我被告知:把它们放在extern double 中。

我做到了。

而现在优化器抛出的结果......显然,我把它们拿出来的方法是错误的。

不,我认为你错了。测试员抛出这个结果不是因为我们放出的参数,而是因为结果没有通过显著性标准。

但也有可能是程序本身含有错误。此外,不稳定的结果也是一种间接的指示。- 这意味着有些事情是错误的。在我的实践中,我不允许这种程序进入现实世界。因为如果出了问题,就意味着情况是无法控制的。而且什么都可以出来。

根据定义,止损和止盈参数在任何程序中都属于外部变量,而且不仅仅是因为它们需要被优化。这并不是说你每次想改变它们时都要进入你的代码。所以,不管是外部变量还是内部变量,都不重要。- 那是肯定的。

 
Chiripaha:

我现在正在看代码,但我允许沿途有一些评论。

这句话完全没有意义。

只有当你有一个多货币策略时,你才会需要它,但这时你不需要

你将需要替代其他预定义的值,但不是这个基本功能。

这个变量也是不必要的。

它只在枚举中的函数内使用了一次,由于某种原因被注释掉了,只会使代码变得更加混乱。- 因此,问题是--你为什么要按顺序注释出列举的内容?

在这里,它是。

一般来说,最好把它们放在一起--条件是一样的。

嗯,我没有从你提出的内容中发现任何可能影响结果的原则性问题。但是!...你在这里只提出了一个函数(写得相当草率,除非你算上注释的超限--这在问题中有所反映)。要说判决书--你不需要函数,你需要程序代码,因为你不知道原因在哪里,在哪里,你需要寻找它。要做到这一点,你必须在测试器中运行程序,亲眼看到可能出现的错误。然后已经运行了代码(或以相反的顺序),寻找这个原因。

作为一般的感觉,我可以说,你,奥列格,有相当多的粗心(冷漠,我想说)。这可能导致1。对使用中的系统的垃圾。2.由于这种乱丢垃圾的行为,导致结构的损失,而且难以识别和检测虫子。所以我的建议是这样的。- 如果可能的话,扔掉代码中所有的 "垃圾"(不必要的)--错误会更容易被发现。- 这是大多数人寻求帮助的一个典型错误--粗心。


我没有写这个修饰语。

我从图书馆准备好了。

最主要的是,它是100%的工作。

但为什么里面的参数没有被优化--这就是问题所在.....。

没有基本的错误!

其余的代码都能工作。

在算法上设置任何条件。

- 购买

-修改

- 关闭

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

并尝试在我的订单修改器中对参数进行优化 - 即停止和采取

 
Chiripaha:

不,我认为你错了。测试者不是因为你输入的参数而被抛出,而是因为结果没有通过显著性标准。

但也有可能是软件本身含有错误。此外,不稳定的结果也是一种间接的指示。- 这意味着有些事情是错误的。在我的实践中,我不允许这种程序进入现实世界。因为如果出了问题,就意味着情况是无法控制的。而且什么都可以出来。

根据定义,止损和止盈参数在任何程序中都属于外部变量,而且不仅仅是因为它们需要被优化。这并不是说你每次想改变它们时都要进入代码。所以,不管是外部变量还是内部变量,都不重要。- 那是肯定的。

嗯,看。

如果我现在把所有的东西都还回去,即删除外部的STOP和TAKE参数,在函数里面写上数字来代替它们,那么这个EA已经周而复始地运行了10周,并显示出清晰的结果。

如果我手动改变停止和拍摄的参数--一切都将工作,并给出稍微不同的结果(这是自然的)。

但是现在,为什么当我把这些参数转移到修改器之外时--优化器认为它们不重要?