任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 125

 
Sepulca:

我本来是这样做的。


P.S. 同时回答))))

我不明白。

if(shift>0) shift=shift-1;

如果在第一条街打开,从零到零看?

 
artmedia70:

我不明白。

如果在第一根柱子上打开,我们是否从零开始寻找?


这是一个小小的保证,以防订单的开盘价 已经比开盘时的低价高很多。也就是说,我们不使用开放栏进行搜索。这就是PERIOD_M1的作用。
 
Sepulca:
这是一个小的对冲,以防订单的开盘价已经明显高于开盘时的低价。也就是说,我们不使用开放栏进行搜索。这就是PERIOD_M1的作用。

我将以不同的方式来做。一般来说,我只有在该位置持续了一个以上的柱子时才会开始搜索。毕竟,最好的价格可能就在开盘价上,而我们会浪费它。
 
artmedia70:
我将以不同的方式来做。一般来说,我只会在该位置持续了一个以上的小节时开始搜索。毕竟,最好的价格可能就在开盘价上,我们会浪费的......

我同意。记忆数组中每个未平仓订单在每个tick 上的最低(或最高)价格,并在达到条件时关闭订单,可能会比从订单开启的那一刻起重新搜索最低价格更有效率。

 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,......
 if(ShortOrderTicket[i]>=0) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for(i=0;i<N;i++){
  if(ShortOrderTicket[i]>=0){
   min[i]=MathMin(min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
  if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1;
 }
在出现问题的情况下,如失去连接,重新启动顾问等,我将不时地修改订单的止损。
 
artmedia70:
我认为这里的数组必须通过引用来传递。否则,该函数将不得不只与一个严格定义的数组工作。即使你在全球范围内定义了它。


嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是...

比如说,如果

void FindOrders(int massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

通过这样的称呼。

FindOrders(OrdersMassive)

它与OrdersMassive 阵列一起工作。

就这样。

FindOrders(massiveOfOrders)

有了massiveOfOrders 数组。

 
你能告诉我如何在开仓交易时找出点差,或者更好的是,如何让它显示在日志中?
 
Forexman77:
你能告诉我如何在开仓时找出点差的大小,或者更好的是,如何在日志中显示它?

如果(传播)==某个值,那么......做一些事情......。(例如,打开一个订单或在日记中打印其价值)。反之亦然,如果它不等于或大于(小于)某个值,那么我们就在日志中显示它并做一些事情。你可以做任何你喜欢的事情。
 

我将重复我昨天提出的问题。我不想把它贴在一个单独的主题里。如果有什么不清楚的地方,我将回答所有问题。

我仍然很难关闭所需的位置。情况是这样的。

1.正在跟踪关闭职位的情况。

2.一旦最后一个头寸在取款线处关闭......所有未结头寸和待结头寸都应立即关闭。所有的东西都是按批次分类封闭的,也就是说,大批次的东西一次过,然后是小的。这只是为了获得订单方面的经验。

实施情况如下。

start() 中的每一个刻度上。

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

我们对关闭市场订单感兴趣,因为待定的订单已按要求删除。下面是我们的情况。

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   pr ("Запустилась функция isCloseByTakeLastOpenPos");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool   fc;
   color  clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int    err, it, NumberOfTry = 3;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it=1; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep(5000);
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
           if (fc)
           {
              break;
           }
           else
           {
               err = GetLastError();
           }
       }
   }
   else Print("Некорректная торговая операция. Close ");
}

由于某些原因,一些订单没有被关闭。我看到一些片段就打印出来,我什么都不懂。下面是一个例子。

评论显示lastOOTHist=01:30:00,尽管这实际上并不正确。如果我们在结果窗口检查lastOOTHist,我们会看到

他们的关门时间是不同的...

这里有什么问题吗?

 
hoz:


嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是...

例如,如果。

通过这样的称呼。

它与OrdersMassive 阵列一起工作

就这样。

有了massiveOfOrders 数组。


当你把一个变量(数组)按值传递给一个函数时,一个局部变量 在函数内部被创建,你在标题中声明它:myFunct(int my_var)。这样一来,这个变量的变化就不能在函数之外看到。而在数组的情况下,编译器会提醒你这一点。

如果你想让变量值的变化在外面(函数之外)可见,可以通过引用传递变量:myFunct(int& my_var)

 
hoz:


这取决于哪个数组被传递给了调用函数。如果有一个特定的数组,那么被调用的函数将与它一起工作...是这样的...

例如,如果。

通过这样的称呼。

它与OrdersMassive 阵列一起工作

还有这种方式。

用数组massiveOfOrders

正是如此。这就是我想说的--如果你可以向函数传递任何相同大小和类型的数组,你为什么要在函数本身中硬编码一个特定的数组。