Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
Grazie!
 
Ciao, che mi dici di 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 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?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
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

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

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!

 
Maksim Mihajlov:

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 ...

La
domanda è 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!

File:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

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 ...

La
domanda è 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!

 
Salve. Ho bisogno del vostro aiuto per correggere l'indicatore. L'essenza dell'indicatore è la seguente. Calcola la grandezza dell'aumento del prezzo rispetto alla barra precedente. Per lo zero ci vuole una barra di stelle. Cioè, il prezzo di apertura è uguale al prezzo di chiusura. In fase di compilazione nessun errore, ma durante il test un errore sulla linea 80 20 caratteri. Anche lalinea del segnale èdisegnata in modo errato. Ma penso che questo sia il motivo del calcolo errato del buffer principale. Per favore, aiutatemi a risolvere il problema.
//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.