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

 
neverness:

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

 
neverness:

¿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.

la nevada:

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í

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[])
  {
//---
for(int i = 1; i < 100;i++)
      {
      if(open[i] > Max)
            {
            
           if(int  ObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
            ObjectCreate(Здесь параметры функции согласно документации.
                         Например, эллипса, или буквы на графике, или еще чего-нибудь);
               
            }  //if(open)
      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate
 
Vitaly Muzichenko:

En unos 20 minutos te contestaré.

El vídeo tardó mucho tiempo en cargarse: más de 40 minutos.


//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mapping
   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[])
  {
//---
 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);
 // ....
  ObjectMove(0, "Ellipse",0,time[1],open[5]);
  ObjectMove(0, "Ellipse",1,time[10],open[15]);
  ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool EllipseCreate(const long            chart_ID=0,        // ID графика 
                   const string          name="Ellipse",    // имя эллипса 
                   const int             sub_window=0,      // номер подокна  
                   datetime              time1=0,           // время первой точки 
                   double                price1=0,          // цена первой точки 
                   datetime              time2=0,           // время второй точки 
                   double                price2=0,          // цена второй точки 
                   datetime              time3=0,           // время третьей точки 
                   double                price3=0,          // цена третьей точки 
                   const color           clr=clrRed,        // цвет эллипса 
                   const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса 
                   const int             width=1,           // толщина линий эллипса 
                   const bool            fill=false,        // заливка эллипса цветом 
                   const bool            back=false,        // на заднем плане 
                   const bool            selection=true,    // выделить для перемещений 
                   const bool            hidden=true,       // скрыт в списке объектов 
                   const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
  // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим эллипс по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать эллипс! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
Archivos adjuntos:
Set.mq5  10 kb
 
Vitaly Muzichenko:

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

 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);

e incluso completamente innecesario e inútil.

 
neverness:

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

 

¿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/

Запуск Windows на Mac — виртуальная машина Parallels Desktop 14 для Mac
  • www.parallels.com
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels 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

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
Archivos adjuntos:
 
Michail_David:

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

 if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()!= StopLoss_SELL && StopLoss_SELL>Bid)

modificará el código Y, insértelo correctamente (Alt+S).

Razón de la queja: