[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 237

 

Hola.

¿Pueden decirme con qué puede estar relacionada la siguiente situación (el probador dio primero el ticket de error 15, pero luego siguió cerrando este pedido)? ¿Debo prestarle más atención?

Gracias de antemano.

 
nemo811:

¿Debería prestarle más atención?


Por supuesto, no debería haber errores.
 

Por favor, ayúdame.

¿Hay algún error aquí? (El código devuelve un ticket de la última orden de venta del mercado)

int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=0;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }

Gracias de antemano.

 
int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=-1;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell && OrdTicketSell>=0) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }
 

Buenas tardes.

Punto interesante: en mql4 la variable al final del bloque { int var; } no se destruye, de ahí la pregunta de si es correcto declarar la variable en un bucle?

Ejemplo:

for(int i = 0; i < 500; i ++)

{

int var; // ¿qué pasa con la variable durante la iteración?

}

Gracias.

 
sergeev:

No, no parece estar en la diana todavía. El mismo error se está arrastrando.

Queda una última parte del código, que puede estar relacionada con él:

     int SchSell=SchSell_b(MAGIC);
     int OrdTicketSell=OrdTicketSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }

Lo más interesante es que el error se produce al intentar cerrar una orden que antes era una orden limitada, pero que posteriormente se activó y se convirtió en una orden de mercado. Si se cierra una orden que originalmente era de mercado, el error no se produce.

 

Encontrado el error, aquí está la salida:

     int SchSell=SchSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       int OrdTicketSell=OrdTicketSell_b(MAGIC);
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }
 
nemo811:

Encontré un error, aquí está la salida:


¿Puedo hacerte una pregunta tonta? Una especie de extraña normalización

OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);

No puedo entender por qué se hace así.

 
Vinin:


¿Puedo hacerte una pregunta tonta? Es una extraña normalización

No puedo entender por qué se hace esto.

Esto es en el caso de que se trate de un lote de 0,03 y el mínimo permitido es de 0,01. Al dividir 0,03 entre 2, se obtiene 0,015, lo que, según tengo entendido, es inaceptable. Por lo tanto, he realizado dicha normalización.

No juzgues con dureza, sólo estoy aprendiendo )). Pero si es un error, corrígeme, por favor.

 
artmedia70:
Empieza a hacerlo y te ayudaremos. Esto parece un "hazlo por mí". Hay casi todo lo que necesitas ahí. Lo único que queda por hacer es establecer puntos de toma y de parada para sus órdenes en el bucle.

así es como se abren los pedidos:

                ticketSell = OpenPendingOrderSell(1, Lots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + NumOfTradesSell, MagicNumber, 0, HotPink);
                if (ticketSell < 0)
                {
                        Print("Error: ", GetLastError());
                        return (0);
                }

Quiero que el script calcule la ausencia de pérdidas así:

si

if (totalBuy > 1)
{ то ордерам ticketBuy присвоить цену без убытка + TakeProfitBuy, при достижении этой цены или ниже, закрыть ордера}

я думаю, что можно что то в роде такого сделать:

if (totalBuy > 1 && (без убыток + TakeProfitBuy) >= Bid)
{
CloseAllBuy();
}

si

if (totalSell > 1 && (без убыток + TakeProfitSell) <= Ask)
{
CloseAllSell();
}

si

if (totalSell > 1 && totalBuy > 1 && (без убыток + TakeProfitSell) >= Ask)
{
CloseAllBuy();
CloseAllSell();
}

cómo insertar correctamente este código de definición de línea sin pérdida en el EA:

int start()
{
   int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
            if (OrderType()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete("SLb");
   if (b!=0) 
   {  SLb = price_b/lot_b;
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Navy);
   }
   ObjectDelete("SLs");
   if (s!=0) 
   {  SLs = price_s/lot_s;
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Maroon);
   }
}