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

 
Vitaly Muzichenko:

Prova la funzione:

Non è così semplice se si usa la funzione sia sulle valute che sui futures. C'è una percentuale di margine da considerare.


 
Alexey Viktorov:

Non è così semplice se si usa la funzione sia sulle valute che sui futures. Bisogna considerare la percentuale di margine.

Se stiamo parlando della perdita percentuale, non ci interessa il margine, esso ritornerà quando la posizione sarà chiusa

 
Vitaly Muzichenko:

Se stiamo parlando di perdita percentuale, non ci interessa il margine, tornerà quando la posizione sarà chiusa

Devo aver dormito troppo... o non si sono ancora svegliati...
 
Alekseu Fedotov:

Forse

Come? Per favore, ditemelo!
 
Nikolay Gaylis:

Mi dispiace che tu abbia notato solo questo).

E non sono l'unico, il terminale non riesce a vedere la differenza, di per sé. L'uscita fuori dalla matrice è ancora lì.

 
Vitaly Muzichenko:

Prova la funzione:

Grazie per il vostro aiuto! Purtroppo non era possibile implementare una soluzione universale, ho dovuto farlo in questo modo:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

{
 double TickValue   =MarketInfo(Symbol(),MODE_TICKVALUE),
        TickSize    =MarketInfo(Symbol(),MODE_TICKSIZE),
        ContractSize=MarketInfo(Symbol(),MODE_LOTSIZE),
        Min_Lot     =MarketInfo(Symbol(),MODE_MINLOT),
        Max_Lot     =MarketInfo(Symbol(),MODE_MAXLOT),
        Step        =MarketInfo(Symbol(),MODE_LOTSTEP);

 {
//Для пар XXXUSD, USDXXX, XAUUSD, XAGUSD, CRYPTO, для кроссов
Lots = NormalizeDouble((((AccountBalance()*MaximumRisk)/(MathAbs(Price-SL)/Point))/TickValue),int(MathAbs(log(Step))));
//Для перечисленного в if
if (Symbol() == "BRN" || Symbol() == "WTI" || Symbol() == "NG" || Symbol() == "NIKK225" || Symbol() == "SPX500")
{Lots = NormalizeDouble(((((AccountBalance()*MaximumRisk))/MathAbs(Price-SL)))/(ContractSize/TickValue),1);}
//Для перечисленного в if
if (Symbol() == "ASX200" || Symbol() == "CAC40" || Symbol() == "NQ100" || Symbol() == "STOXX50" || Symbol() == "DAX30"
 || Symbol() == "FTSE100"  || Symbol() == "IBEX35")
{Lots = NormalizeDouble(((((AccountBalance()*MaximumRisk))/MathAbs(Price-SL)))/(TickValue/TickSize/Point),1);}
 }
}

Potete dirmi per favore se il mio broker ha una leva fluttuante, come posso tenerne conto nel calcolo dei lotti? O non influirà, se si va per l'opzione di cui sopra?

 

Un altro indicatore, anche array fuori portata.

Va sul grafico senza problemi, ma quando lo chiamo dall'EA dice ...array out of range in 'HiLo.mq4' (121,15)

Qual è il problema?

#property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black  //White
#property indicator_color4 Black  //White
#property indicator_color5 Black            //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int    p        = 10;    // Период
input int    s        = 5;     // Угол наклона
input double distance = 2.0;   // Ширина канала
input bool   showBb   = false;  // Границы канала
input bool   showCl   = true;  // Центральная линия
input int    barsig   = 1;     // Сигнальная свеча (номер)
input int    arrots   = 0;    // Стрелка (отступ)
input int    arrsz    = 0;     // Стрелка (размер)
input int    ATR      = 1000;  // Период ATR
input int    cb       = 1000;  // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
IndicatorBuffers(7);
SetIndexBuffer(0,fx1);
SetIndexBuffer(1,fx2);
SetIndexBuffer(2,lower);
SetIndexBuffer(3,upper);
SetIndexBuffer(4,upar);
SetIndexBuffer(5,dnar);
SetIndexBuffer(6,hp);

SetIndexStyle (4,DRAW_ARROW,0,arrsz);
SetIndexArrow (4,233);
SetIndexStyle (5,DRAW_ARROW,0,arrsz);
SetIndexArrow (5,234);

   if(showBb)
   {SetIndexStyle(2,DRAW_LINE);
    SetIndexStyle(3,DRAW_LINE);
   }
   else
   {SetIndexStyle(2,DRAW_NONE);
    SetIndexStyle(3,DRAW_NONE);
   }
   
    if(showCl)
   {SetIndexStyle(0,DRAW_LINE);
    SetIndexStyle(1,DRAW_LINE);
   }
   else
   {SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_NONE);
   }

SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);

//---
   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;
   
   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

double avg;

ki=2.0/(p+1);

for (i=cb; i>=0; i--) {fx1[i]=Close[i];}

for (int m=0; m<=s; m++)
{
z1=fx1[0];
for (i=0; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
}

fs=0;
for (i=cb; i>=0; i--)
{
if (fx1[i]>fx1[i+1]) fs=1;
if (fx1[i]<fx1[i+1]) {if (fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
if (fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

avg = iATR(NULL,0,ATR, i+10);
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
 dnar[i] = High[i]+arrots*Point; else dnar[i] = EMPTY_VALUE;
 
if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
 upar[i] = Low[i]-arrots*Point; else upar[i] = EMPTY_VALUE; 
}

//--- return value of prev_calculated for next call
   return(rates_total);
  }

 
PolarSeaman:

Un altro indicatore, anche array fuori portata.

Va sul grafico senza problemi, ma quando lo chiamo dall'EA dice ...array out of range in 'HiLo.mq4' (121,15)

Qual è il problema?


Non controlla se ci sono 1000 barre sul grafico. Per esempio, al momento dell'apertura del terminale ci sono 0 barre in tutti i grafici, ma il terminale ha già iniziato gli indicatori (non so perché lo fa, ma è un fatto). Pertanto, qualsiasi accesso ai buffer degli indicatori causa il superamento degli array di serie temporali.

 
Ihor Herasko:

Non c'è nessun controllo che ci siano 1000 barre sul grafico. Per esempio, al momento dell'apertura del terminale ci sono 0 barre in tutti i grafici, ma il terminale ha già iniziato gli indicatori (non è chiaro perché lo fa, ma è un fatto). Pertanto, qualsiasi accesso ai buffer degli indicatori causa l'uscita degli array di serie temporali.

if(Bars<cb)return(0);

Si blocca ancora.

 
PolarSeaman:

Si blocca ancora.

Perché il controllo è fondamentalmente sbagliato. Diciamo che Bars restituisce 1000 e anche cb restituisce 1000. Poi nel ciclo sulla prima iterazione i ottiene il valore 1000. Nella prima condizione del corpo del ciclo:

if (fx1[i]>fx1[i+1]) fs=1;

Due uscite contemporaneamente fuori dall'array: l' accesso a una barra con indice 1000 e una con indice 1001. Se il grafico ha 1000 barre, la prima barra ha indice 0 e l'ultima ha indice 999.

Più avanti nel corpo dell'anello c'è un riferimento alle barre ancora più lontane della storia:

if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])

Tutto questo deve essere preso in considerazione nel controllo iniziale.

Per un controllo corretto, vedere l'esempio della funzione IndicatorCounted() in MQL4 Reference. Solo ora, IndicatorCounted() può essere sostituito dall'uso congiunto delle variabili rates_total (questo è Bars) e prev_calculated (questo è IndicatorCounted()).

Motivazione: