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

 
Alexey Viktorov:
Por ejemplo, aquí https://docs.mql4.com/ru/basis/preprosessor/compilation
Gracias.
 
trader781:

En el ejemplo actual, quiero poder colocar un número infinito de órdenes con cualquier lote para no superar sus límites.

Por supuesto, todos conocemos los límites, pero quiero hacerlo así

Parto del hecho de que si se especifica un elemento entre paréntesis, éste será el último

Así que tengo este tipo de basura. Esperaba una orden por orden... Quiero que el resultado (lote de tal orden *coeficiente) se añada a la orden en lugar del lote

y la cuestión de la recuperación de datos desde allí

Quiero obtener el siguiente resultado tal y como lo veo

MiMatriz[0][0.01]

MiMatriz[1][0.01]

MiMatriz[2][0.02]

etc...

Entonces, ¿cuál es la pregunta real?

Escribiste un array con lotes, luego lo ordenaste por tamaño de lote, se ordenará por números de apertura, porque en tu caso, cada siguiente posición se abre con un lote mayor

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


Entonces aplique lo siguiente: cuente el número total de posiciones, y si es menos de tres, entonces no acceda al array, si es más, entonces lea el array y tome los datos de él.

La salida de la matriz no es en el momento de la escritura, sino en el momento de la lectura.

 
Vitaly Muzichenko:


La salida de la matriz no se produce en el momento de la escritura, sino en el momento de la lectura.

No. En el momento de acceder a un índice de matriz inexistente.
 
Vitalie Postolache:
No. En el momento de acceder a un índice de matriz inexistente.
Entonces, ¿qué escribí?
 
Vitaly Muzichenko:
¿Y qué escribí?

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders constante y el lote cambia. No debería ser así, pero no funciona de otra manera

Idealmente, la entradaMyArray[CountOrders][OrderLots()]

por lo que la salida seríaMiMatriz[0][0.01]MiMatriz[1][0.01]

pero eso no funcionará en µl.

y luego extraerlo de alguna manera de la función al flujo
 
trader781:

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders constante y el lote cambia. No debería ser así, pero no funciona de otra manera

Idealmente, la entradaMyArray[CountOrders][OrderLots()]

por lo que la salida seríaMiMatriz[0][0.01]MiMatriz[1][0.01]

Pero eso no funciona en µl

Las estructuras te ayudarán. Se crea una estructura con los campos necesarios, se declara un array de dichas estructuras, se rellena con los datos de la orden en el bucle por tiempo de apertura, y luego se busca en él todo lo que se necesita. Comprueba los campos de la estructura por el índice y los compara con el valor necesario. El índice indicará el número de orden por su hora de apertura, y todos los datos necesarios sobre esta orden específica se mostrarán en los campos de la estructura.
 
Artyom Trishkin:
Las estructuras te ayudarán. Se crea una estructura con los campos necesarios, se declara una matriz de dichas estructuras, se llena con los datos de la orden en el bucle por tiempo de apertura, y luego se busca todo lo que se necesita en ella. Comprueba los campos de la estructura por el índice y los compara con el valor necesario. El índice indicará el número de orden por su hora de apertura, y todos los datos necesarios sobre esta orden específica se darán en los campos de la estructura.

Este es el tipo de mierda que tenemos

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Quiero sacar, por ejemplo, el lote 5 de un pedido y compararlo con el lote 3

sumar el precio de apertura y dividirlo por el número de posiciones

necesitamos una entrada de comandos para este tipo de cosas.

 
trader781:

Tenemos este tipo de mierda.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Quiero sacar por ejemplo el lote 5 de una orden y compararlo con el lote 3

sumar el precio de apertura y dividirlo por el número de posiciones

Necesito una entrada propia en forma de comandos para este tipo de cosas

Como el índice del bucle i se refiere a cualquier orden, no sólo a los que necesitas, debes declarar una variable (por ejemplo, n=0;) en la función que se encargará del tamaño del array. Después de pasar las comprobaciones, aumenta el valor de esta variable dentro del bucle, aumenta el tamaño del array por el valor de esta variable y rellena los campos de la estructura según el índice n-1: orders[n-1].xxx=XXX;

 

Por favor, díganme por qué la función OrdersTotal( ) escribe -1 cuando se buscan los pedidos.

Ejemplo: for (i=TotalPedidos()-1 ;i>=0; i--)

¿por qué no sólo OrdersTotal()?

¿El recuento de pedidos en esta función empieza por 0 o por 1? Es decir, si hay un pedido, ¿es OrdersTotal() igual a 0 o a 1?

 
Artyom Trishkin:

Dado que el índice del bucle i se refiere a cualquier orden, no sólo a los que necesitas, debes declarar una variable (por ejemplo, n=0;) en la función que será responsable del tamaño del array. Después de pasar las comprobaciones, aumenta el valor de esta variable dentro del bucle, aumenta el tamaño del array por el valor de esta variable y rellena los campos de la estructura por el índice n-1: orders[n-1].xxx=XXX;

Ya que tenemos un paquete de pedidos, ¿por qué no podemos sacar el pedido correcto? (las necesarias) y hacer lo que queramos con ellas... por ejemplo, ordenar (i-4)