Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 46

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

Más exacto sería:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Devuelve el número de ticket asignado a la orden por el servidor comercial o -1 en caso de fallo ."

Aunque incluso en el probador el primer número de ticket es el 1, no el 0.

 
Oksana Berenko:

Más exactamente, lo será:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Devuelve el número de ticket asignado a la orden por el servidor comercial o -1 en caso de fallo ."

Aunque incluso en el probador el primer número de billete es el 1, no el 0.

Me alegro de ver a la desaparecida Oksana ))

Sí, los tickets comienzan con 1 en el probador y en el servidor de DC, pero nunca cogerá 1 en DC. Tu versión no funciona del todo, no es correcto comparar la desigualdad con -1. ¿Y si la cuenta real devuelve 1234567?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

Así que en el probador un billete no puede ser inferior a uno, más aún en el mundo real

cero es menor que uno, ambas condiciones son correctas, sólo una para la comparación, la otra para la exclusión.

Aunque me acostumbré a hacerlo:

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

Pero considerando la mía, las condiciones son todas correctas, sólo la lógica es diferente)

 
Buenas noches, ¿puedo desearle un feliz año nuevo? ¿Podría decirme qué es lo que falla en este trozo de código?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
Le deseo un feliz año nuevo. ¿Podría decirme, por favor, qué es lo que falla en este código?

Aconsejo cambiar la lógica en la raíz

Es decir, es necesario llevar un registro de los pedidos abiertos: cuántos se venden y cuántos se abren

Y en base a estas consideraciones debemos gestionar las órdenes: abrirlas y cerrarlas

 

No sé por qué el EA abre muchas órdenes si la condición no debería ser la de abrir una posición pero después de abrirla se vuelve a abrir.

no puedo entender por qué mi EA abre un montón de órdenes si no quiero que abra una posición, pero se abre de nuevo después de abrirla, sospecho que algo está mal con el bucle, no entiendo muy bien los ciclos

for(int i=Total de Pedidos()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // si nuestro Magic

{

if(OrderType()==OP_BUY) sdel_b++; // cuenta bai

if(OrderType()==OP_SELL) sdel_s++; // Contar sels

if(OrderType()==OP_BUYSTOP) otl_b++; // Contar las paradas pendientes

if(OrderType()==OP_SELLSTOP) otl_s++; // Contar los sellstops pendientes

}


// Ahora los pedidos abiertos

if(Hora()==00 && Minuto()==01 && otl_b==0 && otl_s ==0); // Si es la hora y no hay órdenes pendientes

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // poner una orden pendiente

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

No sé por qué el EA abre muchas órdenes si la condición no debería ser la de abrir una posición pero después de abrirla se vuelve a abrir.

No entiendo por qué mi EA abre muchas órdenes, si no quiero que abra una posición pero vuelve a abrir después de abrir. Creo que puede estar mal el bucle, no entiendo muy bien los bucles

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

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // si nuestro Magic

{

if(OrderType()==OP_BUY) sdel_b++; // cuenta bai

if(OrderType()==OP_SELL) sdel_s++; // Contar sels

if(OrderType()==OP_BUYSTOP) otl_b++; // Contar las paradas pendientes

if(OrderType()==OP_SELLSTOP) otl_s++; // Contar los sellstops pendientes

}


// Ahora los pedidos abiertos

if(Hora()==00 && Minuto()==01 && otl_b==0 && otl_s ==0); // Si es la hora y no hay órdenes pendientes

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //tomar una posición

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

Prueba esto

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

Prueba esto

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
sigue abriendo un montón de pedidos
148El número de órdenes abiertas y pendientes ha alcanzado el límite establecido por el broker.
 
wishmast:
Sigue abriendo muchos pedidos
148El número de órdenes abiertas y pendientes ha alcanzado el límite establecido por el broker.
Por favor, envíenos el código completo, es difícil entender dónde está cometiendo un error
 

Saludos. ¡Feliz Año Nuevo a todos!

Cuando intento optimizar un EA después de que se haya ejecutado, los resultados y el gráfico de optimización están en blanco y el registro se escribe en la bitácora:

Se hanrealizado 2pasesdurante la optimización, 2 resultados han sido descartados por ser insignificantes

Desmarcar"algoritmo genético" no ayuda. Entiendo que los resultados parezcan insignificantes para el probador, pero ¿cómo podemos ver lo que hay? Y esto es a pesar de que el Asesor Experto no pierde dinero para el mismo período (un año) durante las pruebas, pero es +/- 20%.

Razón de la queja: