![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
Ok, ya entendí el cálculo del pivote. Gracias por su ayuda.
El problema al que me enfrento ahora es que cuando abre correctamente la orden pendiente en las ubicaciones correctas del precio, continúa abriendo órdenes pendientes una y otra vez cada vez que la acción del precio se mueve 1 pip.
He mirado y seguiré investigando por qué ocurre esto pero quería ver si me puedes dar una pista o ayuda si ves un error lógico que estoy cometiendo.
Como siempre gracias por tu tiempo.
extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.
extern int look_price_min = 35; // Offset in minutes when to look on price.
extern int close_hour = 12; // Close all orders after this hour
bool use_close_hour = true; // set it to false to ignore close_hour
int take_profit = 20;
extern int Currency_Spread = 4;
int open_long = 21;
int open_short = 21;
int stop_long = 30;
int stop_short = 30;
extern int slippage = 0;// Put what your brooker requires
extern double lots = 0.20; // Position size
extern int magic = 123;
bool clear_to_send = true;
void ReportStrategy()
{
int totalorders = HistoryTotal();
double StrategyProfit = 0.0;
double StrategyProfitOpen = 0.0;
int StrategyOrders = 0;
int StrategyOrdersOpen = 0;
for(int j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrders++;
StrategyProfit += OrderProfit();
}
}
}
totalorders = OrdersTotal();
for(j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrdersOpen++;
StrategyProfitOpen += OrderProfit();
}
}
}
Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",
StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",
"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));
return;
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ReportStrategy();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
ReportStrategy();
if(Hour() >= close_hour &&
use_close_hour){
// we are after closing time
int totalorders = OrdersTotal();
for(int j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
return(0);
}
if(Hour() == look_price_hour &&
Minute() >= look_price_min &&
clear_to_send){
// Probably I need to close any old positions first:
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
}
double PIVOT;
PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;
// Send orders:
OrderSend(Symbol(),
OP_BUYSTOP,
lots,
PIVOT+(open_long+Currency_Spread)*Point, // Spread included
slippage,
PIVOT+((open_long+Currency_Spread)-stop_long)*Point,
PIVOT+((open_long+Currency_Spread)+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
OrderSend(Symbol(),
OP_SELLSTOP,
lots,
PIVOT-open_short*Point,
slippage,
PIVOT-(open_short-stop_short)*Point,
PIVOT-(open_short+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
clear_to_send = false; // mark that orders are sent
if(!clear_to_send){ // there are active orders
int long_ticket = -1;
int short_ticket = -1;
bool no_active_order = true;
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUYSTOP)
long_ticket = OrderTicket();
if(OrderType() == OP_SELLSTOP)
short_ticket = OrderTicket();
if(OrderType() == OP_BUY ||
OrderType() == OP_SELL) // Active order
no_active_order = false; }
}
if(short_ticket == -1 && long_ticket != -1)
OrderDelete(long_ticket);
if(long_ticket == -1 && short_ticket != -1)
OrderDelete(short_ticket);
if(long_ticket == -1 && short_ticket == -1 && no_active_order &&
Hour() != look_price_hour && Minute() >= look_price_min)
clear_to_send = true;
if(Hour() == (look_price_hour-1) &&
MathAbs(Minute() - look_price_min) < 10)
clear_to_send = true;
}
//----
return(0);
}
Con respecto a mi post anterior,
Parece que el "clear_to_send = false;" no está cambiando después de la orden pendiente. ¿Alguna idea?
Esto sucedió una vez que hago el pivote mi punto de referencia para las órdenes pendientes. Si no puedo resolver esta lógica, entonces supongo que voy a tratar de averiguar cómo hacer referencia a un pivote de un indicador y llamar a ella de la EA. no estoy seguro de que es posible, pero veo que mis opciones.
Cualquier consejo o ayuda es apreciada.
extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.
extern int look_price_min = 35; // Offset in minutes when to look on price.
extern int close_hour = 12; // Close all orders after this hour
bool use_close_hour = true; // set it to false to ignore close_hour
int take_profit = 20;
extern int Currency_Spread = 4;
int open_long = 21;
int open_short = 21;
int stop_long = 30;
int stop_short = 30;
extern int slippage = 0;// Put what your brooker requires
extern double lots = 0.20; // Position size
extern int magic = 123;
bool clear_to_send = true;
void ReportStrategy()
{
int totalorders = HistoryTotal();
double StrategyProfit = 0.0;
double StrategyProfitOpen = 0.0;
int StrategyOrders = 0;
int StrategyOrdersOpen = 0;
for(int j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrders++;
StrategyProfit += OrderProfit();
}
}
}
totalorders = OrdersTotal();
for(j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrdersOpen++;
StrategyProfitOpen += OrderProfit();
}
}
}
Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",
StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",
"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));
return;
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ReportStrategy();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
ReportStrategy();
if(Hour() >= close_hour &&
use_close_hour){
// we are after closing time
int totalorders = OrdersTotal();
for(int j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
return(0);
}
if(Hour() == look_price_hour &&
Minute() >= look_price_min &&
clear_to_send){
// Probably I need to close any old positions first:
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
}
double PIVOT;
PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;
// Send orders:
if (clear_to_send){
OrderSend(Symbol(),
OP_BUYSTOP,
lots,
PIVOT+(open_long+Currency_Spread)*Point, // Spread included
slippage,
PIVOT+((open_long+Currency_Spread)-stop_long)*Point,
PIVOT+((open_long+Currency_Spread)+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
OrderSend(Symbol(),
OP_SELLSTOP,
lots,
PIVOT-open_short*Point,
slippage,
PIVOT-(open_short-stop_short)*Point,
PIVOT-(open_short+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
clear_to_send = false; // mark that orders are sent
}
if(!clear_to_send){ // there are active orders
int long_ticket = -1;
int short_ticket = -1;
bool no_active_order = true;
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUYSTOP)
long_ticket = OrderTicket();
if(OrderType() == OP_SELLSTOP)
short_ticket = OrderTicket();
if(OrderType() == OP_BUY ||
OrderType() == OP_SELL) // Active order
no_active_order = false; }
}
if(short_ticket == -1 && long_ticket != -1)
OrderDelete(long_ticket);
if(long_ticket == -1 && short_ticket != -1)
OrderDelete(short_ticket);
if(long_ticket == -1 && short_ticket == -1 && no_active_order &&
Hour() != look_price_hour && Minute() >= look_price_min)
clear_to_send = true;
if(Hour() == (look_price_hour-1) &&
MathAbs(Minute() - look_price_min) < 10)
clear_to_send = true;
}
//----
return(0);
}
Prueba este código.
Ryanklefas ,
Eres brillante, simplemente brillante en esta área.
Las pruebas que hice a partir de tu modificación funcionaron.
No estoy seguro de por qué la adición de la lógica de pivote interfirió con la lógica actual "Si". Probablemente necesitaba establecer el código del pivote en una ubicación diferente. Sin embargo, veo cómo has aislado el código de la orden pendiente y eso funciona hasta ahora.
Gracias por la URL que me señaló a los ejemplos de código. Eso será un gran recurso mientras mejoro mis habilidades de programación.
Me parece interesante/frustrante cómo la solución de un problema a veces provoca otro.
Problema actual: Ahora necesito averiguar por qué este código sólo permite órdenes pendientes para precios con 5 dígitos y no con 3.
Ejemplo: 1.1234 funciona bien pero 1.12 da un error de que 1.123333 no es un precio válido para OrderSend.
Así que funciona en GBP/USD pero no en USD/JPY.
De nuevo, gracias por su tiempo.
Ryanklefas ,
Eres brillante, simplemente brillante en esta área.
Gracias.
En cuanto a tu problema:
Asegúrate de que antes de enviar los valores pivotantes a la función orderSend, los has normailizado con la función NormalizeDouble; utiliza el valor predefinido "Digits" como segundo parámetro para redondear el doble al número de dígitos apropiado para tu moneda.
Mi problema ha sido cómo redondear el valor calculado al decimal más cercano.
Creo que la función normalizeDouble también te serviría. También he visto código que utiliza las funciones MathFloor y MathCeiling para lograr lo mismo.
Otra ayuda
¿Alguien puede decirme cómo hacer esto?
¿Alguien puede decirme cómo hacer esto?
Creo que está relacionado con este hilo https://www.mql5.com/en/forum/176969
Establecer el color del nivel en el código
¿Puede alguien mostrarme cómo puedo establecer el nivel1 30 en verde y el nivel2 70 en rojo?
#property ventana_de_separación
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_level1 30
#propiedad indicator_level2 70
#propiedad indicador_mínimo 0
#propiedad indicador_máximo 100
Gracias de antemano
¿Puede alguien por favor mostrarme cómo puedo establecer el nivel1 30 a verde y leve2 70 a rojo?
#property ventana_de_separación
#propiedad indicator_buffers 1
#propiedad indicador_color1 DodgerAzul
#propiedad indicator_level1 30
#propiedad indicator_level2 70
#propiedad indicador_mínimo 0
#propiedad indicador_máximo 100
Gracias de antemanoCreo que esta sección del MetaEditor será lo que buscas:
MQL4 Reference - Basics - Preprocessor - Controlling compilation