Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 741

 
fxsaber:
Вы же просили без извращений. А если с ними то
Поэтому вот так
double GetPositionCommission( void )
{
  double Commission = ::PositionGetDouble(POSITION_COMMISSION);

  // На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
  {
    const ulong Ticket = MT4ORDERS::GetPositionDealIn();

    if (Ticket > 0)
    {
      const double LotsIn = ::HistoryDealGetDouble(Ticket, DEAL_VOLUME);

      if (LotsIn > 0)
        Commission = ::HistoryDealGetDouble(Ticket, DEAL_COMMISSION) * ::PositionGetDouble(POSITION_VOLUME) / LotsIn;
    }
  }

  return(Commission);
}
Либо

Понимаю, что пост старенький, но меня только сейчас задело осколком.

Вот этот кусочек не корректен, комиссия на форексе может быть равна нулю

// На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
 
Artyom Trishkin:
ObjectGetValueByShift() (только МТ4), ObjectGetValueByTime() (МТ4, МТ5)

Спасибо
 
Alexey Volchanskiy:

Понимаю, что пост старенький, но меня только сейчас задело осколком.

Вот этот кусочек не корректен, комиссия на форексе может быть равна нулю


В чем некорректность?
 


Проблемма с конструктором копирования в MQL5

Динамический массив this.arr, в конструкторе копирования, в отладчике видится одномерным.

В результате size  ob2.arr равен 0 на выходе.

Почему?

Этот  же фрагмент правильно работает на MQL4.

редактор MT5

MetaEditor 5.0 1578

редактор MT4

MetaEditor 5.0 1562

class obj
  {
public:
   double            arr[][2];
                     obj(){}
                     obj(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
     }
   obj operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return &this;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
obj Copy(obj &o)
  {
   return o;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   obj ob1,ob2;
   ArrayResize(ob1.arr,3);
   ob2=Copy(ob1);
   bool stop=true;
  }


 
Klimenko_a_e:

В результате size  ob2.arr равен 0 на выходе.

Почему?

obj* Copy(obj &o)
  {
   return &o;
  };

Иначе Вы создаете новый объект.


   void operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return; // &this;
     }

Иначе происходит лишнее.


Сомневаюсь, что в MQL4 Ваш код работал правильно.

 
Доброго время суток!Подскажите пожалуйста  как открыть один отложенный ордер???
Как цикл остановить при условии если мне нужно открыть один отложенный ордер при открытом бае???

Он мне пачку открывает пока не кончается депозит!

Заранее спасибо!!!

 
Akinak:
Доброго время суток!Подскажите пожалуйста  как открыть один отложенный ордер???
Как цикл остановить при условии если мне нужно открыть один отложенный ордер при открытом бае???

Он мне пачку открывает пока не кончается депозит!

Заранее спасибо!!!


сначала надо выяснить "кто он"

 
Vladislav Andruschenko:


сначала надо выяснить "кто он"


Vladislav Andruschenko:


сначала надо выяснить "кто он"


for(int i=0; i<OrdersTotal();i++)
    {
      if(OrderSelect(i,SELECT_BY_POS))
      
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()==Magic)
              
               
               if(b>0)
                 
               
               
      { 
 int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,"",Magic,0,clrRed);
    if(tak>0)
    Print("SELLSTOP  Ok");
     else
     Print("SELLSTOP  Error");
       }  
        
     
    if(s>0)
   
     {
      OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,"",Magic,0,clrBlue);
      if(tik>0)
        Print("BUYSTOP  Ok");
      else
       Print("BUYSTOP  Error");
     }

    }


 

ну В Ы в цикле делаете так:

открываете позицию - открываете ордер, Количество позиций прибавляется, цикл повторяется - до бесконечности. 

int OrderSTotal=OrdersTotal();
for(int i=0; i<OrderSTotal;i++)
  {
   if(OrderSelect(i,SELECT_BY_POS))
      if(OrderSymbol()==Symbol())
         if(OrderMagicNumber()==Magic)

           {
            if(b>0)
              {
               int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,"",Magic,0,clrRed);
               if(tak>0)
                  Print("SELLSTOP  Ok");
               else
                  Print("SELLSTOP  Error");
              }

            if(s>0)
              {
                int tik=OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,"",Magic,0,clrBlue);
               if(tik>0)
                  Print("BUYSTOP  Ok");
               else
                  Print("BUYSTOP  Error");
              }
           }
  }
//+------------------------------------------------------------------+


Нужно знать, что такое b и s

 
fxsaber:

Иначе Вы создаете новый объект.


Иначе происходит лишнее.


Сомневаюсь, что в MQL4 Ваш код работал правильно.

В реальном коде - функция возвращает объект.

Конструктор копирования, по моему, и должен создавать в этом случае временную копию.

Код работает правиьно и в билде MQL5  1545. 

В новом билде конструктор копирования не может изменить размер даже одномерного массива: ошибка 4007.

По моему, это не правильно.

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