新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1672

 
Nerd Trader #:

删除了不必要的代码。

我已经完全绝望了,甚至在发送到OnTick的时候还加了一个打印变量......如果有帮助的话:)在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 #:

它是什么意思?

我只是想找人分享将指标整合到专家顾问中的经验

为了能够在不同的TFs上计算出这个数据。

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

我想知道是否有人通过一个类来实现。

我正在努力理解类的逻辑,这对学习会有很大的帮助。

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

下午好,你能帮我解决一个问题吗?在M15蜡烛上,有几笔交易连续打开。

我希望打开的交易不超过一个。EA背后的逻辑是,在前一个订单关闭之前,下一个订单不会打开,但有时一系列的交易会在这样一个长蜡烛图上打开。请建议在代码中添加什么来防止这种情况?

代码片段:

在bCheckOrders()中,不仅未平仓订单,而且待定订单(MODE_TRADES)也被列举出来。
 
Nerd Trader #:

嗯...在iOTi中,vOrderModify()总是=1,它不是一个票据,而是OrderSend()操作的一个积极结果,即值 "1"。


谢谢,原来的代码不是我的,所以我不做任何不必要的改动。它的作用和效果。

这是否有助于解决我的问题?

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

下午好,你能帮我解决一个问题吗?在M15蜡烛图上,有几个交易连续开盘。

我希望打开的交易不超过一个。EA背后的逻辑是,在前一个订单关闭之前,下一个订单不会打开,但有时一系列的交易会在这样一个长蜡烛图上打开。请建议在代码中添加什么来防止这种情况?

代码片段:

显示OnTick()
 
Mikhail Toptunov #:
我只是想找一个能够分享在专家顾问中实现指标整合经验的人

为了能够在不同的TFs上计算出这个数据。

我想知道是否有人通过一个类来实现。

我正在努力理解类的逻辑,这对学习会有很大的帮助。

rates_total = Bars
time[]      = Time[]
open[]      = Open[]
high[]      = High[]
low[]       = Low[]
close[]     = Close[]
 
MakarFX #:
显示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));
  }
 
законопослушный гражданин #:

谢谢你,原始代码不是我的,所以我没有做任何不必要的改动。它的作用和效果。

这是否以任何方式解决了我的问题?

不,我错了,OrderSend()返回一个票据或-1,所以这没有什么问题。
 
законопослушный гражданин #:

试试这个, 从OnTick()中 删除 bCheckOrders(),并将其作为高亮显示

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 #:
不,我错了,OrderSend()返回一个票据或-1,所以这没有什么问题。

好的。

我会在今后的工作中记住这一点。

原因: