Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 246

 
Valeriy Yastremskiy:

Спасибо. Попробую. Не факт, что получится)

 
у меня есть открытые и закрытые ордера.
1. При открытие ордера нужно записать его Тикет в массив, если массив не занят(наверно =0), что бы потом от него в переборе вести отчет.
2. После закрытия ордера(может не закрытия), начат отчет профита закрытых ордеров. При достижения определенного профита, а именно : сумма профита + таке профит >= профита открытого ордера(назовём ордер 123), открытого раньше всех или с максимальным убытком (пока не решил).
3. при выполнении условий: "сумма профита + таке профит >= профита открытого ордера(назовём ордер 123)", ордер 123 закрывается, а массив обнуляется(наверно становится = 0 ).

1. Вы когда советник ставите, уже есть открытые и закрытые ордера, которые вы хотите учитывать или нет и работа советника каждый раз начинается без открытых ордеров и не учитывает закрытые ранее ордера?

2. Не понятен совсем. У вас несколько ордеров, при закрытии ордера считается профит общий суммированием и есть данные профита закрытого ордера. И есть данные профитов не закрытых ордеров, их можно посчитать. Что с чем сравнивается. Например есть 3 ордера. 1 закрытй, 2й закрывается, 3й открытый. Есть профиты Pr1, Pr2 и расчетный Pr3. Что с чем сравниваем. При этом мы понимаем что у не закрытого ордера мы не учитываем комиссии и свопы.

3. Вообще не понятно, если вы обнулите массив с тикетами, то дальше то как? В рынке же останутся рыночные ордера. Как их закрывать будете?

 
Oksana_Timakova:
Вопрос: как удержать значение High бара  a и Low бара  b для того, чтобы соединить их линией индикатора?
Нужно ли создавать для этого ещё два дополнительных массива?
Да. Буферных массива.
 
Valeriy Yastremskiy:
Да. Буферных массива.
То есть, получается, как в ЗигЗаге. А чтобы два из них не рисовали, надо применить какую-то специальную функцию?
 
Oksana_Timakova:
То есть, получается, как в ЗигЗаге. А чтобы два из них не рисовали, надо применить какую-то специальную функцию?
Тип линии такой же. Не понял про что бы не рисовали. Объявляете 2 буферных массива. Устанавливаете свойства. Это тип линии, толщина цвет. И присваиваете первому хай цены а второму Лоу побарно из тайм серии.
 
Valeriy Yastremskiy:

1. Вы когда советник ставите, уже есть открытые и закрытые ордера, которые вы хотите учитывать или нет и работа советника каждый раз начинается без открытых ордеров и не учитывает закрытые ранее ордера?

2. Не понятен совсем. У вас несколько ордеров, при закрытии ордера считается профит общий суммированием и есть данные профита закрытого ордера. И есть данные профитов не закрытых ордеров, их можно посчитать. Что с чем сравнивается. Например есть 3 ордера. 1 закрытй, 2й закрывается, 3й открытый. Есть профиты Pr1, Pr2 и расчетный Pr3. Что с чем сравниваем. При этом мы понимаем что у не закрытого ордера мы не учитываем комиссии и свопы.

3. Вообще не понятно, если вы обнулите массив с тикетами, то дальше то как? В рынке же останутся рыночные ордера. Как их закрывать будете?

Еще раз ))) 

Есть открытые ордера, предположим 5 штук, все минусовые. Самый первый из них (123) с лотом 0.5, но он пошел в минус. Открываем новый ордер(456) с лотом 0.1, тикет этого ордера и записываем в массив при открытии. Далее идет еще серия ордеров таким же лотом, что-то в плюс, что-то в минус. Но ордер 123 остается минусовым и открытым. Как только профит всех закрытых ордеров после ордера 456( он тоже закрыт) будет больше чем профит ордера 123, находим ордер 123, поскольку он первый и еще открыт и закрываем его, и обнуляем массив. 

Есть несколько открытых ордеров, открываем еще один при определенных условиях. Предположим  if ordertotal>=5

ordersend (тикет 456)

  если ордер успешно отрыт

если массив не занят

тикет 456 записываем в массив

ордер 456 закрылся по профиту( не важно какой плюс или минус), следом  были открыты другие ордера и закрыты, но в массиве хранится тикет 456.


CalCloseProfi () - функция проверяет профит закрытых ордеров

  перебирает закрытые ордера по магику, бай, селл,  начиная с  ордера с тикетом 456(взятого из массива) и вверх, и считает их профит


FirstOrder() -функция ищет среди открытых ордеров первый открытий( по идее должна найти 123)) 

если профит CalCloseProfi >  FirstOrder, то ордер 123 закрываем и обнуляем массив, чтобы потом при выполнении условий он опять туда мог записать тикет.


Не знаю как еще объяснить)

Условия при которых будут выполняться это функции могу написать, но не сталкивался с массивами.
Нужен пример, как запихнуть инфу в массив, а именно OrederTicket при открытии, и как потом ее достать.
Желательно использовать Двойной массив, в одну его часть записать магик, чтобы при работе на одном счете при разных настройках не перемешались(а может и не надо, не силен в массивах)

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

 
makssub:

Еще раз ))) 

Есть открытые ордера, предположим 5 штук, все минусовые. Самый первый из них (123) с лотом 0.5, но он пошел в минус. Открываем новый ордер(456) с лотом 0.1, тикет этого ордера и записываем в массив при открытии. Далее идет еще серия ордеров таким же лотом, что-то в плюс, что-то в минус. Но ордер 123 остается минусовым и открытым. Как только профит всех закрытых ордеров после ордера 456( он тоже закрыт) будет больше чем профит ордера 123, находим ордер 123, поскольку он первый и еще открыт и закрываем его, и обнуляем массив. 

Есть несколько открытых ордеров, открываем еще один при определенных условиях. Предположим  if ordertotal>=5

ordersend (тикет 456)

  если ордер успешно отрыт

если массив не занят

тикет 456 записываем в массив

ордер 456 закрылся по профиту( не важно какой плюс или минус), следом  были открыты другие ордера и закрыты, но в массиве хранится тикет 456.


CalCloseProfi () - функция проверяет профит закрытых ордеров

  перебирает закрытые ордера по магику, бай, селл,  начиная с  ордера с тикетом 456(взятого из массива) и вверх, и считает их профит


FirstOrder() -функция ищет среди открытых ордеров первый открытий( по идее должна найти 123)) 

если профит CalCloseProfi >  FirstOrder, то ордер 123 закрываем и обнуляем массив, чтобы потом при выполнении условий он опять туда мог записать тикет.


Не знаю как еще объяснить)

Условия при которых будут выполняться это функции могу написать, но не сталкивался с массивами.
Нужен пример, как запихнуть инфу в массив, а именно OrederTicket при открытии, и как потом ее достать.
Желательно использовать Двойной массив, в одну его часть записать магик, чтобы при работе на одном счете при разных настройках не перемешались(а может и не надо, не силен в массивах)

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

Напишите условия выполнения функций.
 

Добрый день. Подскажите почему ошибку выдает:  array out of range in '.......' (152,41)


ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, Magic, 0, Red);
            if (ticket <1)
            {
               Print("Ошибка открытия на продажу");
            }
               if (ticket >1 && SaveTick[1] <= 0 && SaveTick[0] == Magic)
            {
               FindTicket();
               Print(" Тикет ордера: ", FindTicket(), " Массив ордера: ", SaveTick[1], " Магик массива: ", SaveTick[0]);
    }

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   ArrayResize( SaveTick, 2 );
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               SaveTick[1] = tick;
               SaveTick[0] = Magic;
               }
            }
         }
      }
   return(tick);
  }              

 
makssub #:

Добрый день. Подскажите почему ошибку выдает:  array out of range in '.......' (152,41)


ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, Magic, 0, Red);
            if (ticket <1)
            {
               Print("Ошибка открытия на продажу");
            }
               if (ticket >1 && SaveTick[1] <= 0 && SaveTick[0] == Magic)
            {
               FindTicket();
               Print(" Тикет ордера: ", FindTicket(), " Массив ордера: ", SaveTick[1], " Магик массива: ", SaveTick[0]);
    }

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   ArrayResize( SaveTick, 2 );
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               SaveTick[1] = tick;
               SaveTick[0] = Magic;
               }
            }
         }
      }
   return(tick);
  }              

Вставляйте код правильно, альт S или по иконке, подсказка код.

А зачем вам массив SaveTick?

Вы используете только 2 элемента массива. Замените их на глобальные или статик переменные, если объявляете в функции. 

Не разумно для 2х переменных использовать массив.

И судя по всему, вы вызываете массивы до вызова функции FindTicket() в которой задается размер массива  SaveTick. И происходит выход за пределы массива.

 
Перестал работать 🤖? 
Причина обращения: