Questions des débutants MQL4 MT4 MetaTrader 4 - page 46

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

Plus précis serait :

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

OrderSend - "Renvoie le numéro de ticket attribué à l'ordre par le serveur commercial ou -1 en cas d'échec ."

Bien que même dans le testeur, le premier numéro de ticket est 1, et non 0.

 
Oksana Berenko:

Plus exactement, elle le sera :

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

OrderSend - "Renvoie le numéro de ticket attribué à l'ordre par le serveur commercial ou -1 en cas d'échec ."

Bien que même dans le testeur, le premier numéro de ticket est 1, et non 0.

Je suis si heureux de voir la disparition d'Oksana !)

Oui, les tickets commencent par 1 dans le testeur et sur le serveur DC, mais vous n'aurez jamais 1 dans DC. Votre version ne fonctionne pas tout à fait, il n'est pas correct de comparer l'inégalité avec -1. Et si le compte réel renvoie 1234567 ?

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


// так верно
 

Ainsi, dans le testeur, un ticket ne peut être inférieur à un, et encore plus dans le monde réel.

zéro est inférieur à un, les deux conditions sont correctes, une seule pour la comparaison, l'autre pour l'exclusion.

Bien que je me sois habitué à le faire :

// Открываем ордер
      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");

Mais en considérant le mien, les conditions sont toutes correctes, seule la logique est différente).

 
Bonsoir, puis-je vous souhaiter une bonne année ? Pourriez-vous me dire ce qui ne va pas avec ce bout de code ?
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:
Je vous souhaite une bonne année ! Pourriez-vous me dire ce qui ne va pas avec ce bout de code ?

Je conseille de changer la logique à la racine

Il est nécessaire de tenir un registre des ordres ouverts - combien de ventes et combien de bakchichs sont ouverts.

Et ensuite, sur la base de ces considérations, nous devons gérer les ordres - les ouvrir et les fermer.

 

Je ne sais pas pourquoi l'EA ouvre beaucoup d'ordres si la condition ne devrait pas être d'ouvrir une position, mais après l'ouverture, il ouvre à nouveau.

Je ne comprends pas pourquoi mon EA ouvre de nombreux ordres, si je ne veux pas qu'il ouvre une position, mais il ouvre à nouveau après l'ouverture. Je pense que je me trompe peut-être avec la boucle, je ne comprends pas vraiment les boucles.

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

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // si notre Magie

{

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

if(OrderType()==OP_SELL) sdel_s++ ; // Compter les sels

if(OrderType()==OP_BUYSTOP) otl_b++ ; // Compter les bystops en attente.

if(OrderType()==OP_SELLSTOP) otl_s++ ; // Comptez les sellstops en attente.

}


// commandes en cours

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0) ; // Si c'est l'heure et qu'il n'y a pas d'ordres en attente

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE) ; //prendre une position

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

}

 
wishmast:

Je ne sais pas pourquoi l'EA ouvre beaucoup d'ordres si la condition ne devrait pas être d'ouvrir une position, mais après l'ouverture, il ouvre à nouveau.

Je ne comprends pas pourquoi mon EA ouvre de nombreux ordres, si je ne veux pas qu'il ouvre une position, mais il ouvre à nouveau après l'ouverture. Je pense que je me trompe peut-être avec la boucle, je ne comprends pas vraiment les boucles.

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

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // si notre Magie

{

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

if(OrderType()==OP_SELL) sdel_s++ ; // Compter les sels

if(OrderType()==OP_BUYSTOP) otl_b++ ; // Compter les bystops en attente.

if(OrderType()==OP_SELLSTOP) otl_s++ ; // Comptez les sellstops en attente.

}


// commandes en cours

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0) ; // Si c'est l'heure et qu'il n'y a pas d'ordres en attente

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE) ; //prendre une position

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

}

Essayez ceci

   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:

Essayez ceci

   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++; // Считаем отложенные селлстопы
           }
        }
     }

....
ouvre toujours beaucoup de commandes
148Le nombre d'ordres ouverts et en attente a atteint la limite fixée par le courtier.
 
wishmast:
Ouvre toujours beaucoup de commandes
148Le nombre d'ordres ouverts et en attente a atteint la limite fixée par le courtier.
Veuillez nous envoyer le code complet, il est difficile de comprendre où vous faites une erreur.
 

Salutations. Bonne année à tous !

Lorsque j'essaie d'optimiser un EA après son exécution, les résultats et le graphique d'optimisation sont vides et le journal est écrit dans le journal :

Il y a eu 2passagespendant l'optimisation, 2 résultats ont été écartés car non significatifs.

décocher"algorithme génétique" ne sert à rien. Je comprends que les résultats semblent insignifiants pour le testeur, mais comment pouvons-nous voir ce qui est là ? Et ce, malgré le fait que le conseiller expert ne perd pas d'argent pour la même période (un an) pendant les tests, mais qu'il en perd +/- 20%.

Raison: