[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 237

 

Bonjour.

Pouvez-vous me dire à quoi peut être liée la situation suivante (le testeur a d'abord donné un ticket d'erreur 15, mais il a ensuite fermé la commande) ? Devrais-je y prêter plus d'attention ?

Merci d'avance.

 
nemo811:

Devrais-je faire plus attention à elle ?


Bien sûr, il ne devrait y avoir aucune erreur.
 

Aidez-moi, s'il vous plaît.

Y a-t-il une erreur ici ? (Le code renvoie un ticket de la dernière commande SELL du marché)

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);
 }

Merci d'avance.

 
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);
 }
 

Bon après-midi.

Point intéressant : dans mql4 la variable à la fin du bloc { int var ; } n'est pas détruite, d'où la question de savoir s'il est correct de déclarer la variable dans une boucle ???

Exemple :

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

{

int var ; // qu'arrive-t-il à la variable pendant l'itération ?

}

Merci.

 
sergeev:

Nan - il ne semble pas être dans le mille pour le moment. La même erreur se répète.

Il reste une dernière partie du code, qui peut y être liée :

     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,".");
          }  
        }  
      }

Le plus intéressant est que l'erreur se produit lorsqu'on essaie de fermer un ordre qui était auparavant un ordre à cours limité, mais qui s'est ensuite déclenché et est devenu un ordre au marché. Si un ordre qui était à l'origine un ordre au marché est fermé, l'erreur ne se produit pas.

 

J'ai trouvé l'erreur, voici la sortie :

     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:

J'ai trouvé une erreur, voici la sortie :


Je peux te poser une question bête ? Une sorte de normalisation bizarre

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

Je n'arrive pas à comprendre pourquoi c'est fait de cette façon.

 
Vinin:


Puis-je vous poser une question stupide ? C'est une étrange normalisation

Je ne peux pas comprendre pourquoi cela est fait.

C'est le cas lorsqu'un lot de 0,03 est concerné et que le minimum autorisé est de 0,01. Lorsque vous divisez 0,03 par 2, vous obtenez 0,015, ce qui, d'après ce que je comprends, est inacceptable. C'est pourquoi j'ai procédé à une telle normalisation.

Ne jugez pas sévèrement - je ne fais qu'apprendre ;)). Mais si c'est une erreur, corrigez-moi, s'il vous plaît.

 
artmedia70:
Commencez à le faire et nous vous aiderons. Ça ressemble à "fais-le pour moi". Il y a à peu près tout ce dont vous avez besoin là-dedans. Il ne vous reste plus qu'à définir des points de prise et d'arrêt pour vos ordres dans la boucle.

c'est ainsi que les commandes sont ouvertes :

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

Je veux que le script calcule un script sans perte comme ceci :

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();
}

comment insérer correctement ce code de définition de ligne sans perte dans l'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);
   }
}