Найти отличие ...

 

возможно я заработался... но вот, помотрите друзья

    mswa_OrderSymbol      [i] = Symbol();
    ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

вот здесь 

mswa_OrderSymbol      [i] = Symbol();
ms32a_OrderType       [i] = s32_OrderType;

присваивания не происходит !!!

а вот, если так :

   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;

то все нормально !  "от перемены мест слагаемых сумма иеняется " !

это MQL4....

 
Denis Sartakov:

возможно я заработался... но вот, помотрите друзья

вот здесь 

присваивания не происходит !!!

а вот, если так :

то все нормально !  "от перемены мест слагаемых сумма иеняется " !

это MQL4....


Подчеркните или ещё как-то выделите отличия, а то их что-то не находится. И внятно объясните, зачем присваивание делать два раза?
 
Vitalie Postolache:

Подчеркните или ещё как-то выделите отличия, а то их что-то не находится. И внятно объясните, зачем присваивание делать два раза?


потому что, когда присваивание делается один раз - верхние две строки,

то присваивания не происходит ! в этих элементах остаются старые данные !

вот так  присваивания не происходит:

    mswa_OrderSymbol      [i] = Symbol();
    ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

а вот так, происходит:

   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

   mswa_OrderSymbol      [i] = Symbol();
    ms32a_OrderType       [i] = s32_OrderType;
 
Denis Sartakov:


потому что, когда присваивание делается один раз - верхние две строки,

то присваивания не происходит ! в этих элементах остаются старые данные !

вот так  присваивания не происходит:

а вот так, происходит:


А если так?

   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;
Покажите весь цикл, может дело не в этом куске кода вовсе.
 

Между последними 2-мя строками и верхним аналогичным присвоением явно существует некоторое действие.

Подозреваю, что это команда выхода из цикла, либо происходит выход по ошибке.

 
Vitalie Postolache:


А если так?

Покажите весь цикл, может дело не в этом куске кода вовсе.


вот функция, содержащая этот кусок кода:

bool cExpert::OpenOrder_SaveAccount(string sw_Comment)
{
   if (!mb_OpenBuy_SaveAccount && !mb_OpenSell_SaveAccount)
      return(false);

   if (!mb_PermitToOpen)
   {
      mb_OpenBuy_SaveAccount = false;
      mb_OpenSell_SaveAccount = false;
      return(false);
   }
   
   OrdersTrade(mi_Magic_SaveAccount,Symbol(),MODE_DESCEND); 
   
   double d_MinStop = md_StopLevel + ms32_SlippagePips * Point;
   
   int i = ms32_ExpertOrdersTotal;
   
  
   int    s32_OrderType;  
   double d_OrderOpenPrice;
      
   double d_OrderStopLossMin; 
   double d_OrderStopLoss;
   
   double d_TSL_StartLevel;
   double d_TSL_StepLevel;
 
   double d_OrderTakeProfitMin; 
   double d_OrderTakeProfit; 
   double d_BreakEvenLevel;
   double d_BreakEvenProfitLevel;
   
   s32_OrderType = mb_OpenBuy_SaveAccount ? OP_BUY : OP_SELL; 
  
   d_OrderOpenPrice = mb_OpenBuy_SaveAccount ? md_Ask : md_Bid; 

   if (mb_OpenBuy_SaveAccount)
   {
      d_OrderStopLossMin = md_Bid - d_MinStop;
      
      d_OrderStopLoss    = ms32_SL_Pips    == 0 ? 0 : md_Ask - ms32_SL_Pips*Point;
      d_OrderStopLoss    = d_OrderStopLoss == 0 ? 0 : MathMin(d_OrderStopLossMin, d_OrderStopLoss);
      
      d_OrderTakeProfitMin = md_Bid + d_MinStop;
     
      d_OrderTakeProfit  = ms32_TP_Pips      == 0 ? 0 : md_Ask + ms32_TP_Pips * Point;
      
      d_OrderTakeProfit  = d_OrderTakeProfit == 0 ? 0 : MathMax(d_OrderTakeProfitMin, d_OrderTakeProfit);
   }
   
   if (mb_OpenSell_SaveAccount)
   {
      d_OrderStopLossMin = md_Ask + d_MinStop;
      
      d_OrderStopLoss    = ms32_SL_Pips    == 0 ? 0 : md_Bid + ms32_SL_Pips*Point;
      d_OrderStopLoss    = d_OrderStopLoss == 0 ? 0 : MathMax(d_OrderStopLossMin, d_OrderStopLoss);
      
      d_OrderTakeProfitMin = md_Ask - d_MinStop;
     
      d_OrderTakeProfit  = ms32_TP_Pips      == 0 ? 0 : md_Bid - ms32_TP_Pips * Point;
      
      d_OrderTakeProfit  = d_OrderTakeProfit == 0 ? 0 : MathMin(d_OrderTakeProfitMin, d_OrderTakeProfit);
   }
 
   string s_OrderComment = sw_Comment;
   
   double d_Lot;
   
   d_Lot = GetLotSize_SaveAccount();
   
   if (d_Lot >= pd_MartMaxLotSaveAccount)
   {
      mb_OpenBuy_SaveAccount = false;
      mb_OpenSell_SaveAccount = false;
      Print("pd_MartMaxLotSaveAccount was exceeded");
      return(false);
   }
   
   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;

   if (!_OpenOrder(i))
      return(false);
   
   if (ms32a_OrderType [i] == OP_BUY)
   {
      mb_OpenBuy_SaveAccount = false;
      Print("Order was opened due to mb_OpenBuy_SaveAccount signal");
      UpdateTradesCountsInfo(OP_BUY);
   }

   if (ms32a_OrderType [i] == OP_SELL)
   {
      mb_OpenSell_SaveAccount = false;
      Print("Order was opened due to mb_OpenSell_SaveAccount signal");
      UpdateTradesCountsInfo(OP_SELL);
   }   
   
   OrdersTrade(mi_Magic_SaveAccount,Symbol(),MODE_DESCEND); 
   
   return(true);
}
//+------------------------------------------------------------------+
 
Renat Akhtyamov:

Между последними 2-мя строками и верхним аналогичным присвоением явно существует некоторое действие.

Подозреваю, что это команда выхода из цикла, либо происходит выход по ошибке.


нету там ничего, я проверял, остаются старые значения...

я их распечатывал после этой строчки:

ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;

думаю какой-то баг в MQL4 при работе с памятью...

для всех этих массивов делается ArrayResize(....)...

 
а функция "GetLotSize_SaveAccount()" - не обнуляет эти значения?
 
Denis Sartakov:


нету там ничего, я проверял, остаются старые значения...

я их распечатывал после этой строчки:

думаю какой-то баг в MQL4 при работе с памятью...

для всех этих массивов делается ArrayResize(....)...

а так работает?:

   mda_OrderStopLoss     [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderStopLoss;
   mda_OrderTakeProfit   [i] = (mb_VirtualStops || ib_SupportECN) ? 0 : d_OrderTakeProfit;
   mswa_OrderSymbol      [i] = Symbol();
   ms32a_OrderType       [i] = s32_OrderType;
   mda_OrderLots         [i] = GetLotSize_SaveAccount();
   mda_OrderOpenPrice    [i] = d_OrderOpenPrice;
   mswa_OrderComment     [i] = s_OrderComment;
   ms32a_OrderMagicNumber[i] = mi_Magic_SaveAccount;
переставляйте снизу вверх по одной строчке с массивом и найдёте решение Вашей задачки
 
Denis Sartakov:


нету там ничего, я проверял, остаются старые значения...

я их распечатывал после этой строчки:

думаю какой-то баг в MQL4 при работе с памятью...

для всех этих массивов делается ArrayResize(....)...

ищите баг внутри, где-то внутри функции вы портите свои глобальные массивы

   mda_OrderLots         [i] = GetLotSize_SaveAccount();
 
Maxim Kuznetsov:

ищите баг внутри, где-то внутри функции вы портите свои глобальные массивы


да, друзья, так и есть ! эта хрень GetLotSize_SaveAccount() затирает заполненные елементы !!!

большое всем спасибо, звиняйте за беспокойство !!

Причина обращения: