[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 470

 
tol64:

如何优化多币种参数?在MT4测试器中,没有可能同时测试几个符号...我在思考多币种EA,我得出的结论是,它的参数是为每个符号单独优化的,然后我把所有这些参数转移到我的为多币种模式设计的专家顾问进行交易。

我的方向是正确的,还是事实上更容易?)

在mql5中,这一切都可以在一个EA中实现,用于测试和交易,但现在我决定研究mql4。

我只是想,如果你不能一次测试一些符号,如果你可以自己设置每个符号图表的副本,而且会有相同的效果,为什么要用一个EA呢?我想听听社区成员的意见))))。

我没有多币种,我只是在每个工具上挂同一个EA。
 
Roman.:

回复
对不起,没有理解答案
 
demlin:
对不起,我不明白这个答案。

通过谷歌搜索 "如何优化一个网站:mql4.com"。下面这本书也可以在这里 找到:"如何优化专家顾问网站:mql4.com",也在这里

我推荐一本关于这个问题的好书:《股票交易员交易系统的开发、测试和优化》,作者是拉尔夫-文斯-所有的细节。

 

问题:图中显示了一条曲线(如MA)。A,C,E点是局部最大值,B,D点是局部最小值。问题:如果最近的最大值和最小值之间的距离超过N点,我们如何计算它们?我试图这样做,但似乎太麻烦了。也许有一个现成的算法来解决这样的问题?如果有人有这方面的经验,请告知。

 
Elenn:

问题:图中显示了一条曲线(如MA)。A,C,E点是局部最大值,而B,D点是局部最小值。问题:如果最近的最大值和最小值之间的距离超过N点,我们如何计算它们?我试图这样做,但似乎太麻烦了。也许有一个现成的算法来解决这样的问题?如果有人有这方面的经验,请告知。


确定滑行的方向。

如果它是向上的,并且变量B、C、D和E是空的,那么我们就把移动角度的当前值输入变量A。

如果变量A不是空的,并且滑动方向是向下的,并且变量C,D,E是空的,那么滑动指标的当前值被输入到变量B。如果变量A和变量B不是空的,并且移动平均线是向上的,并且变量D和E是空的,那么变量C应被填充为移动平均线的当前值。

以此类推,我们用数值填入变量的值。

现在,如果变量A和C不是空的,并且如果A和C之间的差值模数大于或等于预定的点数,那么你所想的行动将被执行。

一般来说,这个代码是很有可能的。我们只需要确定算法中的哪一点,在这一点上我们要重置变量,这样EA就会意识到它已经来到了一个新的起始点。代码可以通过循环和数组来写,可能没有那么复杂,但最好是通过变量来写算法,以避免循环中数组索引 和烛台数字的混淆。

 

伙计们,最近遇到了这个问题。 谁是圈内人--评论一下吧。我 自己发现了这个错误--谢天谢地--很快...编写代码时--所有的编译都没有错误,但trawl却不工作...也就是说,我们不会在订单循环中继续前进。以下是代码片段...错误在于--我们在外部变量中给出了命令魔法,但在循环中搜索命令时--用一个小字母,通过CTRL+F搜索--请求"魔法"后是"魔法"......编译器没有给出错误,但在循环中,程序没有改变为拖网......循环会在"魔术"上中断... 这应该是这样的吗?我 一直认为"魔法"和"魔术"是不同的变量...因此,编译器应该指出这个错误,即 "魔法 "变量是未定义的......。在代码中,由于它现在是在选择拖网之前执行的,并且Printa()不再出现--通过这个条件退出循环--因为魔术-- 即这个条件--将永远不会被执行,因为不同的名字--"魔术"和"魔术"。

if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

// глоб переменные
...
...
extern int  Magic = 10;     // MagicNumber

//----------------------------------------------------------------------------
int start()                            // Спец. функция start
  {
  
   
   int orderCount = 0; 
  
   //---------------------------ТРАЛ ОРДЕРОВ---------------------------------------------------------------------------------------
   int orderType;
    for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
    {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))
      {
         continue;
      }
                ticket = OrderTicket( );                         // Номер ордера
       double   orderLots = OrderLots();                         // Lots   
       double   orderProfit = OrderProfit() + OrderSwap();       // Profit
       double   Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
       double   SL =  OrderStopLoss();                           // Значение StopLoss ордера
       double   TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
                 
         
      orderCount++;                     // считаем ордера (не больше 10)
     
            
       while (!IsTradeAllowed() || !IsConnected()) Sleep(5000); RefreshRates();
       
      //----------------------------Тралим последовательно все наши ордера по виду трала------------------
      if (UseTrailing && orderCount > 0 && type ==0)   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook (1);          // если селл
          }      
      ...
      ...
      ...   
     Print( "Эксперт база: Всего наших ордеров = " ,orderCount);
     }   
//--------------------------------------------------------------------------------------------------------------------------------------     
   
   
  
//----------------------------------------------------------------  
   return;                             // Выход из start()
  }

P.S. 谁不知道它--要注意它,否则就不清楚你能用代码做多少事...

 
Roman.:

伙计们,最近遇到了这个问题。 谁是圈内人--评论一下吧。我 自己发现了这个错误--谢天谢地--很快...编写代码时--所有的编译都没有错误,但trawl却不工作...也就是说,我们不会在订单循环中继续前进。以下是代码片段...错误在于--我们在外部变量中给出了命令魔法,但在循环中搜索命令时--用一个小字母,通过CTRL+F搜索--请求"魔法"后过渡到"魔法"......编译器没有给出错误,但程序执行没有改变为循环中的拖网模式。循环会在"魔术"上中断... 这应该是这样的吗?我 一直认为"魔法"和"魔术"是不同的变量...因此,编译器应该指出这个错误,即 "魔法 "变量是未定义的......。在代码中,由于现在是在选择拖网之前执行,并且Printa()不再出现--在这个条件下退出循环--因为魔术-- 即这个条件--将永远不会被执行,由于不同的名字--"魔术"和"魔术"。

P.S. 谁不知道它--要注意它,否则你不会知道你要做多少的代码...


如果声明了magic并使用了magic,编译器会说magic变量没有被声明。

MetaEditor 4 401.

 
Roman.:

伙计们,最近遇到了这个问题。 谁是圈内人--评论一下吧。我 自己发现了这个错误--谢天谢地--很快...编写代码时--所有的编译都没有错误,但trawl却不工作...也就是说,我们不会在订单循环中继续前进。以下是代码片段...错误在于--我们在外部变量中给出了命令魔法,但在循环中搜索命令时--用一个小字母,通过CTRL+F搜索--请求"魔法"后是"魔法"......编译器没有给出错误,但在循环中,程序没有改变为拖网......循环会在"魔术"上中断... 这应该是这样的吗?我 一直认为"魔法"和"魔术"是不同的变量...因此,编译器应该指出这个错误,即 "魔法 "变量是未定义的......。在代码中,由于现在是在选择拖网之前执行,并且Printa()不再出现--在这个条件下退出循环--因为魔术-- 即这个条件--将永远不会被执行,由于不同的名字--"魔术"和"魔术"。

P.S.谁不知道它--要意识到它,否则你不会明白你要处理多少代码......

与我的简单拖网比较。特别是,它是一个顺序查找的循环。

   // В глоб. переменных
   string sy=Symbol();
   // ...................................................................
   color  cl;
   double sl, StopLevel;
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=sy)           continue;
         if (OrderMagicNumber()!=Magic)   continue;
         if (OrderType()>1)               continue;
         sl=OrderStopLoss();
         if (OrderType()==OP_BUY) {
            cl=clModifyBuy;
            StopLevel=NormalizeDouble(strG-DeltaStop*PointX, dg);
            if (sl<StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         if (OrderType()==OP_SELL) {
            cl=clModifySell;
            StopLevel=NormalizeDouble(strR+DeltaStop*PointX, dg);
            if (sl>StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         }
      }

我想这个原则对你来说会很清楚。

而魔法和魔法变量确实不同。在用Ctrl+F搜索时,请勾选 "区分大小写"。

在代码的某个地方,你确实同时声明了它们

 
artmedia70:

而魔法和魔法的变量确实不同。当用Ctrl+F搜索时,请选中 "大小写敏感 "复选框。

在代码的某个地方,你在所有的
后声明了他们两个。

正是如此。刚刚发现的,多亏了你...:-)))在变量的底部,除了变量extern int Magic = 10; 我还声明了一个变量--
int magic = 12345;

:-)))

事实证明,我考虑到了订单开场费中的魔术 和循环中的魔术,所以他们的拖网的订单循环没有发挥作用......:-)))

从心底里感谢你--我已经解决了这个问题。检查了 "使用寄存器"--把它放在那里,所有的工作都正常了。

P.S.它是如何发生的!! (当运气去的代码 - 准备,而不是只有几个majiks宣布...:-))))

 
artmedia70:

将此与我最简单的拖网进行比较。特别是订单搜索周期。

我想这个原则会很清楚。

谢谢你提供的拖网选项。这个原则很清楚。