Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 223

 
ALXIMIKS:


He tenido tiempo - he llegado a un algoritmo para la tarea, lo describió (en detalle, tal vez un poco incorrecto para algunas personas - las personas son diferentes en términos de rentabilidad).

¿Sarcasmo? No lo sé, sólo ayuda.

¿escribir el código a alguien? ¿optimizar más? (sí puedo, pero ¿merece la pena? )

(p.d. artmedia70, no te ofendas, respeto tu actitud y opinión en general - sinceramente, pero el otro día tú mismo diste el código de iCustom-y por decirlo suavemente no muy optimizado).

Algo así debería funcionar si se inserta en la comprobación de una nueva barra.

El código sería más óptimo si kilkict=iBars(sy,tf) se redujera después de un cierto número de fractales, para no recorrer constantemente todas las barras.

Gracias. He empezado a escribir según su algoritmo. Pero con las banderas, estás tan cerca como yo de Pekín. Gracias de nuevo.
 
gince:
Gracias. He empezado a escribir según su algoritmo. Pero con banderas, estoy tan lejos de Pekín como tú. Gracias de nuevo.


https://www.mql5.com/ru/forum/131516/page34

Allí abajo - un artículo temprano compartió su experiencia. Exactamente en este tema.

 
tara:


https://www.mql5.com/ru/forum/131516/page34

Allí abajo - un artículo temprano compartió su experiencia. Exactamente en este tema.


SPS
 

¿Cuál puede ser el problema?

A veces se muestra un error de división por "O" durante una prueba

double LotsOptimized()
  {
   double lot=Lots;
   double Lot;
   if (isFloatLots == true)          // если флаг true то проводится оптимизация величины лота, иначе лот неизменен
     {  
        int orders=HistoryTotal();  // history orders total
        int losses=0; // number of losses orders without a break
        double loss=0;              
//---- select lot size
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        lot                             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*MaxR/100.0;
        dollarsPerPip = lot/SL;
                
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }
//---- return lot size
//         if(lot<0.1) lot=0.1;
           
//---- calcuulate number of losses orders without a break
           if(DcF>0)
          {  
        for(int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0)  break;
                if(OrderProfit()<0) losses++;loss=loss-OrderProfit();
                  }
        if(losses>=losses_orders) {Lot=NormalizeDouble(MathAbs(loss)/FV/MarketInfo(Symbol(),MODE_TICKVALUE)/TakeProfit1,1);
         }
       }
     }  
//---- return lot size
     if (Lot>lot) lot=Lot; 
   
  return(lot);
  }
 
Stells:

¿Cuál puede ser el problema?

A veces se muestra el error de división por "O" durante una prueba.


Busque el signo "/" y vea qué variables del usuario participan en la división:

SL ;

FV ;

TakeProfit1 .

Algunos de ellos pueden ser 0.

 
Stells:

¿Cuál puede ser el problema?

A veces se muestra un error de división por "O" durante una prueba

Haz una prueba de tipo:

if(!SL==0)
   {
  dollarsPerPip = lot/SL;
   }
Y así sucesivamente.
 
ALXIMIKS:


Gracias de nuevo. Intenté descifrar tu código y escribí comentarios. Lo hice para entenderme a mí mismo y tal vez escriba algo similar. Estudio y trato de entender la lógica del trabajo de otras personas. Entonces lo pruebo yo mismo.

Tal vez pueda encontrar tiempo para revisar mis comentarios y corregirlos si es necesario. Una pregunta más.

  if (Bufer0!=EMPTY_VALUE) 

¿Significa que el buffer del indicador no está vacío o esta variable significa algo más? El búfer del indicador sería

Bufer0[i]

Todo el código con comentarios.

 int    counted_bars=IndicatorCounted();
//----
   int   a1=0,                               //преведущий фрактал (-1 ->нижний, 1 -> верхний)
         a2,                                 //нынешний фрактал  (-1 ->нижний, 1 -> верхний)
         a3,                                 //сума преведущий + нынешний
         kilkict,
         frac,                               //frac - флаг существования фракталов,
         frac1=0;                            //frac1- счетчик фракталов (+1 или 0 за цикл)
   int i;
   double Bufer0;                            //
   kilkict=iBars(NULL, 0);

   for (i=3; i<kilkict;i++){
      a2=0;frac=0;
      if(iFractals(NULL, 0, MODE_UPPER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            a2+=1;                           //к числу фракталов добовляем 1
            frac=1;                          //флаг - фрактал есть
            frac1++;                         //счечик увеличиваем на 1
         }
      }
      if(iFractals(NULL, 0, MODE_LOWER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            if(a2==0){
               frac1++;                      //счечик увеличиваем на 1 
               frac=1;                       //флаг - фрактал есть
            }
            a2+=-1;                          //к числу фракталов добовляем -1(т. е. уменшаем)
         }
      } 
      if (frac==0){continue;}                // если флага нет (фрактал ненайден)
      if (frac1==1){                         //если счечик равен 1,
         a1=a2; continue;
      }          
      a3=a1+a2;
      if(a3<0)           { a1=a2;continue;}//Два фрактала вниз  подряд найдено// 
      if(a3>0)           { a1=a2; continue;}//Два фрактала вверх подряд найдено //
      if(a3==0 && a1==0) { a1=a2;}// Два фрактала подряд вверх и два фрактала подряд вниз найдено //
   }

 

gince:

if (Bufer0!=EMPTY_VALUE) 

¿Significa que el búfer del indicador ya no está vacío o esta variable significa otra cosa?

Esta línea se puede eliminar, porque iFractals() devuelve cero, no "valor vacío"(EMPTY_VALUE), como ausencia de fractal.

Mi pregunta es la siguiente: ¿intentas hacer un indicador que busque dos fractales consecutivos? ¿O está buscando en su EA dos fractales consecutivos más cercanos a la barra actual? Esta pregunta no es una curiosidad ociosa porque los métodos de búsqueda en el indicador y en el Asesor Experto son diferentes - el indicador calcula desde el final hasta el principio - desde el pasado hasta el presente, y el Asesor Experto mira a través de las barras desde el presente hasta el pasado. Por lo tanto, las direcciones de búsqueda también son diferentes para el Asesor Experto y el indicador.

Una última pregunta: ¿cuál debería ser el resultado de la salida?

 
artmedia70:

Esta línea se puede eliminar porque iFractals() devuelve cero como no fractal, no "valor vacío" (EMPTY_VALUE).

Mi pregunta es la siguiente: ¿intentas hacer un indicador que busque dos fractales consecutivos? ¿O está buscando en su EA dos fractales consecutivos más cercanos a la barra actual? Esta pregunta no es una curiosidad ociosa porque los métodos de búsqueda en el indicador y en el Asesor Experto son diferentes - el indicador calcula desde el final hasta el principio - desde el pasado hasta el presente, y el Asesor Experto mira a través de las barras desde el presente hasta el pasado. En consecuencia, las direcciones de búsqueda también son diferentes en el Asesor Experto y en el indicador.

Y la última pregunta: ¿cuál debe ser el resultado?



Los métodos de búsqueda en el indicador y en el EA son diferentes - el indicador calcula desde el final hasta el principio - desde el pasado hasta el presente, mientras que el EA mira a través de las barras desde el presente hasta el pasado .

for (i=kilkict;i>0;i--)

El resultado: los dos primeros -> vender (flecha hacia abajo), los dos últimos -> comprar (flecha hacia arriba). La señal aparecerá +2 barras a la derecha del fractal. Eso es lo que me gustaría ver visualmente en la historia al principio. Y probablemente necesitaremos un filtro.

 
ALXIMIKS:


...

algo así...

...


Dime, explícame, ¿cómo es que en lugar de "esto" escriben "esto"?

1. ¿No sabes que "eso" se escribe con "e", no con "f"?

2. ¿Te da pereza mover la mano hacia la letra "e", es más fácil pulsar la "e"?

3. ¿no hay una tecla "e" en el teclado? Si no, ¿por qué no?

4. ¿Es algún tipo de ponqué especial?

5. Alguna otra razón desconocida. ¿Qué es eso?