Errores, fallos, preguntas - página 1521

 
Ilya Malev:
Inserta el texto en el OnCalculate del indicador por defecto creado en el redactor. Colóquelo en cualquier gráfico. Verá el funcionamiento del indicador en la esquina superior izquierda de la ventana del gráfico. Después de seleccionar "Eliminar" de la lista de indicadores, no dejará de funcionar, lo verás en la esquina superior izquierda. Continuará incluso después de cerrar la ventana. Después de abrir una nueva ventana, continuará en la nueva ventana. Esta ventana no tiene por qué tener el mismo símbolo que la que tenías al principio :)
El trabajo del indicador se detiene sólo cuando se cierra el terminal. Y no sé si se detiene o no - sólo tuve que quitar manualmente el terminal a través del Administrador de Tareas para reiniciarlo...

Al mismo tiempo, la ayuda de la función IsStopped dice que la operación del programa se termina forzosamente después de 3 segundos si hay un comando para terminar el programa mql.

Y si se sustituye while(true) por while(!IsStopped()), el indicador se completa con éxito cuando se elimina del gráfico.

Todo está claro. Hemos hecho una indulgencia para el borrado normal.

Cuando el terminal se cierre, será duro. No más de 3 segundos.

Y no estoy seguro de que vayamos a escribir esto en la documentación, 1. para no darnos el gusto de escribir indicadores tan imprudentes (¿lo has escrito para comprobarlo?) 2. Así como se afloja, así se aprieta.

 
Alexandre:

Una causa divertida del Error Interno del Compilador (función utilizada en el indicador):

...

El remedio es obvio, pero estoy de acuerdo: un fallo muy divertido. :)))

Gracias por la publicación.

Te escribí un mensaje privado.
 
Hola. No consigo escribir un código que abra una posición en n-númerode barras después de la apertura de la posición anterior. He intentado utilizar Time[i], iBarShift, iTime. No he tenido suerte con todo esto. Soy novato en programación. La búsqueda no arrojó nada.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Saludos, para que te ayuden a encontrar el error - necesitas adjuntar el código al menos. Aquí nadie escribirá por ti, lo habitual es ayudarte a encontrar el error y corregirlo con consejos. O bien, póngase en contacto con un autónomo.
 

Aquí está el código:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

También probé de esta manera:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Tiempo[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //como ejemplo aquí puse 2700 segundos en lugar de n, lo que en las pruebas significó 3 velas de 15 minutos) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Y también así:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Tiempo[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //En este caso cuando quité 2700 la segunda operación se abrió justo después de la primera en la misma barra, tiene sentido. E incluso cuando puse cualquier valor hasta 600 en lugar de 2700, el segundo acuerdo se abrió en la misma barra. Con un valor superior a 600 la segunda operación nunca se abrió. No puedo entender cuál es el problema. Les agradecería mucho su ayuda.

Los parámetros Timer y TimerNull están en formato datetime.


 

en su ejemplo no hay enumeración de, por ejemplo, posiciones

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))

por lo que siempre selecciona la posición 0.

 
Todavía estoy escribiendo un borrador para que la lógica básica funcione. Después, lo perfeccionaré. En este caso, puedo estar equivocado, el problema está en la segunda parte del código.
 
Slawa:

Todo tiene sentido. Hizo una indulgencia para el borrado normal.

Cuando cierres el terminal, será difícil. No más de 3 segundos.

Y no estoy seguro de que vayamos a escribir esto en la documentación, 1. para no darnos el gusto de escribir indicadores tan imprudentes (¿lo has escrito para comprobarlo?) 2. Así como se afloja, así se aprieta.

Así que aprieta ya, o arregla la referencia. No complacer no es una conversación seria. Lo que los programadores esperan de usted no es "mimo", sino un software claro y bien documentado.

Por supuesto, este código no tiene otro objetivo que el de la demostración, que tú mismo has pedido. Y es bastante inofensivo, inofensivo para conseguirlo, si se quita el Sueño y se sustituye el Comentario por la Impresión. No hay protección contra el spam de gigabytes de impresión en el registro ni en Quartet ni en Quartet 5.

 
Dmitri Custurov:

Aquí está el código:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

También probé de esta manera:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Tiempo[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //como ejemplo aquí puse 2700 segundos en lugar de n, lo que en las pruebas significó 3 velas de 15 minutos) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Y también así:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Tiempo[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //En este caso cuando quité 2700 la segunda operación se abrió justo después de la primera en la misma barra, tiene sentido. E incluso cuando puse cualquier valor hasta 600 en lugar de 2700, el segundo acuerdo se abrió en la misma barra. Con un valor superior a 600 la segunda operación nunca se abrió. No puedo entender cuál es el problema. Les agradecería mucho su ayuda.

Los parámetros Timer y TimerNull están en formato datetime.


Esta es una de las posibles implementaciones. Este EA debe abrir una orden después del número de barras especificado. Y aprender a insertar correctamente el código EA, el botón SRC en la barra de mensajes.

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

La pregunta es probablemente para los desarrolladores de sitios web o los administradores de servicios Freelance

---

Solía ser: 568 trabajos completados, 75% personal

Se han añadido 13 trabajos (todos personales) y se han convertido en: 581 completados, 75% personales

---

Por lo tanto, la pregunta: descifrar por favor, ¿qué significa el 75%?

Razón de la queja: