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

 
IgorM:

¿cuál es la mejor manera de guardar los datos/variables importantes en caso de que el terminal se cuelgue (fallo de alimentación)?

- variables globales de la terminal? a un archivo?

- ¿con qué frecuencia hay que guardarlas? (el último valor de la equidad y algunos bools son importantes)

Cuál es el problema, todo a un array, y el array a un archivo en cada tick, leer el archivo en la inicialización, y sin problemas
 

¡Hola!

No puedo entender por qué no puedo modificar una posición abierta, escribí la orden (en la función de selección de orden)

//+------------------------------------------------------------------+
|| Noticias comercio.mq4 |
//| Copyright © 2010, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp.
#enlace de propiedad "http://www.metaquotes.net"


extern bool In_BUYSTOP=true;
extern intProfit_buy=100;
extern int StopLoss_buy=5;
extern double Lotes_compra=0,01;
//+------------------------------------------------------------------+
extern bool In_SELLSTOP =true;
extern inttern Beneficio_venta=100;
extern int StopLoss_sell =5;
extern double Lots_sell =0,01;
extern int LevelProfit = 25; // - Nivel de beneficio en puntos, que es necesario alcanzar para trasladar su stop al nivel de Breakeven.
extern int LevelWLoss = 1; // - Nivel de equilibrio en puntos, al que se moverá la posición de stop después de que su beneficio alcance el nivel LevelProfit en puntos.

//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
//----
int profitbuy=((Bid - OrderOpenPrice())/Point); // BUY
int profitsell=((OrderOpenPrice()- Ask)/Point); // VENDER
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
//----
{
int ticket;
if (Oferta >iHigh(NULL,PERIOD_D1,1))
{
if(PedidosTotal() < 1)
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots_sell,iHigh(NULL,PERIOD_D1,1),3,iHigh(NULL,PERIOD_D1,1)+StopLoss_sell*Point,iHigh(NULL,PERIOD_D1,1)-TakeProfit_sell*Point,Hour() == 21 && Minute() == 59)
}
if (Ask <iLow(NULL,PERIOD_D1,1))
{
if(PedidosTotal() < 1)
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots_buy,iLow(NULL,PERIOD_D1,1),3,iLow(NULL,PERIOD_D1,1)-StopLoss_buy*Point,iLow(NULL,PERIOD_D1,1)+TakeProfit_buy*Point,Hour() == 21 && Minute() == 59)
}
return(0);
}
//+------------------------------------------------------------------+
if(OrderSelect(0, SELECT_BY_POS,MODE_TRADES)==true)
{
int tipo_pedido=Tipo_pedido();
order_type=OP_SELL;
int profitsell=((OrderOpenPrice()- Ask)/Point);
si (beneficios>5)
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),0,Blue);
return(0);
}
if(OrderSelect(0, SELECT_BY_POS,MODE_TRADES)==true)
{
order_type=OP_BUY;
int profitbuy=((Bid - OrderOpenPrice())/Punto);
si (profitbuy>5)
int stopmodify=OrderOpenPrice();
OrderModify(OrderTicket(),OrderOpenPrice(),stopmodify,OrderTakeProfit(),0,Blue);
return(0);
}
 

Estimados desarrolladores, una pregunta para ustedes.

No consigo que la variable global del indicador funcione correctamente al llamar al indicador desde un Asesor Experto.

Aquí está el código del indicador (sólo las cadenas que son importantes para entender la pregunta).

double  price;
double  PriceBuffer[];

int init()
{
   SetIndexBuffer(0,PriceBuffer);
   return(0);
}
int start()
{
   int limit, i;
   int counted_bars=IndicatorCounted();
   
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(i=limit-1; i>=0; i--)
   {
        PriceBuffer[i] = price;
        price = iClose(NULL,0,i);
   }
   return(0);
}

En cada barra guarda el precio actual en la variable global precio y lo muestra en la siguiente barra. Así, deberíamos ver el gráfico de precios retrasado en una barra. Si adjuntamos el indicador al gráfico, todo funciona correctamente:

Pero si se llama a este indicador desde el EA y se realiza una prueba visual, veremos al final de la prueba: el indicador es sólo ligeramente similar a lo que se supone que es.

Si ahora volvemos a calcular el indicador en el gráfico de pruebas visuales (por ejemplo, abrir y cerrar sus propiedades), todo vuelve a la normalidad: volvemos a ver la primera imagen.

¿Qué estoy haciendo mal?

He hecho una búsqueda, pero no he encontrado ninguna respuesta.

Utilizo la versión 4.00 de MT4 Build 226.

 
Creo que es porque no hay suficientes garrapatas en la historia. Por eso falta. En tiempo real, todo debería estar claro. ;)
 

Hola, por favor, avisa en qué parte del código hay una inexactitud, ya que cuando el script funciona aparece ese error en el registro:

15:40:29 11dP_real_symbol EURUSD,H4: <--- 2 gráficos correctos encontrados. --->

15:40:29 11dP_real_symbol EURUSD,H4: <--- Para ver los resultados, abra el gráfico EURUSD,M1002 --->

15:40:29 11dP_real_symbol EURUSD,H4: el nombre del símbolo para la función MarketInfo debe ser una cadena

15:40:29 11dP_real_symbol: parámetro de cadena vacío para la función FileWriteString

15:40:29 11dP_real_symbol EURUSD,H4: el nombre del símbolo para la función MarketInfo debe ser una cadena

15:40:29 11dP_real_symbol EURUSD,H4: <--- Para ver los resultados, abra los gráficos,M1002 --->

15:40:29 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

15:40:30 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

15:40:31 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

A continuación adjunto el código propiamente dicho:

Archivos adjuntos:
11dp.mq4  15 kb
 
IgorM:

¿cuál es la mejor manera de guardar los datos/variables importantes en caso de que el terminal se cuelgue (fallo de alimentación)?

- variables globales de la terminal? a un archivo?

- ¿con qué frecuencia hay que guardarlas? (el último valor de la equidad y algunos bools del asesor son importantes)


A diferencia de otras variables, una variable GV no sólo puede ser creada desde cualquier programa, sino que también puede ser eliminada. El valor de la variable GV permanece en el disco duro del ordenador incluso después de cerrar el terminal cliente. Una vez declarada la variable GV existe en el terminal del cliente durante 4 semanas desde la última llamada. Si ningún programa ha accedido a la variable GV durante este periodo, la variable GV es borrada por el terminal cliente. Una variable GV sólo puede ser de tipo double.
 
etroplus:

¡Hola!

No puedo entender por qué no puedo modificar una posición abierta, escribí la orden (en la función de selección de orden)

//+------------------------------------------------------------------+
|| Noticias comercio.mq4 |
//| Copyright © 2010, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp.
#enlace de propiedad "http://www.metaquotes.net"


extern bool In_BUYSTOP=true;
extern intProfit_buy=100;
extern int StopLoss_buy=5;
extern double Lotes_compra=0,01;
//+------------------------------------------------------------------+
extern bool In_SELLSTOP =true;
extern inttern Beneficio_venta=100;
extern int StopLoss_sell =5;
extern double Lots_sell =0,01;
extern int LevelProfit = 25; // - Nivel de beneficio en puntos, que es necesario alcanzar para trasladar su stop al nivel de Breakeven.
extern int LevelWLoss = 1; // - Nivel de equilibrio en puntos, al que se moverá la posición de stop después de que su beneficio alcance el nivel LevelProfit en puntos.

//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
//----
int profitbuy=((Bid - OrderOpenPrice())/Point); // BUY es redundante, primero todas las variables son iguales a 0
int profitsell=((OrderOpenPrice()- Ask)/Point); // VENDER
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
//----
{
int ticket;
if (Oferta >iHigh(NULL,PERIOD_D1,1))
{
if(PedidosTotal() < 1)
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots_sell,iHigh(NULL,PERIOD_D1,1),3,iHigh(NULL,PERIOD_D1,1)+StopLoss_sell*Point,iHigh(NULL,PERIOD_D1,1)-TakeProfit_sell*Point,Hour() == 21 && Minute() == 59)
}
if (Ask <iLow(NULL,PERIOD_D1,1))
{
if(PedidosTotal() < 1)
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots_buy,iLow(NULL,PERIOD_D1,1),3,iLow(NULL,PERIOD_D1,1)-StopLoss_buy*Point,iLow(NULL,PERIOD_D1,1)+TakeProfit_buy*Point,Hour() == 21 && Minute() == 59)
}
return(0);
}
//+------------------------------------------------------------------+
if(OrderSelect(0, SELECT_BY_POS,MODE_TRADES)==true)
{
int tipo_pedido=Tipo_pedido();
order_type=OP_SELL;//tal vezsi(order_type==OP_SELL), entonces se necesitan más paréntesis
int profitsell=((OrderOpenPrice()- Ask)/Point);
if (profitsell>5)//¿Por lo tanto, intentará modificar la orden cada tick?
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),0,Blue);
return(0);
}
if(OrderSelect(0, SELECT_BY_POS,MODE_TRADES)==true)
{
order_type=OP_BUY;
int profitbuy=((Bid - OrderOpenPrice())/Punto);
si (profitbuy>5)
int stopmodify=OrderOpenPrice();
OrderModify(OrderTicket(),OrderOpenPrice(),stopmodify,OrderTakeProfit(),0,Blue);
return(0);
}
 
Hola, por favor, indique en qué parte del código hay una inexactitud, ya que hay un error de este tipo en el registro cuando el script se está ejecutando:


15:40:29 11dP_real_symbol EURUSD,H4: <--- 2 gráficos correctos encontrados. --->

15:40:29 11dP_real_symbol EURUSD,H4: <--- Para ver los resultados, abra el gráfico EURUSD,M1002 --->

15:40:29 11dP_real_symbol EURUSD,H4: el nombre del símbolo para la función MarketInfo debe ser una cadena

15:40:29 11dP_real_symbol: parámetro de cadena vacío para la función FileWriteString

15:40:29 11dP_real_symbol EURUSD,H4: el nombre del símbolo para la función MarketInfo debe ser una cadena

15:40:29 11dP_real_symbol EURUSD,H4: <--- Para ver los resultados, abra los gráficos,M1002 --->

15:40:29 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

15:40:30 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

15:40:31 11dP_real_symbol EURUSD,H4: el primer parámetro de la función WindowHandle debe ser una cadena inicializada

Yo mismo adjunto el código a continuación:
Archivos adjuntos:
11dp_1.mq4  15 kb
 

Por favor, dígame qué significa la variable "OP BUY" esperada

here while(difference>Span)
( OrderSend (string symbol, OP_BUY, volume, double price, slippage,Bid-stoploss*Point,
Bid+takeprofit*Point, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=Red) )

while(0-different>Red)
( OrderSend (string symbol, OP_SELL, volume, double price, slippage,Ask+stoploss*Point,
Ask-takeprofit*Point, string comment=NULL, string comment=0, int magic=0, datetime expiration=0, color arrow_color=Black) )

 
¿Cómo escribo un punto en el gráfico en mql4? Necesito escribir el precio y la hora para que se mantenga en cualquier marco temporal