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

 
EVGENII SHELIPOV #:

日安!!!。

请帮助编写代码,以便在达到一定的缩减水平时关闭网格EA中的最小和最大订单。

我写了两个函数来计算最大和最小订单的利润

我还写了一个函数,计算这些订单的金额。这里似乎没有问题。

问题是如何只关闭这两个订单,我已经找到ClosseAll()函数。

问题是如何改变关闭所有订单的OrderTicket()函数。

附加变量max_ticket和min_ticket,确定网格中只有最小和最大订单的门票。

或者你对这个问题有自己的解决方案吗?

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

并修复它。

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

对不起,我又写错了。让我再试试)

有一个开放订单的网格。我需要找到最接近当前价格的订单的开盘价(OrderOpenPrice)。为了继续建立网格,但我的订单几乎是混乱地建立的。

我明白怎么写超限,但我无法用语言正确表达(我像狗一样,什么都懂))。

如果你有例子或例子的链接,请贴出来。MQL4

在一个循环中。

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

循环前初始化 previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

顺便说一下,除了在创建对象时隐式调用外,它有什么不同?

而且,当你在构造函数中调用它时,还没有分配内存,所以它不能编译。

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

但在构造函数体中,没有问题。

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



关于基类构造函数--它们可以被明确地调用

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

把这个也修好。

关于我在顾问开始时已经有的滑坡现象

MakarFX#:

并解决这个问题。

MakarFX#:

解决这个问题

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

根据平仓结果,只有最大的订单被平仓


 
Taras Slobodyanik #:

在循环中。

在循环之前初始化previous_value=DBL_MAX a nearest_order=0

MakarFX#:

并纠正这一点

MakarFX#:

并解决这个问题。

对于日志中的错误


 
下午好 有人听说过MirachLtd-Real这样的公司吗?有人有任何反馈吗?

 
EVGENII SHELIPOV #:

关于我在EA开始时已经出现的滑点

这个滑点正是为了这个功能......所以你不需要通过买入或卖出来实现。

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
如何更好地创建一个类对象:在类描述之后还是在本地,例如在OnTick()中?第二个选择可能不是很经济:CPU和RAM的负载。
 
MakarFX #:

这个滑点只是为了这个功能......所以你不需要通过买入或卖出。

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

你不需要在这里乘以一个点

由于类型转换可能导致数据丢失 NEVALASHKA.mq4 376 13

我在编译时得到一个警告


 
EVGENII SHELIPOV #:

没有必要乘以一个点

由于类型转换可能导致数据丢失 NEVALASHKA.mq4 376 13

我在编译时得到一个警告


不要乘以MODE_SPREAD - 以点为单位的点差

您可以查看

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

并像这样制作

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;
原因: