Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1257

 
¿Por qué están disponibles los puntos de tiempo y precio 2 a 30 enObjectCreate? Intenté añadirlos al gráfico, pero sólo se muestra el primer punto
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

No es necesario escribir este código en OnInit, sino en OnTick().

Lo he probado y no funciona en absoluto.
1 advertencia
 
Igor Makanu:

No, no puedes.

No puedo explicar cómo funcionan las plantillas de .... es así - hasta que no se llama a dicha función, el compilador no sabe nada de su existencia (a menudo, incluso no hay errores de compilación si no hay llamada)

entonces se llama a dicha función de plantilla y el compilador rellena los tipos necesarios y sólo entonces comprueba que todo funcione correctamente

y luego haces otra llamada a la plantilla con diferentes tipos de parámetros - y el compilador crea una nueva función, es decir, otra, es decir, como si escribieras 2 funciones, que hacen lo mismo, pero con diferentes tipos de parámetros


uf, así es como funciona ))))



UPD:

puede, pero si los tipos en la plantilla coinciden, aquí hay un ejemplo, funciona correctamente:

Gracias, aún más claro que en los docs) Resulta que en la plantilla la predefinición de variables no permite no especificarlas. Lo necesito para imprimir en un archivo. El registro no me da la opción de dividir los registros. Ojalá hubiera 5 troncos). Como resultado, las plantillas dan una opción para no llevar el tipo de variable al deseado, se puede hacer dentro de una función de la plantilla, pero el número de variables debe ser especificado en su totalidad. Una función simple con variables predefinidas del tipo requerido da la oportunidad de especificar menos variables en una llamada, pero los tipos de variables deben ser llevados al correcto. Por supuesto, esto se puede hacer en la convocatoria, pero el registro será demasiado largo.

 
Valerius:

¡Buenas tardes a todos!

Hice una función para modificar el stoploss. Pero cuando funciona da EURUSD,H1: OrderModify error 130.

Y el precio está muy lejos del lugar donde se debe fijar el stoploss.

Esta es la función:


....
    err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point, 
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
  {
   double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Increased the distance of a stop order or the opening price of pending orders.");
     }
   return(Parametr);                            // Возврат значения
  }
 
Valerius:

Inténtalo de esta manera:


Gracias, ha funcionado.

Pero dos matices más:

1 ¿qué condición añadir para no cerrar las órdenes que se abrieron el viernes de la semana actual, y los viernes de las semanas anteriores, respectivamente, se cerraron?

2. cómo corregir el código - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

¿para eliminar la advertencia de"posible pérdida de datos debido a la conversión de tipo"? Parece que se trata de "...MarketInfo(nameSym,MODE_DIGITS)...".

 
Buenas noches. ¿Cómo debería ser el código que selecciona el último pedido cerrado? ¿Es así:"OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY"?
 
La función GetAmountLotFromOpenPos devuelve -1717986918 ¿cómo puedo solucionarlo?
 

Por favor, avisa.

En el probador, el valor de retorno de la función de suma de lotes GetAmountLotFromOpenPos da un valor de -1717986918.

 
Valeriy Yastremskiy:

He encontrado la razón. Debería haber puesto OrderTakeProfit() en OrderModify en lugar de OrderProft(). Lo he revisado un poco.

Gracias por la ayuda de todos modos.

 
Yerkin Sagandykov:

Gracias, ha funcionado.

Pero dos matices más:

1 ¿qué condición añadir para no cerrar las órdenes que se abrieron el viernes de la semana actual, y los viernes de las semanas anteriores, respectivamente, se cerraron?

2. cómo corregir el código - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

¿para eliminar la advertencia de"posible pérdida de datos debido a la conversión de tipo"? Debe tratarse de "...MarketInfo(nameSym,MODE_DIGITS)...".

Para la primera pregunta, tienes que hacer esta función:


for(int is=Total de Pedidos()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{//Cierre las órdenes que se han abierto el viernes de la semana que no es la actual. En este caso, no cerramos los pedidos el viernes de la semana en curso.
if(OrderMagicNumber()==Magic && TimeDayOfWeek(TimeCurrent())==5 && TimeDayOfWeek(OrderOpenTime())==5 && TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent())
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(!result) {error=GetLastError(); Print("LastError = ",error, ",Symbol()); }
si no {error=0;}
si no
{Print("NoMagic ",OrderMagicNumber();} // para Debug
si no

{Print("Error al seleccionar el pedido ", GetLastError();}


Para la segunda pregunta, debería haber la siguiente entrada:

OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE);

Buena suerte.