[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 402

 
belck:

De eso se trata mi idea:


Hay que ir al Servicio de Trabajo con una idea, y aquí se acostumbra a tratar situaciones concretas con un código específico.
 

¡Buenas tardes! Me gustaría crear un indicador que muestre un canal en indicadores como MASD, AO y similares. Este indicador se superpone a la ventana de indicadores básicos (MASD, AO y similares) y se dibuja como líneas paralelas por encima y por debajo de 0. Estas líneas se definen como una media de los picos máximos (por encima de 0) y los mínimos (por debajo de 0) para el periodo especificado.
Estoy intentando utilizar el indicador AO como ejemplo pero no funciona.
Algoritmo:
escribimos las lecturas del indicador en un array,
recorremos este array buscando los picos / valles,
los escribimos en determinados arrays,
encontramos el valor medio de los picos, luego los valles,
asignamos el valor obtenido al buffer del indicador.
En este paso, lo que se define en el código no es el canal (que se pega a 0) del indicador, sino el valor medio de los picos máximos y el valor medio de los mínimos.
La definición de picos y valles puede eliminarse del código y ejecutarse como una función, pero por ahora lo he dejado así, no supone ninguna diferencia.
Problemas:
1. el terminal se cuelga (considerablemente)
2. las líneas no se muestran como una media; aparecen como max/min durante un periodo.
Me costó mucho tiempo averiguarlo, pero no consigo averiguar la causa de los problemas. Por favor, pueden ayudarme a corregir mi código o darme un enlace al código fuente de problemas similares y trataré de corregirlo más. Gracias de antemano.

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);
}
 
¡gracias! ¡muy útil!
 
LOA:

¡Buenas tardes!
Problemas:

1. el terminal se cuelga (significativamente)

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


Aumentar el tamaño de un array en un bucle es cruel, por eso se cuelga. Aumenta el tamaño de una vez. O utilizar las series de tiempo a la vez


P.D. ver mensajes personales

 

¿Cómo puedo recorrer en bucle una variable de tipo cadena?

Ejemplo

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
¿Cómo puedo sustituir esta construcción por un bucle?
 
Buenas tardes, ¿podríais decirme cómo escribir una condición por la que si el beneficio de una orden abierta es de un puntillo, se cierre esa orden?
 
first_may:
Buenas tardes, ¿podríais decirme cómo escribir una condición por la que si el beneficio de una orden abierta es de un puntillo, se cierre esa orden?

Utilizando la función.

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:

¿Cómo puedo recorrer en bucle una variable de tipo cadena?

Ejemplo

¿Cómo puedo sustituir esta construcción por un bucle?

   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:



Gracias
 
¿Es posible que el terminal se cuelgue debido a un manejo incorrecto de los objetos, en el que éstos se crean y eliminan en cada tic?