Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 122
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
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?
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?
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.
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.
Intenta asignar la propiedad OBJPROP_BACK a las líneas e iconos del fondo.
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
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();
}
}
}
ps Por favor. Colocar una imagen con este botón
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?
¿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?
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?
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):
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):