Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 19

 
Vitalie Postolache:
No seas así ))))
la razón no es mql4
 
Vitalie Postolache:

No funciona mucho así. Los argumentos de esta función son 1) la cadena a buscar; 2) la combinación de caracteres a encontrar; 3) el inicio de la búsqueda (por defecto, desde el carácter nulo de la cadena según el punto 1).

Devuelve el número de posición en la cadena, en la que comienza la subcadena buscada, o -1 si no se encuentra ninguna subcadena.

Por lo tanto, debería escribirse así:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Gracias por la respuesta... Así, la funciónStringFind con sus parámetros ( string_value, string match_substring, int start_pos=0 ) se escribe en código común en una línea con

argumentos correspondientes a los datos de los parámetros de la función: string OrderComment(), string "[tp]", int 0 y si esta expresión (encerrada entre llaves) es mayor que -1 , se ejecuta el siguiente código {entre paréntesis

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doble OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Orden #",OrderTicket()," beneficio: ", OrderTakeProfit());

si no

Print("OrderSelect() devuelve un error ",GetLastError());

bool PlaySound(

string payment // donde "payment" esel nombre del archivo en la carpeta MT4 Sound

);

}

... ¿Funcionará este código en MQL4? ...

 
bablusut:

Gracias por la respuesta... Resulta que la funciónStringFind con sus parámetros ( string_value, string match_substring, int start_pos=0 ) se escribe en código común en una línea con

argumentos correspondientes a los datos de los parámetros de la función: string OrderComment(), string "[tp]", int 0 y si esta expresión (encerrada entre llaves) es mayor que -1 , se ejecuta el siguiente código {entre paréntesis

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doble OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Orden #",OrderTicket()," beneficio: ", OrderTakeProfit());

si no

Print("OrderSelect() devuelve un error ",GetLastError());

bool PlaySound(

string payment // donde "payment" esel nombre del archivo en la carpeta MT4 Sound

);

}

... ¿Funcionará este código en MQL4? ...

double OrderTakeProfit(); - el código debería tener un error al compilar.

Por lo que entiendo (aún lo estoy estudiando), OrderTakeProfit(); solicita el beneficio de la orden al mercado. Así, nuestro Asesor Experto hace 2 peticiones para estas pocas líneas OrderTakeProfit(); parece que esta línea debe ser eliminada (double OrderTakeProfit(); )

 
bablusut:

Gracias por la respuesta... Resulta que la funciónStringFind con sus parámetros ( string_value, string match_substring, int start_pos=0 ) se escribe en código común en una línea con

argumentos correspondientes a los datos de los parámetros de la función: string OrderComment(), string "[tp]", int 0 y si esta expresión (encerrada entre llaves) es mayor que -1 , se ejecuta el siguiente código {entre paréntesis

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doble OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Orden #",OrderTicket()," beneficio: ", OrderTakeProfit());

si no

Print("OrderSelect() devuelve un error ",GetLastError());

bool PlaySound(

string payment // donde "payment" esel nombre del archivo en la carpeta MT4 Sound

);

}

... ¿Funcionará este código en MQL4? ...

Esto ya se ha mencionado:doble OrderTakeProfit() - no lo hagas. Esta función se declara automáticamente y no debe volver a declararse. El compilador generará un error, ya que no es necesario declarar previamente las funciones estándar.

if(OrderSelect(12, SELECT_BY_POS)==true) - si hacemos eso, entonces, en el mejor de los casos, esta será otra orden, y no la que se ha procesado el comentario anterior. El orden debe estar ya seleccionado al principio antes deif(StringFind(OrderComment(),"[tp]",0)>-1) y el contador del bucle debe usarse como argumento del número de orden, no como una constante, de lo contrario se comprobará el 12º orden en cada iteración.

 
Vitalie Postolache:

Ya lo han dicho:doble OrderTakeProfit() - no lo hagas. Esta función se declara automáticamente y no debe ser declarada repetidamente. El compilador generará un error, ya que las funciones estándar no necesitan ser declaradas previamente.

if(OrderSelect(12, SELECT_BY_POS)==true) - si lo hacemos, entonces, en el mejor de los casos, se tratará de otra orden, y no de la que se ha procesado el comentario anterior. La orden debe haber sido seleccionada al principio, antes deif(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

double OrderTakeProfit(); - se supone que se bloquea aquí al compilar.

Por lo que entiendo (yo mismo lo sigo entendiendo), OrderTakeProfit(); hace la petición de beneficio de la orden al mercado. Así, nuestro Asesor Experto hace 2 peticiones para estas pocas líneas OrderTakeProfit(); parece que esta línea debe ser eliminada (double OrderTakeProfit(); )

Gracias por el comentario - resultó tener razón.
 
"Vitalie Postolache:

Ya lo han dicho:doble OrderTakeProfit() - no lo hagas. Esta función se declara automáticamente y no debe ser declarada repetidamente. El compilador generará un error, ya que las funciones estándar no necesitan ser declaradas previamente.

if(OrderSelect(12, SELECT_BY_POS)==true) - si hacemos eso, entonces, en el mejor de los casos, esta será otra orden, y no la que se ha procesado el comentario anterior. La orden debe estar ya seleccionada al principio, antes deif(StringFind(OrderComment(),"[tp]",0)>-1) y debemos establecer el contador del bucle como un argumento del número de la orden, no una constante.

Gracias por la respuesta... La declaración de la funcióndoble OrderTakeProfit() es comprensible, vamos a eliminarla.

"Si tenemos un solo contador de bucle en el código anterior, en la funciónOrdersHistoryTotal, el operador de bucle for con el cuerpo(i=0;i<accTotal;i++) debeutilizarse como argumento del número de pedido, lo que significa que debemos sustituir el cuerpo del operador por el cuerpo dela funciónOrderSelect y lo obtendremos

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

if(OrderSelect(i=0;i<accTotal;i++)==true)

Print("Orden #",OrderTicket()," beneficio: ", OrderTakeProfit());

si no

Print("OrderSelect() devuelve un error ",GetLastError());

bool PlaySound(

string payment // donde"payment" esel nombre del archivo en la carpeta MT4 Sound

);

}

... ¿Funcionará este código en MQL4? ...




 
bablusut:

Gracias por la respuesta... La declaración de la funcióndoble OrderTakeProfit() es clara, vamos a eliminarla.

"Elcontador de bucle debe utilizarse como argumento del número de pedido" - en el código anterior, tenemos sólo un contador de bucle, el operador loop for en la funciónOrdersHistoryTotal con el cuerpo(i=0;i<accTotal;i++), significa que debemos sustituir el cuerpo del operador por el cuerpode la funciónOrderSelect y lo obtendremos:

Otra vez. En el trabajo con la orden, el primer lugar debe ser OrderSelect. Y luego todo lo demás.

Si trabajamos en un bucle alrededor de la orden, el orden de las operaciones es el siguiente

1. Comprobación if(OrderSelect())

2. Para comprobar si es la orden correcta, normalmente se comprueba el símbolo y el número mágico, y luego se comprueba el tipo if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - en este caso sólo se procesan las órdenes de mercado colocadas para el símbolo actual y con el número mágico especificado

Procesamiento de otros datos como OrderComment(), OrderProfit(), etc.

El aspecto sería el siguiente

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
¿Cómo puedo comprobar si hay un valor de señal en un búfer o en el otro del indicador iCustom?
 
Vitalie Postolache:
Una vez más. OrderSelect debería estar en primer lugar cuando se trabaja con un pedido. Luego todo lo demás.

Lo han decidido por ensayo y error aparentemente, pero es caro, yo mismo he pasado por eso...

Me pitan los oídos para ser sincero...

 
atik441:
¿Cómo puedo comprobar si hay un valor de señal en la memoria intermedia del indicador iCustom?
Siga el enlace, está resaltado en su puesto.
Razón de la queja: