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

 
Nerd Trader #:

Suppression du code inutile.

Je suis déjà totalement désespéré, j'ai même ajouté une variable d'impression lorsqu'elle est envoyée à OnTick... et si cela a aidé :) c'est toujours false dans 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){
        ...
        ...
      }
    }
  }
    if(!is_be){
    Print("is_be return ",is_be);
    return false;
  }
  else{
    Print("is_be return ",is_be);
    return true;
  }
}

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

Qu'est-ce que cela signifie ?

Je cherche juste quelqu'un pour partager l'expérience de l'intégration d'un indicateur dans un conseiller expert.

Pour pouvoir calculer ces données sur différentes TFs.

const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],

Je me demande si quelqu'un a une implémentation par le biais d'une classe.

J'essaie de comprendre la logique des classes, ce serait une aide précieuse pour l'apprentissage.

 
законопослушный гражданин #:

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 :

Dans bCheckOrders(), non seulement les ordres ouverts mais aussi les ordres en attente (MODE_TRADES) sont énumérés.
 
Nerd Trader #:

Hum... dans iOTi dans vOrderModify() toujours = 1, ce n'est pas un ticket, mais un résultat positif de l'opération OrderSend() c'est à dire la valeur "1".


Merci. Le code original n'est pas le mien, donc je ne change rien inutilement. Ça marche et ça marche.

Cela aidera-t-il à résoudre mon problème ?

 
законопослушный гражданин #:

Bonjour, Pouvez-vous m'aider à résoudre un problème. sur une bougie 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 :

Afficher OnTick()
 
Mikhail Toptunov #:
Je cherche simplement quelqu'un qui puisse partager son expérience de l'intégration d'indicateurs dans Expert Advisor.

Pour pouvoir calculer ces données sur différentes TFs.

Je me demande si quelqu'un a une implémentation par le biais d'une classe.

J'essaie de comprendre la logique des classes, ce serait une aide précieuse pour l'apprentissage.

rates_total = Bars
time[]      = Time[]
open[]      = Open[]
high[]      = High[]
low[]       = Low[]
close[]     = Close[]
 
MakarFX #:
Afficher OnTick()
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

  if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
 
законопослушный гражданин #:

Merci. Le code original n'est pas le mien, donc je ne change rien inutilement. Ça marche et ça marche.

Cela résout-il mon problème de quelque manière que ce soit ?

Nan, j'avais tort, OrderSend() renvoie un ticket ou -1, donc il n'y a pas de problème avec ça.
 
законопослушный гражданин #:

Essayez ceci, supprimez bCheckOrders() de OnTick() et mettez-le en surbrillance.

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

  if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
   // Тикет ордера
      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()
  {
// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
   // Тикет ордера  
      int iOTi = 0;   
   
      iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
      vError(GetLastError());
     }
  }
 
Nerd Trader #:
Nan, j'avais tort, OrderSend() renvoie un ticket ou -1, donc il n'y a pas de problème avec ça.

Ok.

Je garderai cela à l'esprit pour l'avenir.