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

 

oops :-)

Gracias.

 

¡Hola conocedores!

Aquí hay un EA. Abre una posición en un fractal arriba/abajo. ¿Cómo hago para que el stop sea 5 pips más alto (si es de COMPRA) y 5 pips más bajo (si es de VENTA) desde la parte superior del fractal?

P_up0=iCustom(0,0,"Ценовой канал", Chperiod,0,0);
   P_down0=iCustom(0,0,"Ценовой канал", Chperiod,1,0);
   P_up1=iCustom(0,0,"Ценовой канал", Chperiod,0,1);
   P_down1=iCustom(0,0,"Ценовой канал", Chperiod,1,1);
   Up=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,1,3);
   Down=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,3,3);
//задали все данные 

   total=OrdersTotal();
   if( total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if( Up> Down)
        {
         Lots= GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,3,0,0,"",16384,0,Green);
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if( Up< Down)
        {
         Lots= GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,3,0,0,"",16384,0,Red);
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if( P_down1> P_down0|| Up< Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if( TrailingStop>0)  
              {                  
               if(Bid-OrderOpenPrice()>Point* TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point* TrailingStop && OrderStopLoss()!=OrderOpenPrice()+ X*Point)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ X*Point,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if( P_up1< P_up0|| Up> Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if( TrailingStop>0)  
              {               
               if((OrderOpenPrice()-Ask)>(Point* TrailingStop))
                 {
                  if(NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(OrderOpenPrice()- X*Point,Digits))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()- X*Point,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }

Aquí he utilizado el Canal de Precios.

// условие закрытия короткой позиции
            if( P_up1< P_up0|| Up> Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
и
// условие закрытие длинной позиции
            if( P_down1> P_down0|| Up< Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }

Tengo problemas para identificar la L o la H del fractal en el que se abrió la posición.

¿¡Así de duro!?

if (NormalizeDouble (MathAbs (High [ i]-5),Digits) < Price)
 
¿qué precio del instrumento es=5?
if (NormalizeDouble (MathAbs (High [ i]-5),Digits) < Price)

así que multiplique por el precio de la cifra más baja

5*Point
 

Aquí es donde cometí un error. Gracias.

Sobre cómo establecer la parte superior del fractal en el que se abrió la posición????

 
Todas las cuestiones se resuelven con un experimento: escribe un guión y ejecútalo,
- vemos las siguientes diferencias de la función estándar iFractals()
1. el indicador por el índice fractal es exactamente igual a High/Low
2. valor inexistente del fractal ==0
int i;
   double f;
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_UPPER, i); if( f!=0) break;}
 Alert(f,"  ",High[i]," i=",i);
P.D. mira hacia atrás desde la posición con este ciclo, en el momento de la apertura de la posición, recuerda
datetime timeFractalOnOpenPos=Time[i]
 
No entiendo cómo mostrar esto en el EA. al abrir una posición, recuerda este fractal. entonces, ¿cómo se puede llamar en la condición de cierre?
 
no está claro lo que significa llamar,
en las variables globales del programa
-Recordar el tiempo de un fractal de barra para abrir una posición. Usando el tiempo de la barra, conocemos el número de barra a través de iBars()
-recuerda el precio fractal
recuerde el precio fractal - recuerde el alza/baja
¿y luego qué hacer una vez más?
 
Tal vez no lo haya puesto así, es que no tengo ni idea de cómo codificarlo.
 
¿cuántos pedidos y cuáles a cada lado?
 

por encima de todos los bloques

double UfractalBuy,LfractalBuy;

escribir el fractal más cercano al abrir una orden de compra

int i; double f;

     if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) 
            {
            Print("BUY order opened : ",OrderOpenPrice());
  
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_UPPER, i); if( f!=0) break;}
   UfractalBuy=High[ i];
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_LOWER, i); if( f!=0) break;}
   LfractalBuy=Low[ i];
            }
           }

introducir otra condición para la orden de compra

if(P_down1>P_down0||Up<Down||Close[0]+5*Point<LfractalBuy)
Razón de la queja: