Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1671

 
MakarFX #:

wenn foo2 true zurückgibt, suchen Sie hier nach einem Fehler

Ich habe x zwischen Bedingung und retorn, und ich kann sehen, wenn es wahr ist, aber onTick es ist immer falsch.
 
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
    ...
}

Unnötiger Code wurde entfernt.

 
Nerd Trader #:

Unnötiger Code wurde entfernt.

  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

Immer falsch

 
Nerd Trader #:

Unnötiger Code wurde entfernt.

Nach unten bewegen

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 #:

Nach unten gehen

Ich weiß nicht, was das damit zu tun hat, aber von über hundert Mal true in BEActivate(), onTick() true kam nur drei Mal vor :)))
 
Nerd Trader #:
Ich weiß nicht, was das damit zu tun hat, aber von mehr als hundert true in BEActivate(), onTick() true erschien nur drei Mal :)))

Und wieder eine Frage...

Willst du die Klassen nicht abschaffen?

 
MakarFX #:

Und wieder eine Frage...

Willst du die Klassen nicht abschaffen?

Ich bin kurz davor, meinen eigenen Kuckuck loszuwerden mit diesem Blödsinn
 
MakarFX #:

Dies kann auch ohne OnCalculate geschehen

Die Funktion OnCalculate() wird nur in benutzerdefinierten Indikatoren aufgerufen

Ich brauche die Daten, die OnCalculate() anzeigt.

Vielleicht hat jemand eine Implementierung über Klassen!
 
Mikhail Toptunov #:

Ich brauche die Daten, die OnCalculate() anzeigt .

Vielleicht hat jemand eine Implementierung über Klassen!

Was bedeutet das?

 

М15

Guten Tag, können Sie mir helfen, ein Problem zu lösen: Bei einer M15-Kerze werden mehrere Trades hintereinander eröffnet.

Ich möchte nicht mehr als einen Handel eröffnen. Die Logik hinter dem EA besteht darin, dass die nächste Order erst dann eröffnet wird, wenn die vorherige Order geschlossen ist, aber manchmal wird eine Reihe von Geschäften bei einer solchen langen Kerze eröffnet. Was muss in den Code eingefügt werden, um diese Situation zu verhindern?

Codeschnipsel :

//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
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);
           }
        }
     }
  }
Grund der Beschwerde: