Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 219
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
Ho sempre saputo che contiene il numero di ordini -1, cioè OrdersTotal()-1 e tutto funzionava, ma ho iniziato a scrivere un programma e improvvisamente, un ordine non viene più contato, ho chiesto OrdersTotal() e mi ha dato il numero totale di ordini = 3, invece di 3-1.
Cosa succede?
La forma abituale del ciclo nell'aiuto:
int total=OrdersTotal();
for(int pos=0;pos<totale;pos++)
{
}
Cioè, il primo ordine è uguale a zero.
Ma no, infatti, il primo ordine è 1, il che significa che dovremmo iniziare la ricerca da 1 e non da zero?
Le meta-citazioni hanno fatto qualcosa di sbagliato o sono stupido io?
Ciao, cosa succede con OrdersTotal()?
Ho sempre saputo che contiene il numero di ordini -1, cioè OrdersTotal()-1, e tutto funzionava, ma ho iniziato a scrivere un programma e improvvisamente un ordine non viene contato. Ho chiesto OrdersTotal() e dice ordini totali = 3, invece di 3-1.
Cosa succede?
La forma usuale del ciclo nell'aiuto:
int total=OrdersTotal();
for(int pos=0;pos<totale;pos++)
{
}
Cioè, il primo ordine è uguale a zero.
Ma no, infatti, il primo ordine è 1, il che significa che dovremmo iniziare la ricerca da 1 e non da zero?
Le meta-citazioni hanno fatto qualcosa di sbagliato o sono stupido io?
Hai confuso gli ORDINI RELATIVI e le PISTE. Leggete il riferimento. Sii più specifico nella tua domanda: cosa stai cercando di contare: ORDINI RIMOSSI o POSIZIONI? E sì, non è cambiato nulla - l'indice del primo elemento inizia con '0'.
Aggiunto: esempio
Esempio: calcolare le posizioni e gli ordini pendenti
Hai confuso gli ORDINI RELATIVI e le POSIZIONI. Leggete il riferimento. Formulate la vostra domanda in modo più preciso: cosa state cercando di contare: ORDINI RETRIBUITI o POSIZIONI? E sì, non è cambiato nulla - l'indice del primo elemento inizia con '0'.
Aggiunto: esempio
Esempio: calcolare le posizioni e gli ordini pendenti
Intendo MQL4, non MQL5, non c'è differenza tra ordini pendenti e a mercato!
Intendo MQL4, non MQL5, non c'è una divisione in pending e market pending!
State scrivendo nel forum MQl5. Stai scrivendo nella sezione principale. Scrivi nel forum MQL5 - e riceverai risposte su MQL5.
Le domande sul vecchio terminale sono indirizzate alla sezione speciale: MQL4 e MetaTrader 4. D'ora in poi, scrivi lì. Vi inoltrerò le vostre domande.
Ho confrontato due varianti, nella prima, ho usato OrdersTotal()-1 e ho iniziato la ricerca da zero - ho ottenuto l'errore
. Nella seconda variante, ho iniziato da uno e ho preso tutto OrdersTotal() - nessun errore questa volta
Negli screenshot, potete vedere che OrdersTotal() mostra il numero effettivo di ordini, non OrdersTotal()-1 ...
Ladomanda è perché OrdersTotal() mostra il numero effettivo di ordini, piuttosto che -1, dovrebbe essere così o è qualcosa di nuovo?
Perché in questo caso, dovremmo iniziare la ricerca non da zero, ma da uno!
Ho confrontato due varianti, nella prima, ho usato OrdersTotal()-1 e ho iniziato la ricerca da zero - ho ottenuto l'errore
. Nella seconda variante, ho iniziato da uno e ho preso tutto OrdersTotal() - nessun errore questa volta
Negli screenshot, potete vedere che OrdersTotal() mostra il numero effettivo di ordini, non OrdersTotal()-1 ...
Ladomanda è perché OrdersTotal() mostra il numero effettivo di ordini, piuttosto che -1, dovrebbe essere così o è qualcosa di nuovo?
Perché in questo caso, dovremmo iniziare la ricerca non da zero, ma da uno!
Credo di aver capito il mio errore, scusate...
C'è un offset di -1 in questa condizione:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
Scusate la franchezza, ho preso la stringa da un altro programma e non ho fatto attenzione all'offset!
//+------------------------------------------------------------------+ //| MSBB.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <MovingAverages.mqh> #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 clrGreen #property indicator_color2 clrRed #property indicator_width1 1 input int InpMSBBPeriod=3; // Period input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA; // Method //--- indicator buffers double ExtMSBBBuffer[]; double ExtTempBuffer[]; double ExtPriceBuffer[]; double ExtSignalBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(void) { //--- indicator buffers mapping IndicatorDigits(Digits-2); //--- drawing settings IndicatorBuffers(4); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,ExtMSBBBuffer); SetIndexBuffer(1,ExtSignalBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,ExtTempBuffer); SetIndexBuffer(2,ExtPriceBuffer); SetIndexDrawBegin(1,InpMSBBPeriod); //--- name for DataWindow and indicator subwindow label IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")"); SetIndexLabel(0,"MSBB"); SetIndexLabel(1,"Signal"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int i;//limit; //------ if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2) return(0); /*//--- counting from 0 to rates_total ArraySetAsSeries(ExtMSBBBuffer,false); ArraySetAsSeries(ExtSignalBuffer,false); ArraySetAsSeries(open,false); ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false);*/ //--- // limit=rates_total-prev_calculated; //if(prev_calculated>0) // limit++; //--- typical price and its moving average for(i=0; i<rates_total; i++) { ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2); ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2); //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i]; //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]); if(ExtTempBuffer[i]==0) ExtMSBBBuffer[i]=0.0; if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i]=0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open>0 && price_close<0)||(price_open<0 && price_close>0)) ExtMSBBBuffer[i]=0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } //--- signal line counted in the 2-nd buffer //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0); SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer); Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]); //--- done } /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0) { ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i]; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } if(ExtPriceBuffer[i]==0) { ExtMSBBBuffer[i] = 0.0; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } }*/ //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+