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

 
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.

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

 
Klimenko_a_e:

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

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

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

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

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

Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку https://www.mql5.com/ru/forum/1111

С моими правками код работает, как надо. Без - нет. А вот должен ли Ваш код работать - лучше в ветку по ссылке выше.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

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

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

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

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

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


В билде 1580 ошибку исправили, спасибо, всё работает как должно).