[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 99

 
Lisi4ka330:


下午好!请帮助我解决ArrayMo函数(它返回密度曲线的最大值)。

double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}

出现了以下问题。

1.创建一个临时阵列的目的是什么?

m[][2]

2.不清楚临时数组的值将取自什么,因此也不清楚这个数组可能被搜索。

n=ArraySearchDouble(m, e)

3.然后一般来说,对我来说,真相是深藏不露的)))))。一旦我们确定不存在价值,我们就开始确定 "不可理解的价值 "阵列的大小。

如果能在这个故事中看到一线光明,我将非常感激))))。


我认为这个函数毕竟写得不太正确。主要原因是,在宣布之后。

double m[][2];

这是必要的

ArrayResize(m,0);

否则(我引用

intArrayResize( 空白数组[], int new_size)
设置数组第一个维度的新大小。 如果成功,该函数返回调整大小后数组中包含的所有元素的数量,否则返回-1,数组不被调整大小。
!!!注意:在任何函数中本地声明的数组,如果被调整了大小,在函数执行后将保持不变。当函数再次被调用时,这样的数组将有一个与声明的1!!!! 不同的大小。

因此,在多次调用的情况下,该函数将 "落在过去")

关于该算法的工作原理。数组m[][2]本身就是变量x[i]的不同值的命中数的经验分布的直接表示。也就是说,数组的每个元素由两个数字组成--某个值(第一个字段)的命中率和该值本身。循环在数组m中为每个x[i]搜索相同的值,如果找到了,数字字段就被添加进去,否则就用ArrayResize()创建一个新元素,我们的x[i]就写在那里。

接下来,一旦数组被填满,我们只需要找到命中率最高的元素,即根据定义,分布x的模数。

这是由字符串完成的

    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];

虽然在我看来(不确定多维数组的情况),你可以只用

    s=m[ArrayMaximum(m)][1];

总而言之,我可以说(恕我直言,该代码的作者),即使纠正了所有的缺陷,这种算法也是极其低效的,而且经常会给出错误的结果。原因是我们正在使用双数类型,这意味着x[i]值接近但仍可区分的概率相当高。当样本量比x[i]所定义的区间总数大得多(几百倍或更多)时,这可能就不那么明显了。然而,在很多情况下,如果不满足这个约束条件,会有很多错误的计算。

计算模式的更正确的方法是这样的:构建一个经验分布函数(不要与频率分布混淆),然后将其从片状线性内插到平滑,最后寻找最大导数点。这样的算法没有上面列出的缺点,即使是小规模的样本也能相当有效地工作。至少,我只需要解决在50-100个元素的样本中搜索模式的任务,并使用MQL的相当数量的间隔 - 一切都很好。唯一的缺点是,插值通常会导致计算速度的大幅下降,当然,如果我们想定性地平滑的话。

 
尊敬的论坛成员,你们好!我可以和谁谈谈编写EA的 问题。一个没有指标的EA,基于不在我们方向上的移动而进行翻倍。
 
Glazunov:
尊敬的论坛成员,你们好!我可以和谁谈谈编写EA的问题。一个没有指标的EA,基于不在我们方向上的移动而进行翻倍。
这里: https://www.mql5.com/ru/job
 
ilunga:
这里: https://www.mql5.com/ru/job

谢谢你。也许有更多的选择。
 
Glazunov:

谢谢你。也许有更多的选择。
试着在网站搜索中输入 "马丁格尔"--你会感到惊讶的。
 
YOUNGA:
试着在网站搜索中输入 "马汀格尔",你会感到惊讶的

已经看过了!但我想要的东西却没有了(
 
Glazunov:
尊敬的论坛成员,你们好!我可以和谁谈谈编写EA的问题。一个没有指标的EA,基于不在我们方向上的移动而进行翻倍。


请看这里

https://www.mql5.com/ru/forum/136747

 

你好。我刚刚开始在MQL4。

请提供关于OrderModify 功能的建议。手册和例子显示,该功能用于拖网,即改变止损。我需要改变未平仓订单的获利,止损在开仓时没有设置,在修改时也必须保持为0

订单的计算和选择应该是怎样的?

最终的目标应该是这样的

if (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) //有一个买入,但它已经下降了kof
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);//我们把TP移到比先前放置的低。

卖出也是如此。

谢谢你的回答。

 

再次问好 :)

如我所想,问题出现了。以下是代码。重点是,测试器上的订单是由TP关闭的,在追踪止损期间修改订单时,通过函数TP被移除。

double my_ord[31][2];                                           //ордера советника
                                                                //[][0] Ticket
                                                                //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
    for (int a = 0;a<32;a++)                                    //во избежание ошибок заполняем все нулями
      {
       my_ord[a][0]=0;
       my_ord[a][1]=0;
      }
    int pos = 0;
    for(int i=0; i<32; i++)
      {
       if (Mas_Ord_New[i][8]==1)                                //есть ли комментарий
         {
          int num = Mas_Ord_New[i][4];
          OrderSelect(SELECT_BY_TICKET, num);
          string str = OrderComment();
          if (str == "AO Day Profiter Trade")                   //наш ли это комментарий
            {
             my_ord[pos][0] = num;
             my_ord[pos][1] = Mas_Ord_New[i][6];                //если наш, записываем Ticket и вид операции
             pos++;
            }
          else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    int minDist = MarketInfo(symb, MODE_STOPLEVEL);
    if (TStop<minDist)
      {
       TStop = minDist;
      }
    else { }
    if (TStop>0)
      {
       OrderSelect(ticket, SELECT_BY_TICKET);
       if(OrderType()==OP_BUY)
         {
          if(Bid - OrderOpenPrice()>Point*TStop)
            {
             if(OrderStopLoss()<Bid-Point*TStop)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Bid-Point*TStop, 0, 0, Blue);
                return;
               }
             else { }
            }
            else{ }
         }
       else if (OrderType()==OP_SELL)
         {
          if(OrderOpenPrice() - Ask>Point*TStop)
            {
             if(OrderStopLoss()>Ask + TStop*Point)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Ask+Point*TStop, 0, 0, Blue);                           //ordertakeprofit!!
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for (int i = 0; i<32; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][0]>0)
         {
          TrailStop(my_ord[i][0], TralingStop);
         }
       else {break;}
      }
这意味着追踪止损没有被执行,而且在测试者的日志中没有出现错误的TP和SL的错误。那么,什么是错的呢?
 

亲爱的专业人士,请你告诉我这个问题好吗?

我在一个文本文件里有一个先前写好的一维字符串数组

EURUSD 1654.31

GBPUSD -1654.61

USDCAD 110.98

USDJPY 1180.17

假设美元兑加元的总利润发生了变化,我需要用 "美元兑加元115.64 "替换第三行。

我把这个数据读成一个一维字符串数组,但我不能只替换文本文件中的这个元素(谁能写一个函数?)

还是不费吹灰之力就把整个阵列覆盖掉比较好?

我只是有来自站在不同对上的EA的数据--每个对都有不同的字符串--当然最好是只改变一个元素。