Как определить предыдущий ордер SELL или BUY

 
Что можно использовать для определения предидущего оредера он был SELL или BUY, для входа в сделку?
 
 
Я определяю так:
// +-------------------------------------------------------------------------------------+
// | Ф-ия OrderScan                                                                      |
// | Ищет и выберает последний ордер среди указанных типов торговых операций. Возвращает |
// | тип торговой операции выбранного ордера. Поиск производит среди 'закрытых и         |
// | удаленных ордеров' или 'открытых и отложенных', в зависимости от параметра "area".  |
// | Если ордер соответствующего типа не найден - ф-ия возвращает значение "-1", при     |
// | этом выбран будет последний ордер в сответствующем списке. Если ф-ии был передан    |
// | неправильный входной параметр area, или небыло передано ни одного значения type,    |
// | она возвращает "-2".                                                                |
// |                                                                                     |
// |       int OrderScan(int area, int type1, int tyte2, int tyte3, int tyte4, ...)      |
// |                                                                                     |
// | Параметры:                                                                          |
// | area - Источник данных для выбора. Mожет быть одной из следующих величин:           |
// |        MODE_TRADES  (0) - ордер выбирается среди открытых и отложенных ордеров.     |
// |        MODE_HISTORY (1) - ордер выбирается среди закрытых и удаленных ордеров.      |
// | type - Тип торговых операций, которые нужно искать, указывается через запятую, не   |
// |        более 6, но не мение одного. Mожет быть одной из следующих величин:          |
// |        0 - (OP_BUY) Покупка                                                         |
// |        1 - (OP_SELL) Продажа                                                        |
// |        2 - (OP_BUYLIMIT) Отложенный ордер BUY LIMIT                                 |
// |        3 - (OP_SELLLIMIT) Отложенный ордер SELL LIMIT                               |
// |        4 - (OP_BUYSTOP) Отложенный ордер BUY STOP                                   |
// |        5 - (OP_SELLSTOP) Отложенный ордер SELL STOP                                 |
// +-------------------------------------------------------------------------------------+
int OrderScan(int area, int a=-1, int b=-1, int c=-1, int d=-1, int e=-1, int f=-1)
  {
   int n;
   int total=-1;
   int masiv[6];
   masiv[0]=a; masiv[1]=b; masiv[2]=c; masiv[3]=d; masiv[4]=e; masiv[5]=f; 
   if(area==MODE_TRADES) {total=OrdersTotal(); n=1;}
   if(area==MODE_HISTORY) {total=HistoryTotal(); n=2;}
   if(total==-1) {Print("Ф-ии OrderScan был передан неправильный параметр area"); return(-2);}
   if(masiv[0]==-1) {Print("Ф-ии OrderScan небыло передано ни одного параметра type"); return(-2);}
   for(int i=1; i<=total; i++)  // Перебираем все ордера
     {
      switch(n)
        {
         case 1: OrderSelect(total-i,SELECT_BY_POS,MODE_TRADES); break;
         case 2: OrderSelect(total-i,SELECT_BY_POS,MODE_HISTORY); break;
        }
      for(int m=0; m<=5; m++)
        {
         if(masiv[m]==-1) break;
         if(OrderType()==masiv[m])
           {
            return(masiv[m]);
           }
        }
     }
   return(-1);
  }

Ставишь этот кусок программы в начале эксперта, а затем вызываешь его как ф-ию. Если нужно определить какой был последний ордер (BUY или SELL) среди закрытых ордеров, то пишешь так:

int i;
i=OrderScan(MODE_HISTORY,0,1);
if(i==0) Print("Предыдущий ордер BUY");
if(i==1) Print("Предыдущий ордер SELL");
if(i==-1) Print("Ордеров BUY или SELL не найдено");
if(i==-2) Print("В ф-ию OrderScan переданы неправельные параметры");

Если среди открытых, тогда так:

i=OrderScan(MODE_TRADES,0,1);
 

А OrderType можно как то использовать?

 
Для принятия торговых решений предыдущая история не имеет никакого значения.
 
OrderType возвращает тип выбранного ордера. Прежде чем определить тип последней закрытой позиции ее нужно выбрать. Это можно сделать по порядковому номеру в списке. Если у тебя в истории 50 закрытых позиций, то последняя будет под номером 49 (так как отсчет идет с нуля). Количество закрытых позиций можно определить ф-ией HistoryTotal. Тоесть нужно выбрать из истории позицию под номером в списке HistoryTotal()-1, и определить ее тип.
int i;
int m=-1;
i=HistoryTotal()-1;  // Определяем номер в списке последнего закрытого ордера
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);  // Выбираем этот ордер среди закрытых и удаленных
m=OrderType();  // Определяем его тип
в переменную "m" записан тип последней торговой операции которую выбрали среди закрытых и удаленных ордеров. Далее сравниваешь "m" в соответствии с https://docs.mql4.com/ru/constants/trading
if(i==0) Print("Последняя операция BUY");
if(i==1) Print("Последняя операция SELL");
Заметь, последняя операция не обязательно будет BUY или SELL. Если выставить отложенный ордер а затем его удалить, то тип последней операции может быть 2, 3, 4 или 5. Можно сделать цикл, в котором выбирать из истории ордер по номеру в списке от HistiryTotal()-1 и до нуля определяя его тип, до того момента, пока не будет найден ордер 0 или 1 (BUY или SELL).

А можно сделать и проще, перед ф-ией start объявить переменную типа int, при открытии ордера записывать в нее тип торговой операции. При открытии следующего ордера перезаписывать тип.
 
А можно сделать и проще, перед ф-ией start объявить переменную типа int, при открытии ордера записывать в нее тип торговой операции. При открытии следующего ордера перезаписывать тип.
А ежели терминал перезапустил.... то это не сработает
 
SK. писал (а):
Для принятия торговых решений предыдущая история не имеет никакого значения.
Ха :)
1. для систем, не допускающих хеджирование, это жизненно необходимо (для случая, если позиции остаются открытыми);
2. при смене позиции на противоположную (по разным причинам).
Скорее всего, есть еще ситуации, когда история важная. Особенно последних операций.
 
rebus писал (а):
SK. писал (а):
Для принятия торговых решений предыдущая история не имеет никакого значения.
Ха :)
1. для систем, не допускающих хеджирование, это жизненно необходимо (для случая, если позиции остаются открытыми);
2. при смене позиции на противоположную (по разным причинам).
Скорее всего, есть еще ситуации, когда история важная. Особенно последних операций.

Могу только повторить: Для принятия торговых решений предыдущая история не имеет никакого значения.

А если система устроена иначе, то это её дело, системы..:)
 
Integer писал (а):
А ежели терминал перезапустил.... то это не сработает

Тогда придется писать в файл, а в нужный момент читать. А как работать с файлами сам толком не разобрался :о)
 
SK. писал (а):
rebus писал (а):
SK. писал (а):
Для принятия торговых решений предыдущая история не имеет никакого значения.
Ха :)
1. для систем, не допускающих хеджирование, это жизненно необходимо (для случая, если позиции остаются открытыми);
2. при смене позиции на противоположную (по разным причинам).
Скорее всего, есть еще ситуации, когда история важная. Особенно последних операций.

Могу только повторить: Для принятия торговых решений предыдущая история не имеет никакого значения.

А если система устроена иначе, то это её дело, системы..:)
Действительно. Если предыдущая история не имеет никакого значения, то это как раз её дело. Системы :)
На самом деле, мир разнообразен и не терпит таких категоричных заявлений. Одну и ту же задачу можно решить, как минимум, двумя решениями. Я раньше почти так же думал (насчет полезности истории торгов), а сейчас вот склоняюсь к тому, что без этого нельзя построить никакой более-менее эффективной системы. Мало того (раскрою часть одной из моих стратегий), анализируя причины закрытия и тип предыдущей позиции, можно так построить систему, что очень даже удается обойтись вовсе без технического анализа :) А уж по компактности торговых правил такая система любой даст сто очков вперед. Скорее всего, и по другим параметрам тоже. Сейчас как раз экспериментирую.
Причина обращения: