Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 623
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Ya he descrito la tarea más sencilla.
Abre el MetaEditor.
Haga clic en Archivo->Crear.
En el campo emergente seleccione Indicador.
...
Pero este código no es aceptado por el traductor MQL.
Responderé en unos 20 minutos
¿Qué hacen ustedes, niños, agitando las aguas?
Nadie está haciendo un escándalo. La situación por fin empieza a aclararse un poco. Resulta que se llama script a una función que no se puede colocar en el cuerpo del código principal.
Tampoco hay que olvidar que la MT está pensada para trabajar con dinero que debe ser protegido de los ataques de terceros. De ahí la mayoría de las limitaciones de la lengua.
Ya he descrito una tarea sencilla.
Abre el MetaEditor.
Haga clic en Archivo->Crear.
En el campo emergente seleccione Indicador.
En el campo Indicador OnCalculate() incruste cualquier objeto de script con el evento OnStart().
Yo personalmente no sé cómo hacerlo. Bueno, por ejemplo así:
int OnCalculate(const int rates_total,
const int prev_calculado,
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[])
{
//---
for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
OnStart()
Y aquí escribimos un script para construir el objeto que nos interesa. Por ejemplo, una elipse o una letra en un gráfico o cualquier otra cosa
} //if(open)
} //for(int i)
//--- devuelve el valor de prev_calculado para la siguiente llamada
return(rates_total)
} // OnCalculate
Esto debería ser algo así.
Pero el traductor MQL no percibe tal código.
Debería ser algo así
En unos 20 minutos te contestaré.
El vídeo tardó mucho tiempo en cargarse: más de 40 minutos.
El vídeo tardó mucho en cargarse: más de 40 minutos.
También a veces mezclo las secciones del foro y escribo una respuesta a una pregunta en mql4 en mql5.
En principio, en este caso no cambiará nada excepto la extensión del archivo, pero en mql4 será superfluo
e incluso completamente innecesario e inútil.
¿Qué hacen ustedes, niños, agitando las aguas?
Sólo tienes que ir al MetaEditor, y escribir el comando: Archivo->Crear...
Esto hará que aparezca un formulario con diferentes archivos ficticios.
En concreto, serán los dongles:
- Asesor experto
- Indicador personalizado
- Guión
- Biblioteca, etc.
Nos interesan los tres primeros elementos: Asesor Experto, Indicador Personalizado y Script.
Comparemos estos muñecos:
En Expert Advisor tenemos eventos:
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... todo, no más.
En el guión tenemos los eventos:
- OnStart() ... eso es todo, no más.
en el indicador tenemos eventos:
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... todo, no más.
La pregunta natural aquí es cómo hacer la conexión entre estos objetos.
Resulta que no hay ni puede haber conexión entre ellos en MQL, porque los flujos de datos entre estos objetos están completamente separados y no hay conexión entre ellos.
Además, me sorprende que los creadores de MQL nos den este hecho como "bueno".
Y si, por ejemplo, en C++ puedo llamar fácilmente al traductor de BASIC, o Javascript o cualquier otro traductor, e ir, por ejemplo, al entorno de programación de Android,
en el marco de MQL, ni siquiera puedo crear un llamado "script" en el entorno del "indicador", porque el entorno del indicador no acepta el comando OnStart().
¿Qué clase de fenómeno es éste?
Y hay más que suficiente de esas cosas feas en MQL.
Están a cada paso.
He leído la descripción de MQL - y estoy sorprendido, porque no hay nada más que hacer.
Todo el tiempo los creadores de MQL proclaman a viva voz que MQL es un descendiente de C++.
Por supuesto, lo siento, pero quiero preguntar a los creadores de MQL: - ¿Heredero de qué? - ¿En su fealdad?
Sin querer, comparo MQL con el famoso entorno de programación 1C. También dicen ser los herederos de C++.
Pero allí todo se hace de forma mucho más decente.
Y los objetos gráficos, y la comunicación entre módulos y mucho más.
¿Y qué hay en MQL?
No hay clases incorporadas, ni objetos relacionados con los hilos... ni nada de nada.
¡¡¡Y no he dicho nada de la cáscara matemática del terminal!!!
¡¡¡Eso es un tema aparte para las sorpresas!!!
Por qué no lees un poco de Ayuda y encuentras todas esas cosas que dices que no existen, lees sobre las clases incorporadas en SB, aprendes a pedir ayuda educadamente (sí pediste ayuda) y aprendes a no ser grosero con la gente que intenta ayudarte (nótese esto desinteresadamente)...
En general - banearte durante 24 horas por trolling, grosería y mendicidad (no has mostrado una línea de tu código para probar todas tus afirmaciones, pero impúdicamente exiges a las personas que han respondido a tu pregunta y afirmaciones, que te proporcionen un código de trabajo para tus necesidades - no es habitual aquí - ayudan, no hacen por ti, nota - el código más simple)
Sin ánimo de ofender, el que se acerque sin nada será asesinado por algo ininteligible.
Más aún cuando te advertí que bajaras la temperatura:
Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio
Cualquier pregunta de los principiantes sobre MQL4, ayuda y discusión sobre algoritmos y códigos
Artyom Trishkin, 2018.09.12 14:02
Ahora inténtalo sin los insultos y la arrogancia.¿cómo instalar mt4 en macOS? ¡ayuda por favor!
Exclusivamente en una máquina virtual. Yo tengo el Paralelo, caro pero cómodo y fiable.
https://www.parallels.com/ru/products/desktop/
Estoy pidiendo ayuda. Las preguntas son:
1. El programa no establece stop losses tanto en la compra como en la venta en el modo de prueba. Pero la modificación de los pedidos pendientes va bien.
2. No se inicia en tiempo real a cuenta.
Por favor, ayuda.
También me gustaría pedir que se señalen los errores que puedan haber ocurrido al escribir el programa.
Muchas gracias de antemano.
Código del programa:
.input int Porcentaje=50;
input int MAGICNUMBER=413;
//Introducción de constantes y osciladores de indicadores para los gráficos a largo plazo
input int Periodo_de_señal_largo_tiempo=6;
input int Periodo_largo_de_EMA_rápido=12;
input int Periodo_largo_de_EMA_lento=24;
//Parámetros de impacto de los indicadores y constantes de los osciladores para los gráficos de corto plazo
input int Periodo_estocástico_corto_plazo=5;
input int Periodo_Estocástico_corto_plazo=3;
input int Ralentización_estocástica_corto plazo=3;
input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;
input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;
//-----------------------------------------------------------------------------------------
//variables comunes y sus tipos
static datetime New_Time;//hora de la barra actual
static datetime Time_Local;
double Margin_Percent; //Medio de apertura de las órdenes
double Lots;/Determinación del número total de lotes
doble Volumen_de_lotes;
//Variables y tipos para el gráfico a largo plazo
double MacdCurrent_long_term;//Parámetros MACD de la línea principal de la barra actual
double MacdPrevious_long_term;//Parámetros MACD de la línea principal de la barra anterior
double SeñalCorriente_larga_temporada;
//Variables y tipos para el gráfico a corto plazo
double Stochastic_Current_short_term_main;//Parámetros estocásticos de la barra actual en el gráfico de 5 minutos
double Stochastic_Previous_short_term_main;//Parámetros estocásticos de la barra anterior en el gráfico de 5 minutos
double Stochastic_Current_short_term_signal;//Parámetros estocásticos de la barra actual en el gráfico de 5 minutos
double Stochastic_Previous_short_term_signal;//Parámetros estocásticos de la barra anterior en el gráfico de 5 minutos
doble StopLoss_BUY;
doble StopLoss_SELL;
doble Precio_BUY;
doble Precio_Venta;
//+------------------------------------------------------------------+
//| Función de inicialización de expertos |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| función de tic experto |
//+------------------------------------------------------------------+
void OnTick()
{
int ticket,cnt;
int total=OrdersTotal();// Determinación del número de pedidos
bool New_Bar=false; // Marcar nueva barra
/Definir los valores de las variables para el gráfico a largo plazo
MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);
MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);
SeñalCorriente_larga=iMACD(NULL,PERIODOS_largos,EMA_rápido_periodo_largo,EMA_lento_periodo_largo,Señal_periodo_largo,PRECIO_TIPICO,MODO_SIGNAL,1);
/Determinación de los valores de las variables para el gráfico a corto plazo
Stochastic_Current_short_termain=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);
Stochastic_Previous_short_termain=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);
Estocástico_actual_señal_corto_tiempo=iStocástico(NULL,PERIODOS_corto_tiempo,Estocástico_Periodo_corto_tiempo,Estocástico_Periodo_corto_tiempo,Estocástico_desaceleración_corto_tiempo,MODO_SMA,0,MODO_SIGNAL,1);
Stochastic_Previous_short_teral=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);
/Definición de variables comunes
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Precio_Venta=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Margin_Percent=Margen libre de la cuenta()*Percent/100;
Lotes=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
Nueva_Hora=HoraCorriente();
Print("Hora=",HoraActual();
Print("Hora de apertura de la barra =",iTime(NULL,PERIODs_short_term,0));
if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Comparar tiempos
{
if(iVolume(NULL,PERIODs_short_term,0)<=2) //comparar volumen
Print("Volumen de la barra =",Volumen[0]);
if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Comprobar el índice de la barra
Print("Índice de barra =",iBarShift(NULL,PERIODs_short_term,TimeCurrent());
New_Bar=true; // Se captura una nueva barra
Print("Nueva_Barra");
}
else if(New_Bar==false) // Si la barra no es nueva...
{
Print("La barra no es nueva");
volver;
}
//--Comprobar la disponibilidad de fondos para abrir el lote mínimo
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
{
Print("No hay fondos suficientes. Fondos libres = ",AccountFreeMargin());
volver;
}
//--Determinación del número de lotes
if(Lotes>Lotes_Volumen)
{
Lotes=NormalizarDoble(Lotes_Volumen,2);
Print("Número de lotes : ",Lotes);
}
else if(Lots<Lots_Volume)
{
Lotes=NormalizarDoble(MathFloor(Lotes),2);
Print("Número de lotes : ",Lotes);
}
//+------------------------------------------------------------------+
//| Condiciones para la apertura de órdenes si el número de órdenes es igual a cero |
//+------------------------------------------------------------------+
if(total<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Print("La condición es verdadera para la compra");
{
//+---------------------------------------------------------------------------+
//| Condición para la apertura de una posición larga de COMPRA solamente ||
//+---------------------------------------------------------------------------+
if(Estocástico_actual_corto_termino_principal<Estocástico_actual_corto_termino_señal && Estocástico_Previo_corto_termino_principal>=Estocástico_Previo_corto_termino_señal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);
if(ticket>0)//comprobar posición abierta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Orden de compra abierta : ",OrderOpenPrice());
volver;
}
else Print("Error de apertura de orden de compra : ",GetLastError());
volver;
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Print("La condición es verdadera para la VENTA");
{
//+---------------------------------------------------------------------------+
//| Condición para la apertura de posiciones cortas de VENTA sólo |
//+---------------------------------------------------------------------------+
if(Estocástico_actual_cortocircuitom_main>Stocástico_Cortocircuito_señal && Estocástico_Anterior_cortocircuitom_main<=Estocástico_Anterior_cortocircuito_señal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//comprobar posición abierta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Orden de venta abierta : ",OrderOpenPrice());
volver;
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
volver;
}
}
}
}
//+---------------------------------------------------------------------------+
//| Condiciones de modificación de la orden |
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<total;cnt++)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continuar;
if(OrderMagicNumber()==MAGICNUMBER && // comprobar el número mágico del pedido
OrderSymbol()==Symbol()) // comprobar el símbolo de la orden
{
//--- posición larga abierta
if(OrderType()==OP_BUYSTOP)
{
if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,0,Blue))
Print("La orden Price_BUY ha sido modificada con éxito");
else Print("Error al modificar la orden BUYStop. Código de error=",GetLastError());
volver;
}
else Print("El precio de modificación es mayor que el precio del pedido");
volver;
}
if(OrderType()==OP_SELLSTOP)
{
if(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,0,Green))
Print("La orden Precio_Venta ha sido modificada con éxito");
else Print("Error al modificar la orden SELLStop. Código de error=",GetLastError();
volver;
}
}
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("El precio de la orden Price_BUY ha sido modificado con éxito");
else Print("Error al modificar la orden de COMPRA. Código de error=",GetLastError());
volver;
}
}
if(OrderType()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))
Print("El precio de la orden Price_SELL ha sido modificado con éxito");
else Print("Error al modificar la orden de VENTA. Código de error=",GetLastError();
volver;
}
}
}
}
}
//+------------------------------------------------------------------+
Ayuda a corregir un error en el indicador, no dibuja el máximo y el mínimo del día cuando está en la última vela de la hora.
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
Estoy pidiendo ayuda. Las preguntas son:
1. El programa no establece stop losses tanto en la compra como en la venta en el modo de prueba. Pero modifica las órdenes pendientes.
2. No se inicia en tiempo real a cuenta.
Así es como
modificará el código Y, insértelo correctamente (Alt+S).