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

 
Maxim Kuznetsov #:

这是个玩笑吗?

你有它的黑与白(;;)

嗯,是的,但有一个办法:当魔法不等于秩序魔法。
 
Nerd Trader #:
嗯,是的,只是有一个出路:当魔法不等于秩序魔法时。

试试这个

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
 
EVGENII SHELIPOV 选定订单 的交换值。

如果有一格的订单怎么办?

谁有一个函数来计算一个神奇的订单和一个金融工具的网格的所有交换的总和。

谢谢你的帮助!!。

你需要它来做什么?
 
MakarFX #:
你需要它来做什么?

当关闭一个具有长网格寿命的大网格订单时,订单交换会吞噬利润,并使结果非常扭曲。

我想用这个功能来补偿掉期的损失。

 
EVGENII SHELIPOV #:

当关闭一个具有长网格寿命的大网格订单时,订单交换会吞噬利润,并使结果非常扭曲。

我想用这个功能来补偿掉期的损失。

网格是在盈利还是盈亏平衡时关闭?
 
MakarFX #:

试试这个

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
这就解决了,我有 if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)只是问题没有解决。
但我需要它通过所有的订单。法师本身在被创造的那一刻只被设定为阻止者。我们不能理解阻止者是由OrderType()创建的,因为它还没有出现;我们在order.cmd中有一个关于订单类型的初步记录。在这里,我们需要两个循环:一个嵌套在另一个中,这样,变量magic的一个迭代就会与OrdersTotal()中的所有订单进行检查。我已经全部实现了,只是有一个无尽的循环,我不知道为什么......。
 
MakarFX #:
网格是以盈利还是以收支平衡的方式关闭?

是的,在一定的缩减水平上,有一个损失到零,到没有损失的时候,由于掉期,有一个丑陋的损失。

 
Nerd Trader #:
这很好,我有 if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
但我需要所有的订单都被传递。法师本身是在只创建止血器时被设定的。我们不能知道阻止者是由OrderType()创建的,因为它还没有出现,我们需要事先在order.cmd中写入订单类型。在这里,我们需要两个循环:一个嵌套在另一个中,这样就可以用OrdersTotal()中的所有订单检查魔法变量的一个迭代。
告诉我你在哪里使用GetMagic(...)
 
void OpenOrder(int db = -1){

  if(db == -1){
    Print("'db' должен иметь корректное значение");
    return;
  }

  Order order;

  //Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопа
  if(Bid > db_last.low && Bid < db_last.hight){
    if(db == BEAR) order.InitForSell(SELLSTOP);
    if(db == BULL) order.InitForBuy(BUYSTOP);
  }

 ...

  if(order.is_init == true)
  {
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10, 
    order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);

    if(order_send == -1){
      Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
        " | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
        order.sl_price," | order.cmd ",order.cmd);
      ResetLastError();
      return;
    }
  }
}

...

int GetMagic(Order &order)
{
  int magic = 0;
  //Если должен быть открыт стопордер и если есть уже открытые или отложенные 
  //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать 
  //для нашего ордера уникальный маджик и отправить его на запись в массив
  if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
    if(OrdersTotal() >= 1)
      for(;;){
        magic++;
        for(int i = OrdersTotal(); i > 0 ; i --)
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
            if(magic != OrderMagicNumber())
              return magic;
            
      }
    //Если нет открытых или отложенных ордеров то увеличиваем значение 
    //маджика, чтобы он равнялся единице и отправляем на запись в массив
    else if (OrdersTotal() == 0)
      return (magic + 1);
  return magic;
}


评注中说,它把majic送到写数组,所以不要被这个误导,只要majic回到retorn就可以了。
 
EVGENII SHELIPOV #:

是的,在一定的缩减水平上,有一个损失到零,到没有损失的时候,由于掉期,有一个丑陋的损失。

   double GetOrderSwap()
     {
      double order_swap = 0;
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if (OrderType() == OP_BUY)
                 {
                  order_swap += OrderSwap();
                 }
              }
           }
        }
      return(order_swap);
     }
原因: