Se necesita ayuda - página 8

 
qgmql:

Si no es así, por favor escriba un código en lugar de un enlace, todavía estoy confundido.


NO https://www.mql5.com/en/forum/133792/page3#550831

da el pipvalue para un lote negociado en un símbolo específico

 

1. Hay algunas órdenes de compra abiertas y una orden de compra pendiente. todas las órdenes están en el mismo par de divisas. ¿cómo un EA seleccionará sólo la última orden abierta para comprobar sus límites de parada?

2. cada orden abierta fue colocada a diferentes precios con tp 20. ¿es posible que el EA modifique todas las órdenes abiertas excepto la última, y cambie sus límites de parada a los límites de parada de la última orden abierta?

EJEMPLO:

Sr    type   price     tp
1     buy    1.23950   1.23750
------------------------------
#  buylimit   1.23750   1.23550

//////////////////////////////

1    buy     1.23950   1.23550 // tp modified and now equal to 2nd tp
2    buy     1.23750   1.23550 // 2nd tp
------------------------------
#  buylimit   1.23550   1.23350

//////////////////////////////

1    buy     1.23950   1.23350 // tp modified and now equal to 3rd tp
2    buy     1.23750   1.23350 // tp modified and now equal to 3rd tp
3    buy     1.23550   1.23350 // 3rd tp
------------------------------
#  buylimit   1.23350   1.23150
 

Alguna confusión con...

//Signal Filter
#define  XXX   0
#define  AAA   1
#define  BBB   2

int SignalS = XXX;

if(SignalS & AAA !=0)
OrderSend(NULL, OP_BUY, LotSize, Ask, Slippage, SL, TP, WindowExpertName(), MagicID, 0, Blue);

El antiguo editor acepta las líneas resaltadas, pero el nuevo editor da la advertencia "Expresión no booleana"

He probado entonces...

if(SignalS && AAA !=0)
//or
if(SignalS !=0 & AAA !=0)

Ahora el nuevo editor acepta ambos, pero... ¿cuál funcionará igual que la línea resaltada? si ambos son verdaderos, entonces ¿cuál debo usar? (¿es más conveniente?)

PD: El código de abajo también es aceptado por el nuevo editor...

if((SignalS & AAA) !=0)

El nuevo editor acepta los tres, pero... ¿cuál funcionará igual que la línea resaltada? si todos son verdaderos, entonces ¿cuál será más conveniente para mí?

 
qgmql: El nuevo editor acepta las tres, pero... ¿cuál funcionará igual que la línea resaltada? si todas son verdaderas, ¿cuál será más conveniente para mí?
  1. No utilice una máscara de bits
    //Signal Filter
    #define  XXX   0
    #define  AAA   1
    #define  BBB   2
    
    int SignalS = XXX;
    
    if(SignalS & AAA !=0)
    enum eSignals = {XXX, AAA, BBB};
    
    eSignals SignalS = XXX;
    
    if(SignalS == AAA)
    
    Código autodocumentado.

  2. Usar una máscara de bits:
    En la compilación 600+ != tiene mayor precedencia que el bitwise y, DEBE usar
    (SignalS & AAA) !=0
    En las construcciones anteriores, la operación a nivel de bits era mayor que la multiplicación

    Operación

    Descripción

    Orden de ejecución

    ()

    []

    .

    Llamada a la función

    Referencia a un elemento del array

    Referencia a un elemento de la estructura

    De izquierda a derecha

    ¡!

    ~

    ++

    --

    (tipo)

    sizeof

    Negación lógica

    Negación a nivel de bits (complemento)

    Cambio de signo

    Incremento en uno

    Disminución en uno

    Tipificación

    Determinación del tamaño en bytes

    De derecha a izquierda

    *

    /

    %

    Multiplicación

    División

    División de módulos

    De izquierda a derecha

    +

    Suma

    Sustracción

    De izquierda a derecha

    <<

    >>

    Desplazamiento a la izquierda

    Desplazamiento a la derecha

    De izquierda a derecha

    <

    <=

    >

    >=

    Menos que

    Menor o igual que

    Mayor que

    Mayor o igual que

    De izquierda a derecha

    ==

    !=

    Igual

    No igual

    De izquierda a derecha

    &

    Operación AND a nivel de bits

    De izquierda a derecha

    ^

    Operación OR exclusiva a nivel de bits

    De izquierda a derecha

    |

    Operación OR a nivel de bits

    De izquierda a derecha

    &&

    Operación lógica AND

    De izquierda a derecha

    ||

    Operación lógica OR

    De izquierda a derecha

    ?:

    Operador condicional

    De derecha a izquierda

    =

    *=

    /=

    %=

    +=

    -=

    <<=

    >>=

    &=

    ^=

    |=

    Asignación

    Multiplicación con asignación

    División con asignación

    Módulo con asignación

    Suma con asignación

    Sustracción con asignación

    Desplazamiento a la izquierda con asignación

    Desplazamiento a la derecha con asignación

    AND con asignación

    OR exclusivo con asignación

    O a nivel de bit con asignación

    Derecha a izquierda

    ,

    Coma

    De izquierda a derecha

    () Llamada a la función De izquierda a derecha [] Referencia a un elemento de la matriz
    ¡!      Negación lógica De derecha a izquierda - Operación de cambio de signo ++ Incremento -- Disminución ~ Negación Bitwise (complemento)
    & Operación bitmensual AND De izquierda a derecha | Operación bitmensual OR ^ Operación bitmensual exclusiva OR << Desplazamiento a la izquierda >> Desplazamiento a la derecha
    * Multiplicación De izquierda a derecha / División % División de módulos
    + Suma De izquierda a derecha - Resta
    < Menor que De izquierda a derecha <= Menor que o igual > Mayor que >= Mayor que o igual == Igual!= No igual
    || OR lógico De izquierda a derecha
    && Lógico Y De izquierda a derecha
    = Asignación De derecha a izquierda += Asignación suma -= Asignación resta *= Asignación multiplicación /= Asignación división %= Asignación módulo >>= Asignación desplazamiento a la derecha <<= Asignación desplazamiento a la izquierda &= Asignación bitwise AND |= Asignación bitwise OR ^= Asignación exclusive OR
    , Coma De izquierda a derecha
 

WHRoeder encontré tu código (seleccionar la última orden de mercado) y añadí líneas resaltadas para comprobar su precio tp y para establecer el mismo precio tp en las órdenes anteriores:

int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
double Ord_TP=0;
TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
      //if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         //Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

Una línea extra...

if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);

Por favor, guíame, si me equivoco.

(Todas las ordenes de mercado+pendientes son solo de compra, no de venta o solo de venta, no de compra y quiero que el tp de todas las ordenes de mercado se cambie cada vez, cuando se abra una nueva orden de mercado ).

ESTO ES REALMENTE DIFICIL PARA MI, PERO QUIERO HACERLO :(

 
Tu sangría es incorrecta porque no has usado llaves
if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
Lo que tu código realmente es
if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); 
break;
/*NOTREACHED
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
*/
 
Las cosas se están complicando para mí. Creo que debería escribir el código desde el principio. y voy a pegar cada parte del código aquí. tal vez podría entender que mejor.