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

 
ruslanchik:
请告诉我如何计算堆栈大小

把问题说得更具体些。
 

有没有可能在优化中跳过一个不必要的步骤而进入下一个步骤?

例如:有一些需要优化的输入参数(类型为双数):X1,X2,X3,X4。 它们的值从1到5。 步骤 0.1

很明显,在这种情况下,将有41*41*41*41=2,825,761个

但我们需要在以下约束条件下进行搜索:10.5 < x1+x2+x3+x4 < 11.5。这里已经很清楚,搜索变体会少很多。(这正是对所需金额的限制)

因此,如果将这一限制添加到专家顾问的代码中,就像这样

extern double    x1=1, x2=1, x3=1, x4=1;

int start()

{

  if (10.5<x1+x2+x3+x4 && x1+x2+x3+x4<11.5)

    {
      // основной код эксперта 

    }
  return; 

} 

那么在优化过程中(当每个新的刻度线到达时),不合适的变体也将被取走,例如x1=4,x2=4,x3=4,x4=4;确切地说,不会发生的是执行主代码

也就是说,只要这个优化步骤没有 "跑过 "历史区间,就不会过渡到下一个步骤。会有一个 "信念",即 10.5 < x1+x2+x3+x4 < 11.5的条件 没有得到满足,它只会停止主代码的执行。

在这种明显不适合的变体上,时间将被大大浪费。

在明显不合适的参数下,我们怎样才能排除这种优化步骤?

也就是说,当另一组参数变得不合适时,这一步不应该被优化,而应该立即传递给新的一步?

 
fmql:

有没有可能跳过一个不必要的优化步骤而进入下一个步骤?


有可能优化3个参数,并调整第四个参数以达到所需数量。

或使用第三个选项卡 "优化 "来自动生成所需的事件。

 
sergeev:

有可能优化3个参数,并调整第四个参数以达到所需数量。

或使用第三个选项卡 "优化 "来自发地生成所需的事件。

关键是,在我的情况下,如果没有第四个参数,就不可能对3个参数进行优化。

在这里,重要的是它们的联合选择,它们的总和在区间内是有限的。

(它近似于寻找混合物中所有成分的份额,并且该混合物的总质量被限制在一个严格的区间内)。

你能告诉我更多关于第三个标签的信息吗,这个自发产生的预期事件是什么?

 

下午好。

你能告诉我如何提取ZigZag指标的最后一个极值的蜡烛值(高点、低点、开盘、收盘)吗?

 
与任何其他蜡烛一样。同样的功能。( 想想你的星球的直径。(c) )
 
如果你想获得最后一个极值本身的条形图编号,使用最后一条射线的对象名称来获得 第一个坐标的时间,这将对应于条形图的时间。利用酒吧的时间,确定酒吧的编号。根据钢筋编号确定钢筋的特性。
 
fmql:

你能详细说明一下第三个标签,什么是所需事件的自发生成?


更多细节请见帮助

简而言之,你可以在第三个标签上创建自己的点位条件(例如,连续开出10个亏损的订单),测试器将自动跳过这个运行,进入下一个运行。

 
Stells:

下午好。

你能告诉我如何提取ZigZag指标的最后一个极值的蜡烛值(高点、低点、开盘、收盘)吗?


这样的操作需要进行一些计算。

我以前是这样做的。

int start()
  {
 double // экстремумы Зиг-Зага
  y3=0, 
   y2=0,
    y1=0,
     y0,
     zz;   
 int    x3, x2, x1, sh=ShiftBars;// номера баров  

  y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 1);

//=============================================================================
  // Берём три экстремума Зиг-Зага
   while (y3==0) 
      {
      zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
      if (zz!=0 && zz!=EMPTY_VALUE) 
         {
         if      (y1==0) { x1=sh; y1=zz; }
         else if (y2==0) { x2=sh; y2=zz; }
         else if (y3==0) { x3=sh; y3=zz; }
         }
      sh++;

//----- Вывод информации на экран -----------------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";

on_off=StringConcatenate (on_off,"Экстремум= ",y1," на ",x1," баре","\r\n");
on_off=StringConcatenate (on_off,"Экстремум= ",y2," на ",x2," баре","\r\n");
info=StringConcatenate(info,on_off,"\r\n");
info=StringConcatenate(info,"\r\n");
Comment(info);    

现在你知道了最后两个极值(最小和最大)的条形数字,然后是它们的高点,低点....。 很容易找到 !

- Close[x1], Open[x2], ....等。

也许有人会提出一个更简单的方案。

 
不能组织一个循环,X和Y总是0。
//+------------------------------------------------------------------+
//|                                                    для лавин.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double stoploss=0; extern double takeprofit=20;extern int otstup=20; extern datetime expiration=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int tiket,tikett;double volume=0.1;int i=0,R1=0,R2=0,A=1 ;double price=PRICE_OPEN;
   //  R1=((PRICE_OPEN- stoploss*Point)*stoploss)/stoploss;R2=((PRICE_OPEN+ stoploss*Point)*stoploss)/stoploss;
     
     
int start()
  {       int X,Y; double price=(Ask+Bid)/2;            
//----
       Alert ("OrdersTotal()",OrdersTotal());

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i==0;i--){
OrderSelect(i,SELECT_BY_POS );if(OrderType( )==OP_BUYSTOP){X++;}}}Alert ("X", X);
if (X==0){


   tiket= OrderSend( Symbol(), OP_BUYSTOP,  volume*A, price +otstup*Point, Point* 3, R1, price+takeprofit*Point+otstup*Point, "OP_BUYSTOP", 1000,  expiration, Red); 
   Alert ("OP_BUYSTOP", GetLastError( )); }
   
if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
  for( i=OrdersTotal();i==0;i--){OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}}}Alert ("Y", Y);
 if (Y==0){ 
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, price -otstup*Point, Point* 3,R2, price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
    Alert ("OP_SELLSTOP", GetLastError( )); 
    }       
   
//----
   return(0);
  }
//+------------------------------------------------------------------+