Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 72

 
Vitalie Postolache:


Если сравнивать с балансом, то так:

Спасибо.

 
trader781:

ок, тогда как я понимаю получится три разных кастомных функции с возвратом нужного(если искать три разных параметра)

ArraySort

потом

ArrayBsearch по нужному номеру 

и дальше как с этим? 

именно переход от массива к элементру структуры

Вы не понимаете.

Вам нужно сделать одну функцию, которая будет заполнять и сортировать массив, объявленный на глобальном уровне. Массив в функцию нужно будет передавать по ссылке.

И нужны дополнительные функции, которые из этого массива будут вынимать нужные вам данные.

 
Artyom Trishkin:

Вы не понимаете.

Вам нужно сделать одну функцию, которая будет заполнять и сортировать массив, объявленный на глобальном уровне. Массив в функцию нужно будет передавать по ссылке.

И нужны дополнительные функции, которые из этого массива будут вынимать нужные вам данные.

 

ок, можно демонстрацию как вытащить что - то из массива структур? допустим наполнен и отсортирован

как передать по ссылке и записать

 

подскажите как должно выглядеть условие. Если стоп лосс сработал, то лот умножаем на 2, а если у следущего ордера сработал тейк профит лот бы вернулся к исходному лоту который был до стоплоссов.

я понимаю это примерно так, но дальше как пока не придумал..

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

еще вопрос, что не правильно написал в блоке по удалению ордеров? не всегда удаляет ордера, в журнале пишет

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


 

 
wishmast:

еще вопрос, что не правильно написал в блоке по удалению ордеров? не всегда удаляет ордера, в журнале пишет

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


 

Пытаетесь удалить рыночный ордер, они не удаляются, а закрываются функцией OrderClose(). Чтобы цикл удалял или закрыва правильно, нужно различать отдера по типу. 

 if(OrderType()<=OP_SELL) - для рыночных ордеров,  if(OrderType()>OP_SELL) - для отложенных.

 

Есть такая штука: CHARTEVENT_MOUSE_MOVE

Вопрос: это работает на мобильных устройствах, там где нет мышки? 

 
wishmast:

подскажите как должно выглядеть условие. Если стоп лосс сработал, то лот умножаем на 2, а если у следущего ордера сработал тейк профит лот бы вернулся к исходному лоту который был до стоплоссов.

я понимаю это примерно так, но дальше как пока не придумал..

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

сделал по быстрому, тебе выдаст последний убыточный, что с ним делать и какие параметры подправить под себя уже думаю разберешся
Файлы:
last1.mq4  4 kb
 
wishmast:

подскажите как должно выглядеть условие. Если стоп лосс сработал, то лот умножаем на 2, а если у следущего ордера сработал тейк профит лот бы вернулся к исходному лоту который был до стоплоссов.

я понимаю это примерно так, но дальше как пока не придумал..

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

решение этой задачи зависит от полной логики советника, срабатывание стоплосса или тейкпрофита можно отследить по его комментарию.

 

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

 

 ...

 
Artyom Trishkin:

Вы не понимаете.

Вам нужно сделать одну функцию, которая будет заполнять и сортировать массив, объявленный на глобальном уровне. Массив в функцию нужно будет передавать по ссылке.

И нужны дополнительные функции, которые из этого массива будут вынимать нужные вам данные.

Артём, ты не прав. Массив объявленный на глобальном уровне виден во всех частях программы и передавать его куда-то откуда-то совсем не надо. Просто в одном месте программы он заполняется, в другом сортируется, а в третьем читается, не важно.