Funciones útiles de KimIV - página 8

 

Hay muchas preguntas...
Es decir, surgen todo el tiempo, pero en función de cada caso.

Para las funciones que se publican ahora no hay preguntas, porque sólo miro sin "sentir" en la unidad.
También, además de ellos, hay preguntas sobre los códigos anteriores, en particular sobre el arrastre, que tiene algo que ver con
con lo escrito arriba: cómo, por qué pasar a funciones, por ejemplo, esta sección final me desconcertó:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}
El papel de ldStopLoss no está claro ...
 

oooo... :-) es una función tan antigua. Fue diseñado para cambiar el nivel de parada de una posición abierta o de una orden establecida. También había una función similar para la toma de beneficios. Ambas fueron sustituidas por una mejor y más funcional ModifyOrder().

kombat:
El papel de ldStopLoss no está claro ...

Se trata de una variable local, mediante la cual se pasa a la función ModifyStopLoss el nivel de precio al que se debe fijar el StopLoss. Por ejemplo, llamemos a la función ModifyStopLoss así:

ModifyStopLoss(1,5662);

Entonces la variable local ldStopLoss tomará el valor 1,5662. Puedes comprobarlo de esta manera:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  Print("ldStopLoss=",ldStopLoss);
 
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}

El registro contendrá este registro:

<Время> <Эксперт> <Инструмент>,<таймфрейм>: ldStopLoss=1.5662
 
KimIV:

oooo... :-) es una función tan antigua. Fue diseñado para cambiar el nivel de parada de una posición abierta o de una orden establecida. También había una función similar para la toma de beneficios. Ambas fueron sustituidas por la más perfecta y funcional ModifyOrder().


Así que... antiguo... (un poco avergonzado :)))
He echado un vistazo a las carpetas, el archivo más antiguo es del 22.01.2006.
Y parece que ni siquiera fue manipulado por mis manivelas...
Lo siento, llevo mucho tiempo practicando cosas sencillas, por ejemplo, cambiar un número.
Calculadoras sencillas, etc.

Todo esto comenzó con una solicitud para escribir un Asesor Experto en uno de los foros de PRDC, pero...
Mis céntimos no son suficientes, pero tengo que comprarlos en el mercado.
Ahora soy adicto a ella... ;) ¿Yo? Es conveniente... todo está ahí... unitor, etc, compacto, portátil.

Recuerdo mi primer y último intento con Delphi 6... Me estremezco.
Todavía tengo un par de esos discos en la estantería... :))) perdón por el offtop.


Entonces, ¿qué hay dentro de los paréntesis de function(), es algún tipo de "formulario" para pasarle algunos parámetros?


Porque por alguna razón tengo en la cabeza que es un parámetro que la función devuelve como resultado del procesamiento.
Y también es que la función recibe parámetros para ser procesados dentro de llaves...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

Es decir, todos estos Bid, Point y demás son parámetros de entrada.

Debo haber estado muy equivocado... Y lo que está dentro de los corchetes() permite pasar parámetros a una función,
mientras que la función misma puede estar ubicada en cualquier (u otro) lugar del código propio del script...

¿Verdad?

 
La pregunta es por qué, a diferencia de OpenPosition, no hay manejo de errores en ModifyOrder? También hay todo tipo de errores durante la modificación. Me gustaría tener funciones separadas para la Instalación, la Modificación y el Cierre, y una Unidad de Manejo de Errores separada para todas - menos código, más fácil de escribir, y funcionaría más rápido... Si me equivoco, corrígeme...
 
Buenos días, Igor! Tengo problemas para utilizar sus Asesores Expertos y scripts utilizando cualquier forma de arrastre en real (Alpari DC). Especialmente estoy interesado en e-News-Lucky$ (ideal para mi sistema), e-TFL_v2, Set2StopOrders, e-SotTrailing. Funciona en la demo (también en Alpari). No hay mensajes de error. ¿Qué puede ser? Y una pregunta más. ¿Cómo desactivar la vinculación horaria en e-News-Lucky$ para entrar y salir en cualquier momento? Gracias.
 
ag-forex писал (а):
Buenos días, Igor! Tengo problemas para utilizar sus Asesores Expertos y scripts utilizando cualquier forma de arrastre en real (Alpari DC). Especialmente estoy interesado en e-News-Lucky$ (ideal para mi sistema), e-TFL_v2, Set2StopOrders, e-SotTrailing. Funciona en la demo (también en Alpari). No hay mensajes de error. ¿Qué puede ser?
El problema se ha solucionado muchas veces contactando con el soporte técnico de esta empresa de intermediación.
 
kombat писал (а):
Entonces, ¿lo que hay dentro de los paréntesis de function() es una especie de "formulario" para pasarle algunos parámetros?

Sí... algo así como un contenedor :-)

kombat escribió (a):
Porque por alguna razón tengo en la cabeza lo contrario: este es el parámetro que la función devuelve como resultado del procesamiento.

Lo que la función devuelve es el valor de retorno. He aquí un ejemplo sencillo. Definimos una función que suma dos números:

int f(int a, int b) {
  int x;
  x=a+b;
  return(x);
}

Ahora, si llamamos a esta función así:

int y;
y=f(3, 5);

entonces los números 3 y 5 son los parámetros de la función f. Los parámetros de la función pueden ser números, variables o expresiones. Las variables a y b son variables locales que toman los valores de los parámetros y se los dan a la función. La variable x es el valor de retorno de la función f, es decir, después de nuestra llamada a la función f, la variable y tomará el valor que le pase la variable x, es decir, 8.

kombat:

Y también el hecho de que la función reciba parámetros que se manejen dentro de llaves...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

es decir, todos estos Bid, Point y demás son los parámetros de entrada.

no... el parámetro de la función ModifyStopLoss será el valor de la expresión Bid-TrailingStop*Point.

kombat:

Debo haber cometido un error salvaje... y lo que está entre paréntesis() permite pasar parámetros para ser procesados en la función,
la función en sí puede estar ubicada en cualquier (u otro) lugar del código del propio script...

¿Verdad?

 
sasa999:
La pregunta es: ¿por qué, a diferencia de OpenPosition, ModifyOrder no tiene tratamiento de errores?

He oído decir en alguna parte que las reglas de la carretera se escribieron con sangre. Y no hay nada superfluo en ellos. Detrás de cada palabra hay casi una vida perdida en un accidente.

Escribo mis funciones, de acuerdo con mi experiencia, e incluyo el tratamiento de los errores que se han producido en mi práctica, y no hay manera de evitarlos. Intento ser lo más "educado" posible (manejo de errores) cuando intento entrar en el mercado. Durante la modificación, la mayoría de los errores se eliminan mediante la normalización de los precios y la simple comprobación de los valores. Si se produce algún error durante la modificación, se acepta en el siguiente tick. Lo mismo ocurre en el cierre.

 

¿Para qué sirve el envío de pp - precio de apertura del pedido a esta función?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

Es como si el color ya estuviera puesto al principio... test_ModifyOrder.mq4 (12.14 KB) ... por qué no lo utiliza, pero lo reenvía a la función

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи
¿cuál es la ventaja de
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

antes de la forma corta

pp=NormalizeDouble(pp, Digits);

¿Por qué hay que normalizar OrderOpenPrice()? ¿No está en el mismo formato que en la orden?

op=NormalizeDouble(OrderOpenPrice() , dg);
Hasta ahora, no he notado ningún error si se inserta lo mismo al modificar. lo mismo con OrderStopLoss(), y OrderTakeProfit()
 
sasa999:

¿Para qué sirve el envío de pp - precio de apertura del pedido a esta función?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

Las órdenes OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT y OP_SELSTOP se desplazarán.

sasa999:

Además, el color ya está más o menos definido desde el principio... test_ModifyOrder.mq4 (12.14 KB) ...por qué no lo usas, y reenvías a la función

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи

Gracias. Lo usaré.

sasa999:
cuál es la ventaja
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

antes de un formulario corto

pp=NormalizeDouble(pp, Digits);

La versatilidad que permite al EA trabajar con posiciones y órdenes no sólo para el símbolo actual, sino también para otros símbolos. Por ejemplo, el EA funciona en el gráfico del EURUSD. Una variante con Dígitos no permitirá trabajar con posiciones abiertas en USDJPY.

sasa999:

¿Por qué hay que normalizar el OrderOpenPrice()?

op=NormalizeDouble(OrderOpenPrice() , dg);

Es para poder comparar con éxito valores de tipo doble. Si no está normalizado, la comparación es imposible o más bien carece de sentido.

sasa999:
No se nota un error si se vuelve a poner lo mismo al modificar. lo mismo con OrderStopLoss(), y OrderTakeProfit()
Sin la normalización, la función genera el error 1(OrderModify intenta cambiar valores ya establecidos con los mismos valores).