Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 513

 
mwwm:

come farlo correttamente?

Come si fa?
 
Artyom Trishkin:
Come si fa?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

Semplificato così, CopyOpen capisco che è superfluo per OnCalculate, ma così vede solo la storia dalla finestra del terminale?

 
mwwm:

Semplificando, CopyOpen non è necessario per OnCalculate, ma così vede solo la storia dalla finestra del terminale?

Array mas viene creato con dimensione zero ad ogni tick e non cambia la sua dimensione altrove. Quindi qualsiasi accesso ad esso causerà l'overrun dell'array.

Per risolvere il problema, dovremmo ridimensionarlo alla dimensione che conterrà le letture di tutte le barre storiche, o legarlo al buffer dell'indicatore (dichiarato come variabile globale del programma). Se ho capito bene, questi valori dovrebbero essere visualizzati tramite l'indicatore.

 
mwwm:

Semplificato, CopyOpen capisco che è superfluo per OnCalculate, ma così vede solo la storia dalla finestra del terminale?

Esempio:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

L'array mas è creato con una dimensione zero ad ogni tick e non cambia la sua dimensione in nessun altro momento. Pertanto, qualsiasi riferimento ad esso causerà l'uscita dall'array.

Per risolvere il problema, dovreste ridimensionarlo alla dimensione che conterrà le letture di tutte le barre storiche, o legarlo al buffer dell'indicatore (dichiarato come variabile globale del programma). Se ho capito bene, sono questi valori che devono essere visualizzati con l'indicatore.

Errore mio, mas[] dovrebbe davvero essere un array globale, ma anche il buffer indicatore non è adatto, sarà piuttosto un array multidimensionale intermedio. Qual è il modo migliore per determinare la dimensione ottimale dell'array per M5, non attraverso il buffer dell'indicatore?

 
mwwm:

La mia imprecisione, mas[] è davvero un array globale, ma anche indicator buffer non è adatto, piuttosto sarebbe un array multidimensionale intermedio. Qual è il modo migliore per determinare la dimensione ottimale dell'array per M5, non attraverso il buffer dell'indicatore?

Non capisco cosa intendo per multidimensionale. Stiamo parlando di un array unidimensionale. Inoltre, in MQL4 la dimensione massima di un array è 4.

Per rendere l'array della stessa dimensione della serie temporale, dobbiamo ridimensionarlo in base al numero di barre disponibili sul grafico per il simbolo e il periodo necessari:

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

La mia imprecisione, mas[] è davvero un array globale, ma anche indicator buffer non è adatto, piuttosto sarebbe un array multidimensionale intermedio. Qual è il modo migliore per determinare la dimensione ottimale dell'array per M5, non attraverso un buffer indicatore?

Perché non volete usare gli array come buffer di indicatori? Sono monitorati dal sottosistema, il che rende il vostro lavoro più facile.

E l'array di buffer di indicatori intermedi è facile da fare:

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Salve.

I volumi sulla piattaforma sono volumi in tick, ci saranno volumi reali?

 
Олег Литинский:

Salve.

Sulla piattaforma i volumi ticchettano, ci saranno dei volumi reali?

Non lo farà. Usa MT5, alcuni broker forniscono volumi reali lì.

 

Buon pomeriggio!

Per favore, aiutatemi con il seguente problema:

1) Dopo che alcune condizioni sono soddisfatte, si apre un ordine pendente:

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

Per favore, ditemi cosa aggiungere e dove cancellare un ordine pendente se il prezzo ha già superato lo stop loss (di questo ordine pendente).

Scusa per la domanda stupida, mi sono perso nei forum mentre cercavo una risposta.

Grazie in anticipo!