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

 

Les gars, aidez-moi à réparer l'EA. Au lieu de vérifier les ordres, il achètera sans s'arrêter, au premier signal, jusqu'à ce qu'il dépense la totalité du dépôt. Merci d'avance à tous

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
extern double Lots            = 1;
extern int    TakeProfit      = 300;
extern int    StopLoss        = 50;
extern int    Magic           = 111;
extern int    Slippage        = 3;
//+------------------------------------------------------------------+
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56;
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
//+------------------------------------------------------------------+
double PriceHigh,PriceLow,SL,TP,OrderMagicNumber;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *= 10;
      StopLoss   *= 10;
      Slippage   *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   PriceHigh= iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
   PriceLow = iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

   if(CountSell()==0 && Bid>=PriceHigh)
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"ТМА",Magic,0,Red);
      if(ticket>0)
        {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
        }
      else Print("Ошибка открытия ордера на продажу");
     }
   if(CountBuy()==0 && Ask<=PriceLow)
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"ТМА",Magic,0,Blue);
      if(ticket>0)
        {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на покупку");
        }
      else Print("Ошибка открытия ордера на покупку");
     }
   if(Ask<=PriceLow && CountSell()>0)
     {
      for(int i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black))
                  Print("Ошибка закрытия ордера на продажу");
           }
        }
     }
   if(Bid>=PriceHigh && CountBuy()>0)
     {
      for(i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black))
                  Print("Ошибка закрытия ордера на покупку");
           }
        }
     }
  }
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+------------------------------------------------------------------+
 
Zelimhannahal00:

Les gars, aidez-moi à réparer l'EA. Au lieu de vérifier les ordres, il achètera sans s'arrêter, au premier signal, jusqu'à ce qu'il dépense la totalité du dépôt. Merci d'avance à tous.

Le code peut être formaté normalement directement dans l'éditeur de code à l'aide du stylet de code : Ctrl + <

Je l'ai formaté pour vous - maintenant c'est normalement lisible.

 
Zelimhannahal00:

Les gars, aidez-moi à réparer l'EA. Au lieu de vérifier les ordres, il achètera sans s'arrêter, au premier signal, jusqu'à ce qu'il dépense la totalité du dépôt. Merci d'avance à tous.

Vous l'avez identifié correctement, l'erreur se situe dans la fonction de contrôle des positions.

//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }

   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+----------------------

J'ai surligné en rouge, corrigé.

Je l'ai corrigé.

 
Alekseu Fedotov:

Vous avez correctement identifié l'erreur dans les fonctions de contrôle de position.

surligné en rouge, corrigé.

C'est à peu près tout.

Je l'ai corrigé, c'est toujours le même. Le problème est toujours là.
 
Zelimhannahal00:
Je l'ai corrigé, c'est toujours le même. Le problème est toujours là.
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
return(count);


Avez-vous copié tout le code là-dedans ?

 
Vladislav Andruschenko:


Tu as copié tout le code là-dedans ?

Je n'ai pas copié tout le code par erreur. C'est bon là return(count) ;

}

C'est ainsi que le code se termine, comme il se doit. Il n'y a aucune erreur ni aucun avertissement lors de la compilation du code. J'ai dû faire une erreur dans les fonctions, je n'arrive pas à savoir où. Je l'ai réparé comme on me l'a dit ci-dessus. Je n'ai pas non plus d'erreurs, mais le conseiller lui-même fonctionne de la même manière (le premier signal, il achète pour l'ensemble du dépôt, des lots donnés, comme 1 lot fixé et il achète 1 lot de transactions 200 ou plus, tant que le dépôt est suffisant. Mais le signal est correct, achète aussi correctement, seulement beaucoup)

 
Zelimhannahal00:

Je n'ai pas copié tout le code par erreur. C'est bien return(count) ;

}

C'est ainsi que le code se termine, comme il se doit. Il n'y a aucune erreur ni aucun avertissement lors de la compilation. J'ai dû faire une erreur dans les fonctions, je n'arrive pas à savoir où. Je l'ai réparé comme on me l'a dit ci-dessus. Je n'ai pas non plus d'erreurs, mais le conseiller lui-même fonctionne de la même manière (le premier signal, il achète pour l'ensemble du dépôt, des lots donnés, comme 1 lot fixé et il achète 1 lot de transactions 200 ou plus, tant que le dépôt est suffisant. Mais le signal est correct, achète aussi correctement, mais beaucoup)

Je l'ai vérifié et corrigé.

Dossiers :
ProjectName.mq4  11 kb
 
Comment trouver le nombre de bougies entre deux dates ?
 
Alexander Fedosov:
Comment trouver le nombre de bougies entre deux dates ?

si le TF est synchronisé, toute fonction CopyXXXX() :

Référence aux dates de début et de fin de l'intervalle de temps requis

intCopyTime(
stringsymbol_name,// nom du symbole
ENUM_TIMEFRAMEStimeframe,// période
datetimestart_time,// à partir de quelle date
datetimestop_time,// jusqu'à quelle date
datetimetime_array[]//tableau pour copier le temps d'ouverture
) ;

Valeur retournée

Nombre d'éléments du tableau copiés ou -1 en cas d'erreur.


vous pouvez utiliser iBarShift() pour trouver 2 barres par temps


 
Igor Makanu:

si le TF est synchronisé, toute fonction CopyXXXX() :

Référence aux dates de début et de fin de l'intervalle de temps requis

intCopyTime(
stringsymbol_name,// nom du symbole
ENUM_TIMEFRAMEStimeframe,// période
datetimestart_time,//depuis quelle date
datetimestop_time,// jusqu'à quelle date
datetimetime_array[]//tableau pour copier le temps d'ouverture
) ;

Valeur retournée

Nombre d'éléments du tableau copiés ou -1 en cas d'erreur.


C'est bizarre... Je ne me souviens pas qu'il y ait eu ces fonctionnalités dans mt4 avant. Ont-ils aussi été ajoutés aux cinq ?