![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
¿Se refiere a la apertura de transacciones en la apertura de una vela D1? Si es así, configure la lógica del Asesor Experto para que abra las operaciones sólo en un momento determinado.
Ya veo. Y otra pregunta: puse dos órdenes pendientes a +15 pips del precio: buystop y sellstop. Y a cada tictac los muevo a un nuevo precio. En cuanto el precio los toca durante los movimientos bruscos del precio (la mayoría de las veces durante las noticias) el terminal se cuelga. (¿Por qué se congela?
No puedo decir por qué se cuelga, no soy un psíquico, tratar con el código del Asesor Experto. Puedo suponer que después de la ejecución de la orden, su EA intenta moverla a un nuevo precio, pero como la orden pendiente ya está en el mercado, su EA se cuelga. Intente visualizar en el registro el estado de las variables clave del Asesor Experto para analizar su lógica de funcionamiento.
No puedo decir por qué se cuelga, no soy un psíquico, tratar con el código del Asesor Experto. Puedo suponer que después de la ejecución de la orden, su EA intenta moverla a un nuevo precio, pero como la orden pendiente ya está en el mercado, su EA se cuelga. Intente visualizar en el registro el estado de las variables clave del EA para analizar la lógica de su trabajo.
Creo que he establecido todas las condiciones correctamente:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
No tienes en cuenta que el límite de compra sólo puede establecerse por debajo del precio y el límite de venta por encima del precio. Para lo que sugieres hay que utilizar órdenes de stop.
De acuerdo, gracias por entender mi confuso algoritmo. Todavía estoy confundido con los nombres de los colgantes...
Dejemos que sean los que paren, ¿quizás debamos intentar construir un EA?
Lo probaré más tarde y mostraré lo que sucede ?
... O dame un enlace a uno, no es que haya descubierto América ?
Creo que he configurado correctamente todas las condiciones de la prueba:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
Me temo que no puedo ayudarte, porque tu código no es analizable. Tal vez pueda añadir algunos comentarios para mejorar su comprensión. No está claro para qué se utiliza el array ord[] y qué datos almacena. He entendido tu código de esta manera: en cada tick escribes el tipo de orden en el array (Uchet_Orderov_Function(Symbol(),Magic,ord);) entonces comprueba la condición if(ord[7]==2 && ord[6]==0 && Volume[0]==1) y si es verdadera, las órdenes pendientes serán eliminadas y todas las posiciones serán cerradas. Entonces comprobamos la condición si (ord[6]==0 && ord[7]==0 && Volume[0]==1) y si es cierta, se abren dos órdenes pendientes. Pero el valor del array ord[] no se actualizará antes de comprobar la condición si (ord[6]==0 && ord[7]==0 && Volume[0]==1). Y se actualizará sólo en el segundo tick.
Así que necesitas registrar todos los valores del array ord[] que afectan a su lógica.
Observe también este fragmento de código:
Creo que faltan paréntesis de software { . Debería ser así:
Ten en cuenta también este fragmento de código:
Creo que faltan los corchetes { . Se supone que es así:
En este caso, los corchetes no afectan a la operación (lógica). No hay ningún error
En este caso, los corchetes no tienen ningún efecto sobre la operación (lógica). No hay ningún error.
De acuerdo, gracias por entender mi confuso algoritmo. Todavía estoy confundido con los nombres de los colgantes...
Dejemos que sean los que paren, ¿quizás debamos intentar construir un EA?
Lo probaré más tarde y mostraré lo que sucede ?
... O dame un enlace a uno, no es que haya descubierto América ?
Hay que tener al menos conocimientos básicos para sugerir algo. Todas las ideas simples han sido probadas durante mucho tiempo y, de hecho, no han descubierto América. Pero es probable que nadie le busque un enlace en los foros y en kodobase. Si lo necesitas, lo buscas. ¿O crees que hay gente que guarda en su mente enlaces a todo tipo de Asesores Expertos, scripts e indicadores?
(Tengo una idea, necesito ayuda)) Escriba un Asesor Experto para esto
Lo estoy utilizando para el comercio desde hace mucho tiempo. Obtengo 1000 pips mensuales en un par de divisas. Nuncahe estado acostumbrado a este tipo de comercio. Prácticamente no hay drawdown, máximo 5 pips.
Marco temporal H4
1. MA4/simple\\Ncerrar
2. MA5/simple/abierto
El principio de funcionamiento debería ser el siguienteSin Take Profit y Stop Loss. Abrir y cerrar operaciones sólo en los cruces. Por ejemplo, cruzar de abajo hacia arriba, abrir una orden hacia arriba, cerrar la orden sólo cuando se cruza de nuevo. Si hay una señal inversa para cerrar la orden de compra abrir la orden de venta. En general, espero que entienda) en la estrategia no es ni siquiera el beneficio que importa, pero estos cruces de mierda) Algo así) El comercio en esta estrategia durante mucho tiempo, el beneficio es bueno, pero ya que creo que para escribir esta estrategia asesor experto no será difícil.
Si estás de acuerdo en ayudar aquí está mi CORREO: 4iterRrock@mail.ru
A continuación se muestra mi patrón que he estado operando durante casi un año.