Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 566

 
Vitaly Muzichenko:

Prueba la función:

No es tan sencillo si se utiliza la función tanto en divisas como en futuros. Hay que tener en cuenta un porcentaje de margen.


 
Alexey Viktorov:

No es tan sencillo si se utiliza la función tanto en divisas como en futuros. Hay que tener en cuenta el porcentaje de margen.

Si hablamos del porcentaje de pérdida, no nos interesa el margen, éste volverá cuando se cierre la posición

 
Vitaly Muzichenko:

Si hablamos de porcentaje de pérdida, no nos interesa el margen, se recuperará cuando se cierre la posición

Debo haberme quedado dormido... o aún no se han despertado...
 
Alekseu Fedotov:

Quizás

¿Cómo? ¡Por favor, dímelo!
 
Nikolay Gaylis:

Siento que eso sea lo único que hayas notado).

Y no soy el único, la Terminal no puede ver la diferencia, per se. La salida fuera de la matriz sigue ahí.

 
Vitaly Muzichenko:

Prueba la función:

Gracias por su ayuda. Desgraciadamente no fue posible implementar una solución universal, tuve que hacerlo de esta manera:

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

¿Podríais decirme si mi broker tiene apalancamiento flotante, cómo puedo tenerlo en cuenta en el cálculo del lote? ¿O no afectará, si se opta por la opción anterior?

 

Otro indicador, también matriz fuera de rango.

Va al gráfico sin problemas, pero cuando lo llamo desde el EA dice ...array out of range in 'HiLo.mq4' (121,15)

¿Cuál es el 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:

Otro indicador, también matriz fuera de rango.

Va al gráfico sin problemas, pero cuando lo llamo desde el EA dice ...array out of range in 'HiLo.mq4' (121,15)

¿Cuál es el problema?


No comprueba si hay 1000 barras en el gráfico. Por ejemplo, en el momento de abrir el terminal hay 0 barras en todos los gráficos, pero el terminal ya ha puesto en marcha los indicadores (no sé por qué lo hace, pero es un hecho). Por lo tanto, cualquier acceso a los búferes de los indicadores provoca la superación de las matrices de las series temporales.

 
Ihor Herasko:

No se comprueba que haya 1000 barras en el gráfico. Por ejemplo, en el momento de la apertura del terminal hay 0 barras en todos los gráficos, pero el terminal ya ha iniciado los indicadores (no está claro por qué lo hace, pero es un hecho). Por lo tanto, cualquier acceso a los búferes de los indicadores provoca la salida de las matrices de las series temporales.

if(Bars<cb)return(0);

Todavía se bloquea.

 
PolarSeaman:

Todavía se bloquea.

Porque el cheque es fundamentalmente erróneo. Digamos que Bars devuelve 1000 y cb también devuelve 1000. Entonces en el bucle en la primera iteración i obtiene el valor 1000. En la primera condición del cuerpo del bucle:

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

dos salidas fuera de la matriz a la vez : acceder a una barra con índice 1000 y otra con índice 1001. Pues si el gráfico tiene 1000 barras, la primera barra tiene el índice 0 y la última el índice 999.

Más adelante, en el cuerpo del bucle, hay una referencia a los compases aún más lejanos de la historia:

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

Todo esto debe tenerse en cuenta en la comprobación inicial.

Para una comprobación adecuada, consulte el ejemplo de la función IndicatorCounted() en MQL4 Reference. Sólo que ahora es mejor sustituir IndicatorCounted() por el uso conjunto de las variables rates_total (esto es Bars) y prev_calculated (esto es IndicatorCounted()).