[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 303

 
costy_:

Hay muchas opciones, por ejemplo, registrar los tiempos de apertura en un archivo, pero es más fácil desplazarse por las órdenes de apertura y comparar los tiempos de vida

.

"

Es necesario cerrar todas las posiciones abiertas después de un intervalo de tiempo

especificado" para cada posición individual (así es como he entendido la pregunta). ¡gracias! La palabra "más fácil" en su respuesta es la palabra clave, significa que no hay tal función incorporada. Sólo quería cerrar cada posición individual 2 horas después de su apertura .
 
costy_:

El script no encontrará el tiempo del probador tan fácilmente (pero el indicador sí), puede adjuntar el asesor de pruebas al inicio

de forma rápida y fiable ...

Gracias. Lo hice en el guión así:
    datetime time_start=GlobalVariableGet( "Time_test");
//    Alert(iBarShift(NULL,0,time_start)); 
    EndBar =  iBarShift(NULL,0,time_start);
Todo funciona.
 

Tratando de escribir un inikator. No entiendo por qué se redibuja. Además, sólo recurre al renderizado. Por favor, ayúdame. Soy nuevo en la programación.

#propiedad ventana_del_gráfica_del_indicador
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Rojo
//---- parámetros de entrada
extern int N;
datetime some_time=D'1971.01.11 00:00';
datetime some_time_1=D'1971.01.11 00:00';
//---- buffers
doble RLB_Buffer[];
double RLB_Buffer_1[];
double Línea_real_Balance=0,x=0,última_alta,última_baja,RLB, Línea_real_Balance_1=0,x1=0,última_alta_1,última_baja_1,RLB_1;
bool dirlong,first;
int i,ii,barra_alta,barra_baja,primera_barra,barra_ahora,primera_barra_1,barra_ahora_1;
//+------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int init()
{
nombre_corto_de_cadena;
//---- línea indicadora
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 159);
SetIndexBuffer(0,RLB_Buffer);
//----;
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexBuffer(1,RLB_Buffer_1);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int inicio()
{
int barras_contadas=IndicadorContado();
Comentario(i," ",ii);
//----
if(Bares < 3)
return(0);
//----------
first_t_bar=iBarShift(NULL,0,some_time,false); //la tendencia de las barras es ascendente
now_bar=iBarShift(NULL,0,TimeCurrent(),false); //última barra, la más a la derecha
i=barras contadas-primera_barra+1;
//------------
first_t_bar_1=iBarShift(NULL,0,some_time_1,false); //barra de inicio de tendencia
now_bar_1=iBarShift(NULL,0,TimeCurrent(),false); //última barra, la más a la derecha
ii=barras contadas-primera_barra_1+1;
// if(IsVisualMode()==TRUE) i=first_t_bar-counted_bars-1; //if(counted_bars), then trend start bar
if(counted_bars == 0)
{
primero = falso;
i=primera_t_barra+1;
ii=primera_barra_1+1;
}
//------------ //contabilización de las barras negativas
dirlong = false;
if(iMA(NULL,0,1,0,MODE_SMA,PRICE_MEDIAN,0)>iMA(NULL,0,2,0,MODE_SMA,PRICE_MEDIAN,0))dirlong = true;
if(dirlong == true) //si la tendencia es al alza
{
while(i>=0)
{
x++; //cuento de barras desde el inicio de la tendencia
Real_Line_Balanse=Cerrada[i+5]; //Cuento de la suma de ralentizaciones de la tendencia
RLB=Real_Line_Balanse;
if(RLB<Low[1]) RLB_Buffer[i]=Real_Line_Balanse; //muestra la línea sólo si el precio es alcista
//-------
if(RLB>Close[i]&& x>50) //si el precio ha cruzado el RLB de arriba a abajo
{
bar_high=iHighest(NULL,0,MODE_HIGH,first_t_bar,now_bar);//entonces determinar HIGH entre
//última barra e inicio de la tendencia
tiempo_1=Tiempo[barra_alta]; //nuevo comienzo de la tendencia bajista
x=0; //puesta a cero del contador de barras desde el inicio de la tendencia
Real_Line_Balanse=0;
}
i--;
}//mientras
//-------
}//dirlong
//---------------------
//---------------------
if(dirlong == false) //si la tendencia es a la baja
{
while(ii>=0)
{
x1++; //conteo de barras desde el inicio de la tendencia
Real_Line_Balanse_1=Cerrar[ii+10]; //contar la cantidad de barras de la tendencia
RLB_1=Línea_Real_Balanse_1;
if(RLB_1>High[1]) RLB_Buffer_1[ii]=Real_Line_Balanse_1;
//-------
if(RLB_1<Close[ii]&& x1>50) //si el precio ha cruzado el RLB de arriba a abajo
{
bar_low=iLowest(NULL,0,MODE_LOW,first_t_bar_1,now_bar_1);//entonces determina el LOW entre
//última barra e inicio de la tendencia
some_time=Time[bar_low]; //nuevo comienzo de la tendencia al alza
x1=0; //puesta a cero del contador de barras desde el inicio de la tendencia
Real_Line_Balanse_1=0;
}
ii--;
} //mientras
//-------
}//dirlong
//---------------------
return(0);
}
//+------------------------------------------------------------------+

 

Esto es una tontería. En lugar de

i=barras contadas-primera_barra+1;

Puse un diseño que cuenta las barras que se cuenta a sí mismo. Todo empezó a funcionar bien. IndicatorCounted(); falla o no lo entiendo...

 

¿cómo informar a una variable sobre el estado de una orden cerrada?


avatar
2
vitaluxa 29.10.2011 21:26
¡Hola!

Si un EA ha abierto una orden y se ha cerrado en Stop Loss o Take Profit, ¿cómo informo a la variable de que la orden se ha cerrado exactamente en Stop Loss o Take Profit?
Gracias de antemano.
 
001:

Esto es una tontería. En lugar de

i=barras contadas-primera_barra+1;

Puse una construcción que cuenta las barras contadas en sí. Todo va bien. IndicatorCounted(); falla o no lo entiendo...

Se utiliza while(i>=0), de modo que cuando aparece una nueva vela, i=1 (para asegurarse de que los datos de la vela anterior se cuentan con los datos registrados una vez).

Por qué introducir some_time=D'1971.01.11 00:00'; usar Bares , IndicatorCounted no me funciona (bueno, el error es probablemente por el first_t_bar).

Su algoritmo y debería arreglarlo.

"Soynuevo en la programación."Desde 2007).

 
sergeev:

¿cómo informar a una variable sobre el estado de una orden cerrada?


:)

+ ...

Para Vitaluha:

https://docs.mql4.com/ru/trading/OrderStopLoss

https://docs.mql4.com/ru/trading/OrderTakeProfit

 
Buenas tardes, ¿podrían decirme por qué no se pueden subir las cotizaciones del 10 de junio al 22 de septiembre de este año? He hecho dos o tres cargas del historial y todas tienen el mismo hueco en los datos.
 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Закрвает открытые позиции через 2 суток
void DelOldPositions()                                    
{   
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
    {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        {
         if (OrderOpenTime()+2*24*60*60  > TimeCurrent())  
          {
           OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,4 ),3,Red);
          }
        }
   }
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
Помогите поправить 2 последние строки, т.к. в тестере почему-то  мгновенно  закрывает все открытые позы. С уважением.
 

El problema es que el EA reabre constantemente las órdenes, es decir, hay una señal de compra - abre una orden, luego la cierra en beneficio, y las condiciones se conservan la abre de nuevo.

Pensé que se podría manejar con el contador tradicional de compra y venta - si una orden de compra ha abierto el contador +1 y una nueva compra no puede ser abierta hasta que el contador sea 0 y el contador se restablece sólo cuando se cierra.

extern double TakeProfit = 150;
extern double Sl = 150;
extern double Lots = 0.1;
extern int n = 9;     
        
//-----------------------------------------------------------

int start()
 {
  int cnt, ticket, total, i, Buy=0, Sell=0;
  double x1=iIchimoku(NULL,0,9,26,52,MODE_TENKANSEN,0);   //красная
  double x2=iIchimoku(NULL,0,9,26,52,MODE_KIJUNSEN,0);    //синяя
  double x3=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,0); //фиол пунктир
  double x4=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,0);  //кр пунктир
  double x5=iIchimoku(NULL,0,9,26,52,MODE_CHINKOUSPAN,0);  //зеленая
  double x6=Ask;
  double x61=Bid;
  double Lot=0;  
  total=OrdersTotal();
  
  for (i=total-1;i>=0;i--)   //счетчик выставленных ордеров
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       {
         if(OrderType()==OP_BUY)
          { 
           Buy++;
            }  
          if (OrderType()==OP_SELL)
           { 
            Sell++;
             }  
        }
     }
  if(total<1)//проверка количества ордеров 
   {
    
         if(AccountFreeMargin()<(100*Lots))
              {
     Print("Недостаточно средств = ", AccountFreeMargin());
     return(0);  
               }

         if (x6>x3 && x6>x4 && x1>x2 && x6>x2 && x6<(x2+60) && Buy==0) //бай
               {
                   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Sl*Point,Ask+TakeProfit*Point,0,0,0,Green); Sell=0; // ордер и обнуление счетчика
                      if(ticket>0)
                      {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
      
                         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
                        }
              }
   
         if (x6<x3 && x6<x4 && x1<x2 && x6<x2 && x6>(x2-60) && Sell==0) //селл 
                {
                   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Sl*Point,Bid-TakeProfit*Point,0,0,0,Red); Buy=0; //сам по себе ордер и обнуление счетчика 
                     if(ticket>0)
                     {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
    
                         else Print("Ошибка при открытии SELL позиции : ",GetLastError());
      
                      } 
    
                  }
  
  
  } 

   if((OrderType()==0 && x61<x3 && x61<x4 && x1>x2 && x1>x3 && x1>x4) || (OrderType()==1 && x61>x3 && x61>x4 && x1<x2 && x1<x3 && x1<x4)) //закрытиеи на развороте
      {
          bool   result;
          double price;
          int    cmd,error;
//----
          if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
              {
                  cmd=OrderType();
                  if(cmd==OP_BUY || cmd==OP_SELL)
                    {
                      while(true)
                        {
                         if(cmd==OP_BUY) price=Bid;
                         else            price=Ask;
                         result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
                         if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
                         else error=0;
                         if(error==135) RefreshRates();
                         else break;
                        }
                     }
               }
          else Print( "Error when order select ", GetLastError());
//----
          
      }
 
 }
 
 
Archivos adjuntos: