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

 

Decidí añadir a la pregunta anterior.

1)

Supongamos que tengo una señal - cuando el diferencial se amplía bruscamente (en las noticias)

Cerrar todas las operaciones actuales

Pero las órdenes no sólo se cerrarán o abrirán durante las noticias.

Por lo tanto, si tomamos un comando, digamos, OrderClose, lo ponemos en un bucle + Sleep (3000) y lo ejecutamos hasta que se cierre

2)

Si vinculamos una variable interna en el botón y asignamos el valor pulsado/cerrado a la posibilidad de apertura de la orden, ¿funcionará en tiempo real?

 
trader781:

Decidí añadir a la pregunta anterior.

1)

Supongamos que tengo una señal - cuando el diferencial se amplía bruscamente (en las noticias)

Cerrar todas las operaciones actuales

Pero las órdenes no sólo se cerrarán o abrirán durante las noticias.

Por lo tanto, si tomamos un comando, digamos, OrderClose, lo ponemos en un bucle + Sleep (3000) y lo ejecutamos hasta que se cierre

2)

Si vinculamos una variable interna en el botón y asignamos el valor pulsado/cerrado a la posibilidad de apertura de la orden, ¿funcionará en tiempo real?

1) No es Sleep(3000) sino el manejo de errores lo que ayuda.
 

Saludos, estoy escribiendo un indicador que dibujael historial de órdenes en un gráfico, código:

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int        MagicNumber                = 1110;
extern datetime   HistoryOrdersFromDateTime  = 0;
extern color      SellColor                  = clrRed;
extern color      BuyColor                   = clrBlue;
extern color      ProfitColor                = clrWhite;
extern bool       DeleteHistoryOrders        = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
      {
         if(HistoryOrdersFromDateTime<OrderCloseTime())
         {
            if((TimeCurrent()-OrderCloseTime())>60)
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
   datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
   string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
   color col=SellColor;
   if(OrderType()==0) {col=BuyColor; type="Buy";}

   if(DeleteHistoryOrders==false)
   {
      //Начальная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
      
      //Линия  
      ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
  
      //Конечная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
      
      //Размер фона  
      for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
         StringAdd(Background,"g");
      
      //Фон профита
      ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
      ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
  
      //Профит
      ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
   } else ObjectsDeleteAll(0, "#"+Ticket+" ");  
}

void OnDeinit(const int reason)
{  
   //Удалаение истории ордеров
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      DeleteHistoryOrders=true;
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         HistoryOrders();
   }
}

El indicador dibuja correctamente las operaciones individuales (línea>fondo>ganancia), pero hay un pequeño "bug" en la visualización de los conjuntos de órdenes cerradas (captura de pantalla adjunta), las líneas se superponen al fondo y a la ganancia (línea(1)>fondo>ganancia>línea(2)>línea(3)>línea(4) . ).

Debería ser así: (línea(1)>línea(2)>línea(3)>línea(4) . . . >fon>profit). Varias manipulaciones no han tenido éxito, por favor ayude a perfeccionar.

Archivos adjuntos:
 
ilnur17021992:

Saludos, estoy escribiendo un indicador que muestrael historial de órdenes en un gráfico,


El indicador renderiza correctamente una operación simple (línea>fondo>ganancia), pero en la visualización de un conjunto de órdenes cerradas se produce un pequeño "shoosh" (adjunto una captura de pantalla), las líneas (línea(1)>fondo>ganancia>línea(2)>línea(3)>línea(4)...) se superponen al fondo y a la ganancia. ).

Debería ser así: (línea(1)>línea(2)>línea(3)>línea(4) . . . >fon>profit). Varias manipulaciones no han tenido éxito, por favor ayude a perfeccionar.

Intente asignar líneas e iconos a la propiedad OBJPROP_BACK en el fondo.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov:
Intenta asignar la propiedad OBJPROP_BACK a las líneas e iconos del fondo.
No es una opción, las líneas se dibujan en el fondo (detrás de las velas). El dibujo debe estar sobre las velas: velas>líneas>beneficio fondo>beneficio
Archivos adjuntos:
 
ilnur17021992:
No es una opción, por lo que las líneas están en el fondo (detrás de las velas), y el dibujo debe estar sobre las velas: velas>líneas>beneficio>fondo del beneficio
A continuación, sólo la secuencia de dibujo en el gráfico. O bien, al dibujar el fondo y el beneficio, deberíamos comprobar la existencia de estos objetos por tiempo, leer el valor del beneficio en el objeto OBJ_TEXT y añadirlo al beneficio de la orden actual. Entonces deberíamos borrar el fondo y el beneficio y volver a dibujarlos.
Por cierto, esto eliminará un ciclo adicional para el cálculo de los beneficios.

Puedes hacer esto
      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
se define el beneficio al principio junto con todos los demás parámetros de la orden.

ps Por favor. Colocar una imagen con este botón
 
Alexey Viktorov:
A continuación, sólo la secuencia de dibujo en el gráfico. O bien, al dibujar el fondo y el beneficio, deberíamos comprobar la disponibilidad de estos objetos por tiempo, leer el valor del beneficio en el objeto OBJ_TEXT y añadirlo al beneficio de la orden actual. Luego debemos borrar el fondo y el beneficio y volver a dibujarlos.
Por cierto, esto eliminará la necesidad de un ciclo adicional para calcular el beneficio.
El beneficio se define al principio junto con todos los demás parámetros de la orden.

¿Cómo puedo establecer esta secuencia de dibujo, por ejemplo, dibujar primero todos los puntos y las líneas que los conectan, y luego empezar a dibujar el fondo y el beneficio?

 
ilnur17021992:

¿Cómo puedo establecer esta secuencia de dibujo, por ejemplo, dibujar primero todos los puntos y las líneas que los conectan, y luego proceder a dibujar el fondo y el beneficio?

Bueno, si por mi primera suposición, entonces sí. Y enseguida tuve una idea improvisada y no borré la primera frase, pero me gusta más la segunda.

Será mejor que consideres esta variante.

ObjectFind() entonces si se encuentra el objeto ObjectGetString() lo convierte de texto a número, añade la ganancia de la última orden al valor obtenido, borra el OBJ_TEXT obsoleto y dibuja uno nuevo.
Si es la primera o la única orden cerrada en esta barra, simplemente dibujamos
OBJ_TEXT y listo.
Para facilitar las cosas, deberíamos especificar la hora de apertura del bar en lugar del ticket. ¿O el billete es necesario para seguir trabajando?

 
Alexey Viktorov:
Bueno, si en mi primera suposición, lo hace. Y enseguida se me ocurrió una idea improvisada y no borré la primera frase, pero me gusta más la segunda.

Será mejor que consideres esta variante.

ObjectFind() entonces si se encuentra el objeto ObjectGetString() lo convierte de texto a número, añade la ganancia de la última orden al valor obtenido, borra el OBJ_TEXT obsoleto y dibuja uno nuevo.
Si es la primera o la única orden cerrada en esta barra, simplemente dibujamos
OBJ_TEXT y listo.
Para facilitar las cosas, deberíamos especificar la hora de apertura del bar en lugar del billete. ¿O el billete es necesario para seguir trabajando?

Sí, el billete es necesario para el análisis posterior de la historia. Gracias por el consejo sobre el rediseño. Resuelto el problema un poco más fácil añadiendo esta comprobación y redibujando el código:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

No sé si es correcto, pero en principio dibuja como debe ser (líneas>fon>ganancia):

 
ilnur17021992:

Sí, el billete es necesario para analizar el historial más adelante. Resuelto el problema un poco más fácil añadiendo dicha comprobación y redibujando el código:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Básicamente dibuja correctamente (líneas>fondo>ganancia):

Bueno, está bien, me alegro por ti.
Razón de la queja: