Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 566

 
Vitaly Muzichenko:

Probieren Sie die Funktion aus:

Es ist nicht so einfach, wenn Sie die Funktion sowohl für Währungen als auch für Futures verwenden. Es gibt eine prozentuale Marge zu berücksichtigen.


 
Alexey Viktorov:

Es ist nicht so einfach, wenn Sie die Funktion sowohl für Währungen als auch für Futures verwenden. Sie müssen den Prozentsatz der Gewinnspanne berücksichtigen.

Wenn wir über den prozentualen Verlust sprechen, sind wir nicht an der Marge interessiert, sie wird zurückgegeben, wenn die Position geschlossen wird.

 
Vitaly Muzichenko:

Wenn wir über den prozentualen Verlust sprechen, sind wir nicht an der Marge interessiert, sie wird zurückkommen, wenn die Position geschlossen wird.

Ich muss verschlafen haben... oder noch nicht aufgewacht sind...
 
Alekseu Fedotov:

Vielleicht

Wie? Bitte sagen Sie es mir!
 
Nikolay Gaylis:

Es tut mir leid, dass Sie nur das bemerkt haben.)

Und ich bin nicht der Einzige, der im Terminal den Unterschied nicht erkennen kann. Der Ausgang außerhalb des Feldes ist immer noch vorhanden.

 
Vitaly Muzichenko:

Probieren Sie die Funktion aus:

Vielen Dank für Ihre Hilfe! Leider war es nicht möglich, eine Universallösung zu implementieren, ich musste es auf diese Weise tun:

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);}
 }
}

Können Sie mir bitte sagen, ob mein Broker eine variable Hebelwirkung hat und wie ich diese bei der Lotberechnung berücksichtigen kann? Oder wird es keine Auswirkungen haben, wenn Sie sich für die oben genannte Option entscheiden?

 

Ein weiterer Indikator, der ebenfalls außerhalb des Bereichs liegt.

Es geht an den Chart ohne Probleme, aber wenn ich es aus dem EA aufrufen, sagt es ...array out of range in 'HiLo.mq4' (121,15)

Wo liegt das Problem?

#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:

Ein weiterer Indikator, der ebenfalls außerhalb des Bereichs liegt.

Es geht an den Chart ohne Probleme, aber wenn ich es aus dem EA aufrufen, sagt es ...array out of range in 'HiLo.mq4' (121,15)

Wo liegt das Problem?


Es wird nicht geprüft, ob sich 1000 Balken im Diagramm befinden. Zum Beispiel gibt es zum Zeitpunkt des Öffnens des Terminals 0 Balken in allen Charts, aber das Terminal hat bereits Indikatoren gestartet (ich weiß nicht, warum es das tut, aber es ist eine Tatsache). Daher führt jeder Zugriff auf Indikatorpuffer zu einer Überschreitung der Zeitreihen-Arrays.

 
Ihor Herasko:

Es wird nicht überprüft, ob 1000 Balken im Diagramm vorhanden sind. Zum Beispiel gibt es zum Zeitpunkt des Öffnens des Terminals 0 Balken in allen Charts, aber das Terminal hat bereits Indikatoren gestartet (es ist unklar, warum es das tut, aber es ist eine Tatsache). Daher führt jeder Zugriff auf Indikatorpuffer zum Verlassen der Zeitreihen-Arrays.

if(Bars<cb)return(0);

Es stürzt immer noch ab.

 
PolarSeaman:

Es stürzt immer noch ab.

Denn die Prüfung ist grundlegend falsch. Nehmen wir an, Bars liefert 1000 und cb liefert ebenfalls 1000. In der Schleife erhalte ich dann bei der ersten Iteration den Wert 1000. In der ersten Bedingung des Schleifenkörpers:

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

zwei Ausgänge außerhalb des Arrays auf einmal : Zugriff auf einen Balken mit Index 1000 und einen mit Index 1001. Denn wenn das Diagramm 1000 Balken hat, hat der erste Balken den Index 0 und der letzte den Index 999.

Im weiteren Verlauf des Schleifenkörpers wird auf noch weiter zurückliegende Takte in der Geschichte verwiesen:

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

All dies muss bei der ersten Prüfung berücksichtigt werden.

Für eine korrekte Prüfung siehe das Beispiel der Funktion IndicatorCounted() in der MQL4-Referenz. Erst jetzt sollte IndicatorCounted() durch die gemeinsame Verwendung der Variablen rates_total (dies ist Bars) und prev_calculated (dies ist IndicatorCounted()) ersetzt werden.

Grund der Beschwerde: