Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1100

 

Estimados programadores, pueden ayudarme a establecer una prohibición de abrir más de una serie de operaciones a la vez (serie es si la orden se cierra en la pérdida o cero y luego se abre la siguiente operación en el mismo instrumento, pero con un lote más grande), es decir, si se abre una serie de operaciones la segunda y siguientes se ponen en otros instrumentos bajo una prohibición (el bot trabaja simultáneamente en diferentes instrumentos). Creo que debería hacerse a través de una variable global en el terminal, pero no tengo suficiente conocimiento y experiencia, acabo de empezar a aprenderMQL. Este es un asesor de opciones binarias. Este es el código

extern double Lotes = 1; // Lotes

extern int Exp = 1; // Caducidad

extern int Wait = 1; // Número de velas de una dirección

extern int Timeout = 1; // Espacio de tiempo

extern double Multiplier = 3; // Multiplicador

extern int Deslizamiento = 5; // Deslizamiento

extern int Magia = 2090; // Magia


int ticket, Tipo;

Precio doble, lote;

//+------------------------------------------------------------------+

//| 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()

{

// --------------- Operaciones abiertas ---------------

if (OrdersTotal() == 0) // El número de pedidos debe ser igual a cero

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// Si la última operación es perdedora, se abre la misma, pero con un lote mayor

{

Tipo = TypeLastHistOrder();

if (Type == OP_BUY) Precio = Ask;

if (Type == OP_SELL) Precio = Oferta;

Lote = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// si el beneficio de la última operación es igual a cero, se abrirá la misma operación

{

Tipo = TypeLastHistOrder();

if (Type == OP_BUY) Precio = Ask;

if (Type == OP_SELL) Precio = Oferta;

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))

|| CountHistTrades() == 0)// Si la última operación es rentable, se abre la orden

{

if (SignalBuy() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

Comentario ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",

PrecioCierreÚltimaHistoriaOrden(OP_SELL) );

}

}

}

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1) // Determina el número de operaciones

{

int cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--) // El bucle recorre absolutamente todos los pedidos abiertos, i es el número de pedido

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // La función comprueba si la orden con el número de orden i está en el mercado,

// si lo hay, se comprueban las siguientes condiciones...

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Si el símbolo

// el símbolo en el que se abre la orden es igual al símbolo actual, el tipo de orden es igual a magic en la configuración del EA actual, y

// el tipo de orden es igual al tipo (o tipo == -1 (en caso de que no importe el tipo requerido para el recuento de órdenes))

cnt++; // Se añade 1 a la variable cnt y al final del bucle cnt será igual al número de operaciones

// abierto por el EA actual para el par de divisas actual con un tipo determinado

}

}

return(cnt); // se devuelve el valor de la variable cnt

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

return(cnt);

}

//+------------------------------------------------------------------+

bool SeñalCompra()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] > Open[i]) return(false)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

si (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

bool SeñalVenta()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] < Open[i]) return(false)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

si (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

si (OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

return(opentime);

}

//+------------------------------------------------------------------+

int TipoÚltimoHistOrden()

{

datetime tiempo = 0;

int tipo = -1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

si (OrderCloseTime() > tiempo)

{

hora = OrderCloseTime();

tipo = OrderType();

}

}

}

}

devolver(tipo);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

datetime tiempo = 0;

lotes dobles = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

si (OrderOpenTime() > tiempo)

{

tiempo = OrderOpenTime();

tiempo = OrderLots();

}

}

}

}

return(lots);

}

//+------------------------------------------------------------------+

double PrecioCierreÚltimaHistoria(int tipo = -1)

{

datetime tiempo = 0;

precio doble = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

si (OrderCloseTime() > tiempo)

{

hora = OrderCloseTime();

precio = OrderClosePrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

datetime tiempo = 0;

precio doble = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

si (OrderCloseTime() > tiempo)

{

hora = OrderCloseTime();

precio = OrderOpenPrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

 
Hola, compañeros!

Tengouna pregunta al programar: ¿Hay alguna forma de conseguir que la hora del servidor sea precisa en milisegundos en el EA?
Por ejemplo, consiga: 23.09.2016 14h. : 53min. ¿54000 milisegundos? Eso es exactamente 54 segundos, 000 milisegundos.
 
e-partner:
¡Hola colegas!

Tengouna pregunta al programar: ¿Es posible obtener de alguna manera en el Asesor Experto la hora del servidor con una precisión de hasta milisegundos?
Por ejemplo, consiga: 23.09.2016 14h. : 53 min. ¿54000 milisegundos? Eso es exactamente 54 segundos, 000 milisegundos.

Una pregunta interesante. ¿A qué te refieres con especificar la última hora conocida del servidor, la hora de la última cita TimeCurrent() o la hora actual del servidor?

Si se trata de TimeCurrent(), de qué servirá, si consideramos que un paquete con una nueva cotización recorre la Internet desde el servidor hasta el terminal durante 10-500 ms y este tiempo varía de paquete en paquete. Además, no está claro, cuál es la llegada de la última cotización, si llega al servidor desde varias fuentes, proveedores de liquidez, y luego se procesa, y entonces el servidor envía un nuevo tick. Tampoco se sabe cómo se sincroniza el temporizador del sistema del servidor con la hora astronómica. El 09.01.2014 desde las 04:15 hasta las 06:15 MSK (jueves, día de negociación) lo estaba comprobando, ya que la desviación no es de astronómica, sino de la media de 31 empresas. La figura correspondiente a 25 puntos temporales muestra estas desviaciones (en segundos, no en ms):

¿Y qué sentido tiene averiguar algo en milisegundos a partir de los datos del servidor?

La segunda opción es más clara. Si su ordenador está sincronizado con la hora astronómica con una precisión que usted conoce, la hora astronómica de la ciudad donde funciona el servidor se conoce con la misma precisión. Pero para qué lo necesitas...

 

No consigo averiguar a dónde ha ido a parar la optimización del probador de estrategias. Los cheques están todos parados no puedo entender nada. MT4 build 1010. Windows 8.1.

Por favor, indíqueme cómo activar la optimización.

Adjuntaré capturas de pantalla. No puedo ver el botón de optimización.

Archivos adjuntos:
desktop.zip  129 kb
 
¿Por qué mi MT4 b1010 no permite la depuración de datos históricos (el botón y la opción de menú no están activos)? En MT5 todo está bien.
 
Porque los desarrolladores lo han prohibido.
 
int Magik;
int Deslizamiento = 5,stopL1 = 50,takeP1 = 20;
int tendencia,TicketS,TicketB;
doble rsi,TP,SL;
//+------------------------------------------------------------------+
//| Función de inicialización de expertos |
//+------------------------------------------------------------------+
int OnInit()
{
if(Dígitos == 3 || Dígitos = 5)
{
Deslizamiento *= 10;
stopL1 *= 10;
{ takeP1 *= 10;
}

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| función de tic experto |
//+------------------------------------------------------------------+
void OnTick()
{
double priseBuy = FindLastOrderPrise (OP_BUY);
double priseSel = FindLastOrderPrise (OP_SELL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
tendencia = WhatTrend();
si (CountTrades() == 0)
{
if(trend == 1 && rsi <=30)
{
if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0, "first buy order set",Magik,0)== true)
{
TicketB = FindLastTicket(OP_BUY);
if(TicketB >0)
{
SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits);
TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits);
if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
Comentario ("hooraaaahhhh");
}

}
}// si(tendencia == 1 && rsi <= 30)
else if(trend == 2 && rsi >= 70)
{
if(OrderSend(Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0, "first order set",Magik,0)== true)
{
for(int i = OrdersTotal()-1;i >0;i--)
{
OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
{
double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break;
Si no, continúe;
}
}
}
}
}// (CountTrades() == 0)

}

Pido a los programadores competentes que me expliquen cuál es mi error... ¡¡¡Por qué no se modifica el orden!!! y el compilador no da errores al hacerlo

 
He estudiado el tutorial.he leído y tomado notas...podríais señalar los errores específicamente...porque el compilador no da errores y no hay errores en el tester.pero la orden no se modifica.como si la orden no fuera visible en el programa en absoluto
 
burbur87:
He estudiado el tutorial.He leído y tomado notas.Podrías señalar los errores específicamente...porque el compilador no da ningún error y no hay errores en el tester.Pero el orden no se modifica.Es como si el orden no se viera en el programa en absoluto

Lea atentamente lo que devuelve OrderSend()

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

En realidad, yo haría lo siguiente:

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

Lea atentamente lo que devuelve OrderSend()

if(ticket>=0)

De hecho, yo lo haría así:

¿Puede un billete ser cero?
Razón de la queja: