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 .
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); } //+------------------------------------------------------------------+
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?
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).
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.
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.
externdouble TakeProfit = 150;
externdouble Sl = 150;
externdouble Lots = 0.1;
externint 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());
elsePrint("Ошибка при открытии 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());
elsePrint("Ошибка при открытии 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();
elsebreak;
}
}
}
elsePrint( "Error when order select ", GetLastError());
//----
}
}
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
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 ...
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?
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).
¿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
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.