[¡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 331

 

Debo haber metido la pata en algo con los topes de nuevo. Por favor, échale un vistazo.

La tarea es la siguiente:

1) Se calcula la LSMA. Si [i]>[i+1] - el color es verde, si [i]<[i+1] - el color es rojo. Todo está claro con esto.

2) Necesito encontrar la longitud de la serie de valores verdes y rojos y almacenarlos en un array. Este es el problema que todavía no he conseguido resolver por mí mismo.

//+------------------------------------------------------------------+
//|                                                   LSMA_Stat2.mq4 |
//|                                                       silhouette |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "silhouette"
#property link      "http://www.metaquotes.net"

#property copyright "silhouette"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
//+------------------------------------------------------------------+
double BufferYellow[],BufferGreen[], BufferRed[];
int GreenSeries[], RedSeries[], g=0, r=0, gc=0, rc=0;
string Symb;

int init()
  {
   Symb=Symbol();
   
   SetIndexBuffer(0,BufferYellow);
   SetIndexBuffer(1,BufferGreen);
   SetIndexBuffer(2,BufferRed);
   
   SetIndexStyle(0,DRAW_LINE,EMPTY,2);
   SetIndexStyle(1,DRAW_LINE,EMPTY,2);
   SetIndexStyle(2,DRAW_LINE,EMPTY,2);  
   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
   double tmp1, tmp2, LSMA;
   
   int counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;
   if (limit>1) 
      limit=Bars-1;
      
   for(int i=limit; i>0; i--)
    {
     tmp1=iMA(Symb,Period(),34,0,MODE_SMA,0,i);
     tmp2=iMA(Symb,Period(),34,0,MODE_LWMA,0,i);
     LSMA=3.0*tmp2-2.0*tmp1;
      
     BufferYellow[i]=LSMA;
     BufferGreen[i]=LSMA;
     BufferRed[i]=LSMA;

     if(BufferYellow[i]>BufferYellow[i+1])
      {
       BufferRed[i]=EMPTY_VALUE;
      }
     else if(BufferYellow[i]<BufferYellow[i+1])
      {
       BufferGreen[i]=EMPTY_VALUE;
      }
     else
      {
       BufferRed[i]=EMPTY_VALUE;
       BufferGreen[i]=EMPTY_VALUE;
      }                        
      
     if(BufferGreen[i]!=EMPTY_VALUE && BufferRed[i]==EMPTY_VALUE)
      {
       g++;
      }
     if(BufferGreen[i]==EMPTY_VALUE && BufferRed[i]!=EMPTY_VALUE)
      {
       r++;
      }
     if(BufferGreen[i]==EMPTY_VALUE && BufferRed[i]==EMPTY_VALUE)
      {
       if(BufferGreen[i+1]!=EMPTY_VALUE)
        {
         GreenSeries[gc]=g;
         gc++;
         g=0;
        }
       if(BufferRed[i+1]!=EMPTY_VALUE)
        {
         RedSeries[rc]=r;
         rc++;
         r=0;
        }
      }              
    }
   return(0);
  }
 
silhouette:

Debe haber estropeado algo con los topes de nuevo. Por favor, échale un vistazo.

La tarea es la siguiente:

1) Se calcula la LSMA. Si [i]>[i+1] - el color es verde, si [i]<[i+1] - el color es rojo. Todo está claro con esto.

2) Necesito encontrar la longitud de la serie de valores verdes y rojos y almacenarlos en un array. Este es el problema que todavía no he conseguido resolver por mí mismo.


¿Qué es lo que no le gusta de este indicador?
 
Vinin:

¿Por qué no te gusta este indicador?

Vinin, en realidad lo hice según tu ejemplo, pero la cuestión es diferente: lo importante para mí no es el método de cálculo en sí (sea el más sencillo MA), sino la solución al problema del punto 2.

Necesito obtener un array que almacene la longitud de las series verdes o rojas para su posterior análisis.

 
Por favor, avisa. Hay 2 gráficos de balance virtual (para órdenes de venta y compra) en la vida real pueden divergir mucho. Cómo puedo traducirlas a cualquier unidad relativa para poder cronometrar el momento de cruce de estas gráficas.
 
silhouette:

Vinin, en realidad lo hice según tu ejemplo, pero la cuestión es otra: lo importante para mí no es el método de cálculo en sí (sea el más sencillo MA), sino la solución al problema del punto 2.

Necesito obtener un array que almacene la longitud de las series verdes o rojas para su posterior análisis.


¿Por qué necesitas una matriz?
 
Vinin:

¿Por qué necesitas una matriz?
Para el posterior análisis estadístico. En Excel, por ejemplo.
 

Hay una biblioteca para el comercio del ratón https://www.mql5.com/ru/code/9671

No tengo ninguna suerte en conectarlo, por favor, ayuda.

Descargo todos los archivos que necesito en la carpeta de expertos y luego compilo, pero todavía los indicadores tienen ventanas negras sin datos.

Obviamente es un error infantil, pero no lo encuentro en 24 horas.


 
TheXpert:

No hay necesidad de archivar nada. El archivo ya contiene todos los ficheros, todo lo que tienes que hacer es descomprimir el archivo en la carpeta del terminal y compilar.

Sólo se compilan los archivos de indicadores, las bibliotecas (mqh) no necesitan ser compiladas. Intenta poner un nuevo terminal y practica en él.

 

¿Puedes darme una pista? Hay un botón "MQL4.community" en el terminal y al hacer clic en él se abre Word con la página correspondiente, pero cuando intento hacer clic en cualquier enlace, ¡aparece una ventana diciendo que hay una restricción en mi ordenador! ???

¿Cómo lo afronta? Gracias.

 
void start()
  {
  double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);
  double profitbuy, profitsell;
  
  for(int i = OrdersTotal()-1; i >= 0;i--)
    {
    if(!OrderSelect(i,SELECT_BY_POS)) continue;
    if(OrderSymbol()!=Symbol() || OrderType() >= 2) continue;
    if(OrderType() == 0)
      profitbuy +=((Bid - OrderOpenPrice())/Point*tickvalue*OrderLots())+OrderCommission()+OrderSwap();
    if(OrderType() == 1)
      profitsell+=((OrderOpenPrice() - Ask)/Point*tickvalue*OrderLots())+OrderCommission()+OrderSwap();
    }
  
  Comment(profitbuy+profitsell);
  }
В чем прикол, не могу правильно рассчитать суммарный профит для всех ордеров по одной паре, в терминале пишет одно, а у меня получается другое?

Итак, мои домыслы, своп в терминале нужно нормализовать обязательно, там точность больше двух бывает - это проверил, но как нормализовать - для каждого ордера или суммарно? Непонятно в общем...
Я уже всяко перепробовал, минимальная разница доходила до 0.02 центов, но это все равно не то, что нужно.

Вопрос, как мне мой код подогнать под работу функции - AccountProfit()?