Скачать MetaTrader 5

Как передавать-получать массивы структур?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Victor Demihov
618
Victor Demihov  

Уже не первый день думаю над тем, как переписать некоторые вещи. Вот имеется массив структур, объявленный так в хедере:

Position_Properties  SPos[100];

 и заполняется вот так:

for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      SPos[i].iType = OrderType();
      SPos[i].iCurTicket = OrderTicket();
      SPos[i].dOpenPrice = OrderOpenPrice();
      SPos[i].dLots = OrderLots();
      SPos[i].dCurSL = OrderStopLoss();
      SPos[i].dCurTP = OrderTakeProfit();
      SPos[i].sComment = OrderComment();
   }

 Хочу есс-но понять как передавать данную структуру в какую-нить функцию. Если массив передаётся по имени массива, то тут так же?

Например, была такая функцию:

CheckDemandsForStopLevel (int fi_Mode, string  fs_Symbol, int fi_Type, double  &fd_NewOpenPrice, double  &fd_NewSL, double  &fd_NewTP, bool    &fb_FixInvalidPrice)

 Я так понимаю, после передачи данного массива структур эта функция будет выглядеть так, верно?

CheckDemandsForStopLevel (Position_Properties  MyPos,//... другие параметры)
{
   // Получаем значения свойств переданной структуры так?
   MyPos[i].iType = OrderType();
   MyPosPos[i].iCurTicket = OrderTicket();
   MyPosPos[i].dOpenPrice = OrderOpenPrice();
   MyPosPos[i].dLots = OrderLots();
   MyPosPos[i].dCurSL = OrderStopLoss();
   MyPosPos[i].dCurTP = OrderTakeProfit();
   MyPosPos[i].sComment = OrderComment();
}
Рустам
3607
Рустам  
CheckDemandsForStopLevel (Position_Properties  &MyPos[],//... другие параметры)

если весь массив

если один из его элементов 

 CheckDemandsForStopLevel (Position_Properties  MyPos,//... другие параметры)

{
   // Получаем значения свойств переданной структуры так?
   MyPos.iType = OrderType();
   MyPos.iCurTicket = OrderTicket();
   MyPos.dOpenPrice = OrderOpenPrice();
   MyPos.dLots = OrderLots();
   MyPos.dCurSL = OrderStopLoss();
   MyPos.dCurTP = OrderTakeProfit();
   MyPos.sComment = OrderComment();
}
Victor Demihov
618
Victor Demihov  
FAQ:

если весь массив

если один из его элементов 

 CheckDemandsForStopLevel (Position_Properties  MyPos,//... другие параметры)

По ссылке то передаётся всё замечательно. Имею ввиду передачу массива структур. А вот если передать один из элементов, то не выходит. Всё-равно в даже если структуру одну, а не массив передавать нужно по ссылке( по крайне мере, компилятор ругается, если без ссылки пытаться передавать). Так вот пробую так:

Position_Properties SPos[100];
//---

//+------------------------------------------------------------------+
//| Вывод значений структуры                                           |
//+------------------------------------------------------------------+
void ReturnValueOfArray (Position_Properties& MyPos)
{
   for (int i = 5; i >= 0; i--)
   {
/*      Print ("MyPos[", i, "].iType = ", SPos[i].iType);
      WriteLog (StringConcatenate("MyPos[", i, "].iType = ",  IntegerToString (SPos[i].iType)));
      WriteLog (StringConcatenate("MyPos[", i, "].dCurSL = ", MyPos[i].dCurSL));
      WriteLog (StringConcatenate("MyPos[", i, "].iType = ", SPos[i].iType));
      WriteLog (StringConcatenate("MyPos[", i, "].iCurTicket = ", SPos[i].iCurTicket));
      WriteLog (StringConcatenate("MyPos[", i, "].dOpenPrice = ", SPos[i].dOpenPrice));
      WriteLog (StringConcatenate("MyPos[", i, "].dLots = ", SPos[i].dLots));
      WriteLog (StringConcatenate("MyPos[", i, "].dCurSL = ", *DoubleToStr (SPos[i].dCurSL)));
      WriteLog (StringConcatenate("MyPos[", i, "].sComment = ", SPos[i].sComment));
*/   }
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   for (int i = 5; i >= 0; i--)
  {
      SPos[i].iType = 6;
      SPos[i].iCurTicket = 5;
      SPos[i].dOpenPrice = 1.25;
      SPos[i].dLots = 0.01;
      SPos[i].dCurSL = 1.24;
      SPos[i].dCurTP = 1.26;
      SPos[i].sComment = "dDSDS";
      
      ReturnValueOfArray (SPos);
   }
}

 Компилятор так ругается:

'SPos' - parameter conversion not allowed       Expertsqsdfsdgfh.mq4    92      27

 Как его тогда передать? И, самое главное, как к нему обратится внутри функции, в которую я её передам?

Рустам
3607
Рустам  

вот тут вы передаете весь массив :

ReturnValueOfArray (SPos);

а  здесь принимаете один его элемент (структуру) :

void ReturnValueOfArray (Position_Properties& MyPos)

конечно компилятор будет ругаться. или принимайте в функцию весь массив :

void ReturnValueOfArray (Position_Properties &MyPos[])

или отправляйте только один его элемент :

 ReturnValueOfArray (SPos[i]);

 

Рустам
3607
Рустам  
в общем или крест снимите, или трусы оденьте... )))
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий