Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1671

 
MakarFX #:

se foo2 retornar verdadeiro, procure por um erro aqui

Eu tenho x entre condição e retorno, e posso ver quando é verdade, mas é sempre falso no OnTick.
 
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
    ...
}

Removido o código desnecessário.

 
Nerd Trader #:

Removido o código desnecessário.

  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

Sempre falso

 
Nerd Trader #:

Removido o código desnecessário.

Desça-a

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

Desça

Não sei o que isso tem a ver, mas de mais de cem vezes verdadeiro no BEActivate(), onTick() verdadeiro só surgiu três vezes :))))
 
Nerd Trader #:
Não sei o que isso tem a ver, mas de mais de uma centena de verdade no BEActivate(), onTick() verdadeiro só apareceu três vezes :))))

E mais uma vez uma pergunta...

Você não quer se livrar das aulas?

 
MakarFX #:

E mais uma vez uma pergunta...

Você não quer se livrar das aulas?

Estou prestes a me livrar de meu próprio cuco com essas manobras.
 
MakarFX #:

Isto pode ser feito sem a OnCalculate

A função OnCalculate() é chamada apenas em indicadores personalizados

Eu preciso dos dados que a OnCalculate() mostra.

Talvez alguém tenha uma implementação através de aulas!
 
Mikhail Toptunov #:

Eu preciso dos dados que a OnCalculate() mostra .

Talvez alguém tenha uma implementação através de aulas!

o que isso significa?

 

М15

Boa tarde. Você pode me ajudar a resolver um problema. em um castiçal M15, vários ofícios abrem em uma fila.

Não quero mais do que uma profissão a ser aberta. A lógica por trás da EA é que até que a ordem anterior seja fechada, a próxima não será aberta, mas às vezes uma série de acordos é aberta em um castiçal tão longo. Por favor, informe o que acrescentar ao código para evitar esta situação.

código snippet :

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