将开放的职位分成若干组 - 页 6

 
增加了一个新的功能,现在顾问可以将一组职位的种姓改为另一个设定的种姓。
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets(int &array_base[][observations], 
                                                  int &array_change[], 
                                                  int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange(array_base,0);

   for(int i=0; i<size_change; i++){
      int ticket_change = array_change[i];
      for(int a=0; a<size_base; a++){
         if(array_base[a][0] == ticket_change ||
            array_base[a][1] == ticket_change){
            array_base[a][2]  = new_caste;
            break;}}}    
   ArrayFree(array_change);
       
return(size_change);
}
//+------------------------------------------------------------------+
 

晚上好。我想听听专家们的意见。

请告知在需要完成以下任务时,最好使用哪些功能。

我需要开几个仓位(来自市场,没有订单),并立即将它们的票据放入一个数组。

困难的是如何获得这些票据,我没有找到任何函数可以打开一个头寸 并返回一个票据(像在MT4中)。

只要在循环中打开交易,参数等--没有问题,但要获得票据,只需打开一个位置,而不是拥有!

请提供建议。

不知何故,事情是这样的。

Ticket = Function.Open Position(Buy, 0.01, ......)。

 
Sergey Voytsekhovsky:

开仓 并返回票据(如MT4)。

....................,但要得到一张刚开出的仓位的票,我需要!!

请告知。

当我想到的时候,我只能要求提供最后一个空缺职位的票据。但不知何故,我觉得这很笨拙,太含糊了,代码中的订单和开仓之间没有直接的联系。肯定有更正确的方法,谁有想法或有足够的经验,请分享一下?

 
Sergey Voytsekhovsky:

我想到的唯一办法是为历史上最后一个开放的职位申请一张票。但不知何故,我觉得这很笨拙,太含糊了,代码中的订单和开仓之间没有直接联系。肯定有更正确的方法,谁有想法或可能有足够的经验,请分享一下?

我已经在文章中描述了这一切。对于mql5和mql4,一切都在那里完成。你可以把一个想法,做成一个功能。

然而。你有一个交易,其中写入了位置标识符。请阅读文件中关于交易和它们的属性的内容。

 
Sergey Voytsekhovsky:

晚上好。我想听听专家们的意见。

请告知在需要完成以下任务时,最好使用哪些功能。

我需要开几个仓位(来自市场,没有订单),并立即将它们的票据放入一个数组。

困难的是如何获得这些票据,我没有找到任何函数可以打开一个头寸 并返回一个票据(像在MT4中)。

只要在循环中打开交易,参数等--没有问题,但要获得票据,只需打开一个位置,而不是拥有!

请提供建议。

不知何故,事情是这样的。

Ticket = Function.Open Position(Buy, 0.01, ......)。

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    ulong ticket = trans.position; // тикет позиции
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
      {
      }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)// закрылась позиция
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
     }
   }
 }
 
Artyom Trishkin:

我已经在文章中描述了这一切。对于mql5和mql4,一切都在那里完成。你可以采纳这个想法,并使其发挥作用。

然而。你有一笔交易,其中写有一个位置标识符。请阅读文件中关于交易和它们的属性的内容。

非常感谢你,我将进行调查。

 
Alexey Viktorov:

很好,现在有事情要做了 :-)。我会想办法的,一定要把结果贴出来,也许这对别人也有帮助。

 
Sergey Voytsekhovsky:

很好,现在有事情要做了 :-)。我会想办法的,一定要把结果贴出来,也许这对别人也有帮助。

很少有人不知道。而那些不知道的人在读完这个主题后应该能够做到。如果他们不能,那就不关国王的事了......来打探情况。

 
Artyom Trishkin:

我已经在文章中描述了这一切。对于mql5和mql4,一切都在那里完成。你可以采纳这个想法,并使其发挥作用。

谢谢,到底在你的哪些文章中?你有这么多的.....

 

下午好。

我再次向本论坛的大师们呼吁。

我写了一个小函数。它起作用,但非常缓慢。我明白,这个算法的效率非常低。我是在这里读到的。

https://www.mql5.com/ru/articles/567

一个函数可以添加到数组的末端

我不懂怎么用,你能不能帮我把想象力拉回正轨,我把感兴趣的地方用颜色标出来。

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure(int kodclana)
{
   int n = 0;
   if(!Refresh_Rates())return(false);
   int SizeTotalPosition = PositionsTotal();
   int SizeArrayPosition = ArraySize(ArrayPosition);
//---Запись новых позиций в структуру        
   for(int i=0; i < SizeTotalPosition; i++)
      {//---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool  new_pos  = true;
         ulong ticket   = PositionGetTicket(i);
         int   lifetime = DatetimeToInteger(TimeCurrent() - m_position.Time());
         SizeArrayPosition = ArraySize(ArrayPosition);
         for(int y = 0; y < SizeArrayPosition; y++)
            {
               if(ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/60*_Period;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false;
                     n++;
                     break;
                  }
            }
         if(new_pos)
            {//---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize(ArrayPosition, SizeArrayPosition+1, 1);
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/60*_Period;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize(ArrayPosition);
      SizeTotalPosition = PositionsTotal();
      
      for(int z = 0; z < SizeArrayPosition; z++)
         {
            ulong ticket_cl   = ArrayPosition[z].ticket_pos;
            bool  cl_position = true;
            
            for(int i = 0; i < SizeTotalPosition; i++)
               {
                  if(ticket_cl == PositionGetTicket(i))
                     {
                        cl_position = false;
                        n++;
                        break;
                     }
                }
            if(cl_position)
               {
               ArrayRemove(ArrayPosition,z,1);
               Sleep(SLEEPTIME*slp);
               SizeArrayPosition = ArraySize(ArrayPosition);
               }
         }
return(n);
}