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

 
belck:

这就是我的想法的全部内容。


你必须带着一个想法去做服务工作,在这里,人们习惯于用特定的代码来处理特定的情况。
 

下午好!我想创建一个指标,在MASD、AO和类似指标上显示一个通道。该指标叠加在基本指标(MASD、AO和类似指标)的窗口上,并被画成高于和低于0的平行线。这些线被定义为指定时期的最大峰值(高于0)和最小谷底(低于0)的平均值。
我试图用AO指标作为例子,但它不工作。
算法:
,我们将指标读数写入一个数组,
我们通过这个数组寻找峰值/谷值,
,我们将它们写入某些数组,
,我们找到峰值的平均值,然后是谷值,
我们将得到的值分配给指标缓冲区
在这一步,代码中定义的不是指标上的通道(坚持到0),而是最大峰值的平均值和最小谷值的平均值。
波峰和波谷的定义可以从代码中删除,作为一个函数来执行,但现在我让它保持这种方式--它并没有改变事情。
问题:
1.终端挂起(相当多)
2.行数不显示为平均数;显示为一段时期的最大/最小值
花了很长时间才弄明白,但我无法弄清问题的原因。请你帮助我纠正我的代码,或者给我一个类似问题的源代码链接,我将尝试进一步纠正。提前感谢。

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
谢谢你!非常有帮助
 
LOA:

下午好!
问题:

1.终端挂起(显著)。

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


在一个循环中增加数组的大小 是很残酷的,这就是为什么它挂起。一次性加大尺寸。或者一次使用时间序列


P.S. 见个人留言

 

如何循环浏览一个字符串类型 的变量?

例子

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
我如何用一个循环来代替这个结构?
 
下午好,请告诉我如何写一个条件,即如果一个未平仓订单的利润为一磅,则关闭该订单?
 
first_may:
下午好,请告诉我如何写一个条件,即如果一个未平仓订单的利润为一磅,则关闭该订单?

使用函数。

https://www.mql5.com/ru/forum/131859/page3#434225

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

如何循环浏览一个字符串类型的变量?

例子

我如何用一个循环来代替这个结构?

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize( sSymbols) && i < ArraySize( A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



谢谢你
 
终端挂起是否有可能是因为对象处理不正确,对象在每次勾选时 被创建和删除?