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

 

¿Es posible pasar parámetros de entrada dinámicos al indicador a través de iCustom? Cuando intento hacer esto, se abre una nueva ventana del indicador, para cada nuevo parámetro de entrada dinámico.

   if(NewBarCur())BulsPeriod++;
   double sep_window=iCustom(Symbol(),PERIOD_CURRENT,"Bulls",BulsPeriod,0,0);
 
Y esta pregunta, ¿hay alguna manera de saber si, por ejemplo, queda 1 barra o 3 minutos en el gráfico de prueba?
 
Artyom Trishkin:

En este hilo quiero empezar a ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este será un buen lugar para discutir las tareas, los algoritmos para resolverlas, y cualquier otra pregunta, de todos modos, relacionada con la programación MT.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros y el hilo sea interesante para todos.


Artyom Trishkin:

En esta rama, me gustaría empezar a ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este será un buen lugar para discutir problemas, algoritmos y cualquier otra cuestión relacionada con la programación de MT.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros para resolver los problemas y el hilo sea de interés para todos.


Artyom Trishkin:

En esta rama, me gustaría empezar a ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este será un buen lugar para discutir problemas, algoritmos y cualquier otra cuestión relacionada con la programación de MT.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros y este tema sea interesante para todos.


Artyom Trishkin:

En esta rama, me gustaría empezar a ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este será un buen lugar para discutir problemas, algoritmos y cualquier otra cuestión relacionada con la programación de MT.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros y este tema sea interesante para todos.


Artyom Trishkin:

En esta rama, me gustaría empezar a ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este será un buen lugar para discutir las tareas, los algoritmos de su solución y cualquier otra cuestión, de una manera u otra, relacionada con la programación MT.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros y este tema sea interesante para todos.


Artyom

Artyom Trishkin:

Quiero empezar este capítulo para ayudar a aquellos que realmente quieren entender y aprender a programar en el nuevo MQL4 y quieren cambiar fácilmente a MQL5 - los lenguajes son muy similares.

Este es un lugar para discutir las tareas, los algoritmos para resolverlas y cualquier otra cuestión que esté relacionada con la programación de MT de una u otra manera.

Espero que otros miembros experimentados de nuestro foro se unan a nosotros para resolver los problemas y el hilo sea de interés para todos.


Ayúdenme, he añadido la función trailing stop a mi EA, lo he probado y me da dos errores. - No tengo ni idea de cómo arreglarlas. Sin embargo, las operaciones se cierran según la antigua estrategia después de que el precio haya tocado el límite superior del canal y el inferior, respectivamente. Supongo que aquí también hay que cambiar algo. - Vuelve a llamar a los chicos del ejército de la DNR.

#property copyright "Copyright 2017, MetaQuotes Software Corp.

#enlace de propiedad "https://www.mql5.com"

#versión de la propiedad "1.00"

#propiedad estricta


//---------------------------------------------------------

extern double Lots = 0,01;

extern int TomaDeBeneficio = 600;

extern int StopLoss = 25;

extern int Magia = 0001;

extern int Deslizamiento = 3;

extern int TralType = 0; // 0-SAR, 1-ATR, 2-HMA.

extern double SAR_Step = 0.02;

extern double SAR_Max = 0.2;

extern int ATR_Period = 14;

extern double ATR_K = 2.0;

extern inttern HMA_Period = 16;

extern intern HMA_Method = 3;

extern inttern HMA_Shift = 0;

datetime LBT;

//---------------------------------------------------------

extern string TMA = "Parámetros del indicador TMA";

cadena externa TimeFrame = "marco temporal actual";

extern int MediaLongitud = 56;

extern int Precio = "PRICE_CLOSE;

extern double ATRMultiplier = 2.0;

extern inttern ATRPeriod = 100;

extern bool Interpolar = true;

//---------------------------------------------------------

doble PriceHigh, PriceLow, SL, TP;

int ticket;


//+------------------------------------------------------------------+

//| Función de inicialización de expertos |

//+------------------------------------------------------------------+

int OnInit()

{

si (Dígitos == 3 || Dígitos = 5)

{

TakeProfit *= 10;

StopLoss *= 10;

Deslizamiento *= 10;

}

return(INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| Función de desinicialización experta |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{


}

//+------------------------------------------------------------------+

//| función de tic experto |

//+------------------------------------------------------------------+

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

if(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);

si (billete > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

TP = NormalizeDouble(Oferta - TakeProfit*Punto, Dígitos);

if (OrderSelect(ticket, SELECT_BY_TICKET))

if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("¡Error de modificación del pedido!)

}

}

if (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);

si (billete > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);

SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("¡Error al modificar la orden de compra!)

} else Print("Error al abrir la orden de compra");

}

//+------------------------------------------------------------------+

//| Función de inicialización de expertos |

//+------------------------------------------------------------------+

int init()

{

//--------


//--------

retorno (0);

}

//+------------------------------------------------------------------+

//| función de tic experto |

//+------------------------------------------------------------------+

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

if(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);

si (billete > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

TP = NormalizeDouble(Oferta - TakeProfit*Punto, Dígitos);

if (OrderSelect(ticket, SELECT_BY_TICKET))

if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("¡Error al modificar la orden de venta!)

} else Print("¡Error al abrir la orden de venta!)

}

if (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);

si (billete > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);

SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("¡Error al modificar la orden de compra!)

} else Print("Error al abrir la orden de compra");

}

if (Ask <= PriceLow && CountSell() > 0)

{

for (int i = OrdersTotal() -1; i>0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)

if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))

Print("¡Error de cierre de la orden de venta!)

}

}

}

if (Bid >= PriceHigh && CountBuy() > 0)

{

for (int i = OrdersTotal() -1; i>0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)

if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))

Print("¡Error de compra de OrderClose!)

}

}

}

}

//+------------------------------------------------------------------+

int CuentaVenta()

{

int cuenta = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

cuenta++;

}

}

return(count);

}//+------------------------------------------------------------------+

int CuentaCompra()

{

int cuenta = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

cuenta++;

}

}

return(count);

}

//+------------------------------------------------------------------+

//| Función de desinicialización experta |

//+------------------------------------------------------------------+

int deinit()

{

//+-------


//+-------

devolver (0)

}

//+------------------------------------------------------------------+

//| función de inicio experto |

//+------------------------------------------------------------------+

int Inicio()

{

//-----

bool error = fals;

if (LBT!=Time[0]) {

if (OrdersTotal()!=0) {

for (int i=0; i<OrdersTotal(); i++) {

if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {

double SL = OrderStopLoss();

si OrderType()==0) {

switch (TralType) {

caso 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);

romper;

caso 1: SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K;

romper;

caso 2: SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0);

romper;

}

si (SL<OrderStopLoss())

SL = OrderStopLoss();

}

si (OrderType()==1) {

switch (TralType) {

caso 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);

romper;

caso 1: SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K;

romper;

caso 2: SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0);

romper;

}

si (SL>OrderStopLoss())

SL = OrderStopLoss();

}

si (SL!=OrderStopLoss()) {

if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))

error = true;

}

}

}

}

si (!error)

LBT = Tiempo[0];

}

retorno (0);

}

//+------------------------------------------------------------------+

 
vkravtzov:

¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!


¡¡Aprende a insertar código!!

 
vkravtzov: Ayúdenme a entender, he añadido la función trailing stop al Expert Advisor, lo he probado y me da dos errores. - Me he roto los sesos y no sé cómo arreglarlos. Sin embargo, las operaciones se cierran según la antigua estrategia después de que el precio haya tocado el límite superior del canal y el inferior, respectivamente. Supongo que aquí también hay que cambiar algo. - Vuelve a llamar a los chicos del ejército de la DNR.

Decidí ayudar. Pero tengo preguntas para el autor: tienes estas dos funciones de inicialización, ¿qué hacen?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
   }
   return(INIT_SUCCEEDED);
}


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//--------
//--------
    return (0);
    }

Hay dosfunciones OnTick().... y una tercera función int Start() - todas ellas se ejecutan con la llegada del tick. ¿Y en qué orden los iniciará el terminal?

Error: falta una llave de cierre al final de la función OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
  PriceLow  = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
  if(CountSell() == 0 && Bid >= PriceHigh)
  {
     ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
     if (ticket > 0)
     {
        SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
        TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
        if (OrderSelect(ticket, SELECT_BY_TICKET))
           if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на продажу!");
     }
  }
  if (CountBuy() == 0 && Ask <= PriceLow)
  {
     ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
     if (ticket > 0)
     {
        TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
        SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
        if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на покупку!");
     }   else Print("Ошибка открытия ордера на покупку");
   }
}    // Эту скобку добавил !!!!!!!!!!!!!!!!!!!!!!!!!

Ahora el compilador ha detectado 8 errores. He borrado .

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//--------
//--------
    return (0);
    }


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
//+-------
//+-------
   return (0);
   }

Ahora hay 7 errores.

He sustituido if(OrderType()==0) por un paréntesis después de if: if(OrderType()==0) - Se han producido 8 errores

iATR(NULL,0,ATR,Period,1) - necesitamos iATR(NULL,0,ATR_Period,1) - se han producido 2 errores

bool error = fals; necesitamos bool error = false; - los errores se convirtieron en 3

¿Dónde podemos obtener el indicador VininI_HMAsound&amp? ¿Qué parámetros hay? = el error seguiría siendo 1

¿Y por qué haces una pregunta en tres sitios?

 

Ayuda para descargar e instalar EAs gratis y señales en mt4 no como neemogu encontrar descarga vide sólo cómo instalar, pero no descargar. Dime dónde buscar

 
vovik36 Степанов:

Ayuda para descargar e instalar EAs gratis y señales en mt4 no como neemogu encontrar descarga vide sólo cómo instalar, pero no descargar. Por favor, indíqueme dónde buscar.

Primero graduarse, luego venir.

 
Artyom Trishkin:

¿Qué te parece?


   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
       {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
                   Comment(ima);
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

Hola. ¿Puedes decirme por qué no veima=iMA(Symbol(),1,60,0,1,0,k). El comentario muestra una cotización mucho más alta que la propia línea. Es la razón por la que los valores mínimos y máximos no se calculan correctamente.

 
Rustam Bikbulatov:

Hola. ¿Puedes decirme por qué no veima=iMA(NULL,60,24,0,1,0,k). El comentario muestra una cotización mucho más alta que la propia línea. Esta es la razón por la que los valores mínimos y máximos no se calculan correctamente.

iMA está numerando como en las series de tiempo, el 0 es el número más relevante. Puede que en su caso sea al revés
 
Maxim Kuznetsov:
iMA está numerando como en las series de tiempo, el 0 es el número más relevante. Y probablemente lo tengas al revés.

Es una apuesta involuntaria. No cambia nada. ¡El punto es que se muestra incorrectamente con k!

Razón de la queja: