Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вся активность MQL5.community у тебя на ладони. Заходи в раздел Стена!
Миша
124
Миша 2016.04.20 10:36 

Задача следующая: 

Перевести фразу "Если три последних ордера закрылись в минус то: " в код. 

Приблизительное начало кода написал, но как определить что это будут именно три последних закрытых ордера ?

Заранее благодарен ! 

for(int i = OrdersTotal()-1; i >= 0;  i--)
 {
   if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
   {
     if(OrderProfit() < 0)
   }
 }
o_O
Модератор
23441
o_O 2016.04.20 11:49  
Rafting:

Задача следующая: 

Перевести фразу "Если три последних ордера закрылись в минус то: " в код. 

Приблизительное начало кода написал, но как определить что это будут именно три последних закрытых ордера ?

Заранее благодарен ! 

Модульно это выглядит так:

- сохранить в массив данные всех рыночных ордеров из истории

- отсортировать по времени закрытия по убыванию.

- взять из массива первые N.

Миша
124
Миша 2016.04.20 12:03  
sergeev:

Модульно это выглядит так:

- сохранить в массив данные всех рыночных ордеров из истории

- отсортировать по времени закрытия по убыванию.

- взять из массива первые N.

Спасибо, в целом понятно но с массивами пока у меня проблемы не до конца понимаю принцип работы. Буду пробовать если не будет получаться задам еще вопрос )

Спасибо ! 

LRA
324
LRA 2016.04.20 12:59  
Во-первых, OrdersTotal возвращает общее количество открытых и отложенных ордеров.
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
void OnStart()
{   
   int Всего=OrdersHistoryTotal();
   Alert("Всего ордеров = ",Всего);
   for(int i = Всего-5; i <= Всего-1;  i++)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         Alert("Ошибка");
         return;
      }
      Alert("Ордер = ", OrderTicket(),
         "   Время = ",OrderOpenTime(),
         "   Профит = ",OrderProfit());
   }
}
В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...
Миша
124
Миша 2016.04.20 13:31  
LRA:
Во-первых, OrdersTotal возвращает общее количество открытых и отложенных ордеров.
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...
Спасибо за разъяснение. Я правильно понимаю что "Всего-5" - означает что анализировать будет 5 последних ордеров ?
Миша
124
Миша 2016.04.20 17:00  
LRA:
Запусти скрипт и посмотри
void TrallLot()
{
  int TotalOrders = OrdersHistoryTotal();
          
  for(int i = TotalOrders-N_OrdersLosse; i <= TotalOrders-1;  i++) 
 {
   if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
   {
     if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
     {
       if(OrderProfit() < 0)
     }  
   }
 }
}

Получается пока так.

Но есть вопросы:

1) Можно ли обойтись без  OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) т.к используется OrdersHistoryTotal().

2) Как указать что если  TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 и TotalOrders - 4 и ... TotalOrders - N_OrdersLosse < 0 то ...

Artyom Trishkin
71306
Artyom Trishkin 2016.04.20 18:08  
LRA:
Во-первых, OrdersTotal возвращает общее количество открытых и отложенных ордеров.
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...

Вы уверены, что всегда будет именно так?

Прецеденты уже были. Раньше зависело от сортировки в терминале.

ИМХО - чтобы однозначно быть уверенным в том, что мы знаем именно нужные последние закрытые позиции, нужно их искать по времени закрытия. Это самый надёжный независимый от никакой сторонней сортировки метод. А советник работает с деньгами. Ладно, когда с вашими - фиг с ними, а если на заказ или продажу?

Миша
124
Миша 2016.04.20 18:51  
artmedia70:

Вы уверены, что всегда будет именно так?

Прецеденты уже были. Раньше зависело от сортировки в терминале.

ИМХО - чтобы однозначно быть уверенным в том, что мы знаем именно нужные последние закрытые позиции, нужно их искать по времени закрытия. Это самый надёжный независимый от никакой сторонней сортировки метод. А советник работает с деньгами. Ладно, когда с вашими - фиг с ними, а если на заказ или продажу?

Проверял скрипт, он показал ордера по порядку. см.скрин.

 

Скрин 

Artyom Trishkin
71306
Artyom Trishkin 2016.04.20 19:06  
Rafting:

Проверял скрипт, он показал ордера по порядку. см.скрин.

Вы давно программируете для МТ4, 5 ?

Я ж сказал: раньше была зависимость от сортировки в терминале МТ4. Потом её убрали. А потом опять она вдруг всплыла. После чего опять её не стало...

Как думаете, есть уверенность, что опять что-то не произойдёт?

При таком подходе, какой предлагаете вы, у меня нет такой уверенности. При однозначном поиске по времени закрытия, у меня есть уверенность, что чтобы ни случилось с сортировкой, я найду именно то, что ищу.

Вы же можете искать так, как вам скрипт показал в данный момент - никто вас не неволит.

LRA
324
LRA 2016.04.20 19:24  
Rafting:

Проверял скрипт, он показал ордера по порядку. см.скрин.

Речь о том, что если в Истории Счета щелкнуть по заголовку любого столбца, то расположение ордеров изменится. В предыдущих билдах функция OrderSelect() выбирала ордера в соответствии с этой сортировкой. Для надежности следует обратиться к разработчикам с вопросом о порядке выбора ордеров из истории с помощью функции OrderSelect().

Ответы на вопросы:

1) Можно ли обойтись без  OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
К элементам массива мы обращаемся по индексу. Индекс - это целое число, величина его ограничена. Поэтому, размер массива ограничен.
Ордеров очень много, ордера хранятся в базе данных. Обращение к ордерам происходит иначе. Выбирается один ордер с помощью функции OrderSelect
и после этого происходит обращение к полям ордера с помощью функций OrderTicket(), OrderOpenTime(), ...   Так что без OrderSelect ...

2) Как указать что если  TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 ...

int N=111; 
bool Результат=true;
int Всего=OrdersHistoryTotal();
for(int i = Всего-1; i >= Всего-N;  i--) // Перед этим надо сравнить количество ордеров и N
{
  bool Результат=OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
  if(OrderProfit()>0)
  {
    Результат=false;
    break;   // Выход из цикла на первом встретившемся прибыльном
  }
}

Если Результат==true, то все N ордеров убыточны. Оператор break прекращает выполнение оператора switch, while, do-while или for

Если же ордера в базе данных ордеров расположены хаотично, то надо проверять OrderCloseTime() и программа будет сложнее

Может быть проще следить за балансом. Если он в какой-то момент возрастет - значит была прибыль. Вам что конкретно надо-то?

Миша
124
Миша 2016.04.20 21:34  
LRA:

Речь о том, что если в Истории Счета щелкнуть по заголовку любого столбца, то расположение ордеров изменится. В предыдущих билдах функция OrderSelect() выбирала ордера в соответствии с этой сортировкой. Для надежности следует обратиться к разработчикам с вопросом о порядке выбора ордеров из истории с помощью функции OrderSelect().

Ответы на вопросы:

1) Можно ли обойтись без  OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
К элементам массива мы обращаемся по индексу. Индекс - это целое число, величина его ограничена. Поэтому, размер массива ограничен.
Ордеров очень много, ордера хранятся в базе данных. Обращение к ордерам происходит иначе. Выбирается один ордер с помощью функции OrderSelect
и после этого происходит обращение к полям ордера с помощью функций OrderTicket(), OrderOpenTime(), ...   Так что без OrderSelect ...

2) Как указать что если  TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 ...

Если Результат==true, то все N ордеров убыточны. Оператор break прекращает выполнение оператора switch, while, do-while или for

Если же ордера в базе данных ордеров расположены хаотично, то надо проверять OrderCloseTime() и программа будет сложнее

Может быть проще следить за балансом. Если он в какой-то момент возрастет - значит была прибыль. Вам что конкретно надо-то?

Идея следующая:

Есть результаты теста советника из которого следует что в среднем на подряд убыточных сделок 3 шт. Максимальное количество на подряд убыточных сделок 8 шт. Хочу вписать в советник следующее: если на подряд N убыточных сделок, следующий ордер открываем с увеличенным лотом. (Lot*kLot) ... 

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий