Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 69
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Por ejemplo, aquí https://docs.mql4.com/ru/basis/preprosessor/compilation
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 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.
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.
¿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 flujo2017.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 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
{
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.
Tenemos este tipo de mierda.
{
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?
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;