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

 
Alexey Viktorov:

È lo stesso in mql5. È anche leggermente allungato. Non è quello di cui abbiamo bisogno?

VALORE DEL SIMBOLO_TRADE_TICK

Valore SYMBOL_TRADE_TICK_VALUE_PROFIT

doppio

SYMBOL_TRADE_TICK_VALUE_PROFITTO

Valore di tick calcolato per la posizione redditizia

doppio

PERDITA DI VALORE DEL SIMBOLO_TRADE_TICK

Valore calcolato di un tick per una posizione perdente

doppio

SYMBOL_TRADE_TICK_SIZE

Cambio di prezzo minimo

doppio

Dannazione, sono così stupido che ho messo TICK_SIZE invece di TICK_VALUE... dovrei andare a letto.
 
Ragazzi, cosa c'è che non va, aiutatemi!
 
Alexey Viktorov:

La prima cosa che ha attirato la mia attenzione è stata la sequenza di buffer.

I buffer di costruzione devono SEMPRE essere eseguiti in sequenza. Cioè, se i buffer di dati sono i numeri 2 e 3, allora il buffer di colore DEVE essere il numero 4

Se questo non è l'unico errore, guarderemo oltre.

OK, ho trovato una tale funzione nelle istruzioni, qui:

Guida di riferimento MQL5 / Indicatori personalizzati / SetIndexBuffer
".....

boolSetIndexBuffer(
intindice,// indice del buffer
doppiobuffer[],// array
ENUM_INDEXBUFFER_TYPEdata_type//cosa sarà memorizzato
);

Parametri

indice

[Numero del buffer dell'indicatore. La numerazione parte da 0. Il numero deve essere inferiore al valore dichiarato nella #proprietà indicator_buffers.

buffer[]

[Array dichiarato nel programma dell'indicatore personalizzato.

tipo di dati

[Tipo di dati memorizzati nella matrice dell'indicatore. Il valore predefinito è INDICATOR_DATA (valori dell'indicatore calcolato). Può anche prendere il valore INDICATOR_COLOR_INDEX, allora questo buffer è destinato a memorizzare gli indici dei colori per il buffer dell'indicatore precedente. Si possono specificare fino a 64 colori nella linea #property indicator_colorN. Il valore INDICATOR_CALCULATIONS significa che questo buffer partecipa ai calcoli intermedi dell'indicatore, e non è destinato al disegno.

 

Ho provato a rifarlo e ho ottenuto ancora più stronzate. L'istogramma è sparito del tutto e l'indicatore di linea è diventato a dir poco strano. Quello del segnale è stato tagliato al di sopra di 50 e quello principale era più basso. Non ci sono questi tagli nel codice.

 
Artyom Trishkin:

Ti ho dato un link per studiare non l'istogramma, ma come lavorare con il buffer di colore. Allontanati dall'istogramma e concentrati su come devi lavorare con il colore.

L'ho studiato, ma niente di nuovo, apparentemente è (nuovo per me) naturalmente, ovvio per tutti gli iniziati, autoesplicativo. Non ho trovato nulla di nuovo, tranne la caratteristica sopra descritta della disposizione reciproca dei buffer durante l'indicizzazione. Questa sequenza rispettata, ha ottenuto un'immagine ancora più ridicola.

Immagini qui sotto, file allegato

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_COLOR_HISTOGRAM2
#property indicator_color1  clrGreen,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width2  3 

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID
#property indicator_width3  2 

//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing

//--- indicator buffers
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
double    ColorHistogram_2Colors[];
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   PlotIndexSetString(3,PLOT_LABEL,"Main");
   PlotIndexSetString(4,PLOT_LABEL,"Signal");
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+ 
 

Salve.

Potete per favore dirmi dove posso trovare l'algoritmo per l'apertura "affidabile" degli ordini (finora sono interessato solo agli ordini di mercato), perché sono perplesso.

Il problema è che nel mio conto (Alpari) i livelli StopLevel e FreezeLevel sono zero e se uso solo queste limitazionihttps://book.mql4.com/ru/appendix/limits significa che uno StopLoss in acquisto può essere impostato al livello Bid e in vendita al livello Ask, ma questo non è vero. In questo caso OrderSend restituisce un errore "No price" (ERR_OFF_QUOTES, codice 136).

Allo stesso tempo, i trade senza stop o con stop di 50 o più punti si aprono senza problemi.

Ho scoperto per esperienza che lo SlopLoss minimo è di 19 pips. Non so come determinare questo margine programmaticamente.

 
Questi livelli dovrebbero essere impostati dal prezzo di chiusura dell'ordine, non dal prezzo di apertura. E il prezzo di chiusura quando si impostano questi livelli non deve essere uguale al valore impostato
 
klok79:

Salve.

Potete per favore dirmi dove posso trovare l'algoritmo per l'apertura "affidabile" degli ordini (finora sono interessato solo agli ordini di mercato), perché sono perplesso.

Il problema è che nel mio conto (Alpari) i livelli StopLevel e FreezeLevel sono zero e se uso solo queste limitazionihttps://book.mql4.com/ru/appendix/limits significa che uno StopLoss in acquisto può essere impostato al livello Bid e in vendita al livello Ask, ma questo non è vero. In questo caso OrderSend restituisce un errore "No price" (ERR_OFF_QUOTES, codice 136).

Allo stesso tempo, i trade senza stop o con stop di 50 o più punti si aprono senza problemi.

Ho scoperto per esperienza che lo SlopLoss minimo è di 19 pips. Non so come determinare questo margine programmaticamente.

Prova minStopLoss = Prezzo corrente +/- (MaxValue(2*Spread, StopLoss));

 
Perché gli oggetti non vengono distrutti quando si ferma il debug? Ho capito che OnDeinit() non viene chiamato affatto. Dopo il debug stop devo uccidere il terminale ogni volta.
 

Buon pomeriggio il codice sotto il problema è spesso aggiornato array adx_sig[9] . Volevo ottenere una dipendenza di aggiornamento dei dati in tempo. Ma qualcosa è andato storto.

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                  ADX_adx_period          = 14;                                                 // adx period ADX 
input int                  ADX_lower_level         = 20;                                                 // Lower level ADX 
int h_adx[9];
double adx1_buffer[3];
double adx2_buffer[3];
double adx3_buffer[3];
ENUM_TIMEFRAMES handle_period[9]={PERIOD_CURRENT,PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1};
int adx_sig[9];
int OnInit()
  {
//---
   for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Установим хэндлы для индикаторов
      h_adx[i]=iADX(_Symbol,handle_period[i],ADX_adx_period);
        if(h_adx[i]<0) 
        {
         Alert("Ошибка при создании индикаторов - : ",GetLastError(),"!!");
        }
     }   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Удаляем хэндлы для индикаторов
      IndicatorRelease(h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i_sig=0; i_sig<ArraySize(handle_period); i_sig++)
     {
      if(CopyBuffer(h_adx[i_sig],0,0,3,adx1_buffer)<3)Print("CopyBuffer adx1_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],1,0,3,adx2_buffer)<3)Print("CopyBuffer adx2_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],2,0,3,adx3_buffer)<3)Print("CopyBuffer adx3_buffer ",GetLastError());
      if(adx3_buffer[1]<adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]>adx3_buffer[2])adx_sig[i_sig]=1;
      else if(adx3_buffer[1]>adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]<adx3_buffer[2])adx_sig[i_sig]=-1;
      else adx_sig[i_sig]=0;
      }
      PrintFormat("ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i",adx_sig[0],adx_sig[1],adx_sig[2],adx_sig[3],adx_sig[4],adx_sig[5],adx_sig[6],adx_sig[7],adx_sig[8]); 
  }