Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 69
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Per esempio qui https://docs.mql4.com/ru/basis/preprosessor/compilation
Nell'esempio attuale, voglio essere in grado di piazzare un numero infinito di ordini con qualsiasi lotto per non superare i suoi limiti.
Naturalmente, conosciamo tutti i limiti, ma voglio farlo in questo modo
Procedo dal fatto che se si specifica un elemento tra parentesi, sarà l'ultimo
Così ho ricevuto questo tipo di schifezze. Mi aspettavo un ordine per ordine... Voglio che il risultato (lotto di un tale ordine *coefficiente) sia aggiunto all'ordine invece del lotto
e la questione del recupero dei dati da lì
Voglio ottenere il seguente risultato come lo vedo io
MyArray[0][0.01]
MyArray[1][0.01]
MyArray[2][0.02]
ecc...
Quindi qual è la vera domanda?
Hai scritto una matrice con i lotti, poi ordinarla per dimensione del lotto, sarà ordinata per i numeri di apertura, perché nel tuo caso, ogni posizione successiva si apre con un lotto più grande
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()
}
Poi applicare come segue: contare il numero totale di posizioni, e se meno di tre, allora non accedere all'array, se più, allora leggere l'array e prendere i dati da esso.
L'uscita dell'array non è al momento della scrittura, ma al momento della lettura.
L'uscita dell'array non avviene al momento della scrittura, ma al momento della lettura.
No. Al momento di accedere a un indice di array inesistente.
Quindi cosa ho scritto?
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 costante e il lotto cambia. Non dovrebbe essere così, ma non funziona diversamente
Idealmente, la voceMyArray[CountOrders][OrderLots()]
quindi l'output sarebbeMyArray[0][0.01]MyArray[1][0.01]
ma questo non funzionerà in µl.
e poi in qualche modo estrarlo dalla funzione al flusso2017.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 costante e il lotto cambia. Non dovrebbe essere così, ma non funziona diversamente
Idealmente, la voceMyArray[CountOrders][OrderLots()]
quindi l'output sarebbeMyArray[0][0.01]MyArray[1][0.01]
Ma questo non funziona in µl
Le strutture vi aiuteranno. Si crea una struttura con i campi necessari, si dichiara un array di tali strutture, lo si riempie con i dati dell'ordine nel ciclo di apertura, e poi si cerca tutto ciò di cui si ha bisogno in esso. Controlla i campi della struttura tramite l'indice e li confronta con il valore necessario. L'indice indicherà il numero dell'ordine per il suo tempo di apertura, e tutti i dati necessari su questo ordine specifico saranno dati nei campi della struttura.
Questo è il tipo di merda che abbiamo
{
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();
}
}
Voglio prendere, per esempio, il lotto 5 di un ordine e confrontarlo con il lotto 3
sommare il prezzo di apertura e dividere per il numero di posizioni
per questo tipo di cose avete bisogno di una voce di comando stessa.
Abbiamo questo genere di cose.
{
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();
}
}
Voglio prendere per esempio il lotto 5 di un ordine e confrontarlo con il lotto 3
sommare il prezzo di apertura e dividere per il numero di posizioni
Ho bisogno di una voce stessa sotto forma di comandi per questo tipo di cose
Poiché l'indice i del ciclo si riferisce a qualsiasi ordine, non solo a quelli di cui avete bisogno, dovreste dichiarare una variabile (per esempio, n=0;) nella funzione che si occuperà della dimensione dell'array. Dopo aver superato i controlli, aumentate il valore di questa variabile all'interno del ciclo, aumentate la dimensione dell'array del valore di questa variabile e riempite i campi della struttura secondo l'indice n-1: ordini[n-1].xxx=XXX;
Per favore, ditemi perché la funzione OrdersTotal() scrive -1 quando cerca gli ordini.
Esempio: for (i=OrdersTotal()-1 ;i>=0; i--)
perché non solo OrdersTotal()?
Il conteggio degli ordini in questa funzione parte da 0 o da 1? Cioè, se c'è un ordine, OrdersTotal() è uguale a 0 o 1?
Poiché l'indice i del ciclo si riferisce a qualsiasi ordine, non solo a quelli di cui avete bisogno, dovreste dichiarare una variabile (per esempio n=0;) nella funzione che sarà responsabile della dimensione dell'array. Dopo aver superato i controlli, aumentate il valore di questa variabile all'interno del ciclo, aumentate la dimensione dell'array del valore di questa variabile e riempite i campi della struttura dall'indice n-1: orders[n-1].xxx=XXX;