Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1671

 
MakarFX #:

si foo2 retourne vrai, cherchez une erreur ici

J'ai x entre condition et retorn, et je peux voir quand c'est vrai, mais onTick c'est toujours faux.
 
bool BESet(double sl = 0, color arrow_color = 0, string order_type = ""){
  bool order = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, arrow_color );
          if(!order) {
            ResetLastError();
            Print("!Ошибка ",order_type,". Причина: ", GetLastError());
            return false;
          }
          else {
            return true;
          }
}

bool BEActivate(){
  double unrealized_profit = 0;
  color arrow_color = 0;
  string order_type = "";
  double sl = 0;
  bool is_be = false; // если объявить true, то в OnTick всегда будет возвращаться true

  if(OrdersTotal() >= 1){
    for(int i = OrdersTotal() -1; i >= 0; i--){
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue;
      if(OrderType() == OP_BUY){
        if(OrderStopLoss() > OrderOpenPrice()) continue;
        unrealized_profit = NormalizeDouble(MathAbs(OrderOpenPrice() - Ask)/Point, 0);
        if(unrealized_profit >= save_zone && Ask > OrderOpenPrice()){
          is_be = BESet(NormalizeDouble(OrderOpenPrice()+breakeven*Point,Digits), clrGreenYellow, "Бай");
          Print("BE ",is_be);
        }
      }
      if(OrderType() == OP_SELL){
        ...
        ...
      }
    }
  }
  return is_be;
}

void OnTick()
{
  last_time = iTime(NULL, 0, 0);
  bool is_be = BEActivate();

  if(last_time > bar.time_open){
    bar.Initialize();
    Pr int("is_be ",is_be); //Всегда FALSE
    ...
}

Suppression du code inutile.

 
Nerd Trader #:

Suppression du code inutile.

  last_time = iTime(NULL, 0, 0);
  bool is_be = BEActivate();

  if(last_time > bar.time_open){
    bar.Initialize();
    Pr int("is_be ",is_be); //Всегда FALSE

Toujours faux

 
Nerd Trader #:

Suppression du code inutile.

Déplacez-le vers le bas

void OnTick()
{
  bool is_be = BEActivate();

  if(last_time > bar.time_open){
    bar.Initialize();
    Print("is_be ",is_be); //Всегда FALSE
    ...
  last_time = iTime(NULL, 0, 0);
}
 
MakarFX #:

Descendre

Je ne sais pas ce que cela a à voir, mais sur plus d'une centaine de fois où true dans BEActivate(), onTick() true n'est apparu que trois fois :))))
 
Nerd Trader #:
Je ne sais pas ce que cela a à voir, mais sur plus d'une centaine de true dans BEActivate(), le true onTick() n'est apparu que trois fois :)))

Et encore une question...

Vous ne voulez pas vous débarrasser des classes ?

 
MakarFX #:

Et encore une question...

Vous ne voulez pas vous débarrasser des classes ?

Je suis sur le point de me débarrasser de mon propre coucou avec ces manigances.
 
MakarFX #:

Cela peut être fait sans OnCalculate.

Lafonction OnCalculate() est uniquement appelée dans les indicateurs personnalisés
.

J'ai besoin des données que OnCalculate() montre.

Peut-être que quelqu'un a une implémentation via des classes !
 
Mikhail Toptunov #:

J'ai besoin des données que OnCalculate() montre .

Peut-être que quelqu'un a une implémentation via des classes !

qu'est-ce que cela signifie ?

 

М15

Bonjour, Pouvez-vous m'aider à résoudre un problème. sur un chandelier M15, plusieurs trades s'ouvrent à la suite.

Je ne veux pas que plus d'une transaction s'ouvre. La logique de l'EA est que tant que l'ordre précédent n'est pas fermé, le suivant ne s'ouvre pas, mais il arrive qu'une série de transactions s'ouvre sur un chandelier aussi long. Veuillez me conseiller sur ce qu'il faut ajouter dans le code pour éviter cette situation.

extrait de code :

//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
bool bCheckOrders()
  {
// Переберем в цикле ордера, для проверки открытых ордеров данным советником

   for(int i = 0; i <= OrdersTotal(); i++)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(false);

   return(true);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }