Сбор информации по 3 парам

 

Здравствуйте.
Прошу небольшой помощи в решении новой задачи.
Пишу советник для Бинарных опционов. Все функции типовые, но при усложнении не могу понять какая должна быть логика.
Задача такая: 1 советник одновременно следит за 3 парами.
И одновременно (по мере возможности) открывает сделки. Т.е. началась новая пятиминутка (новая свеча) и на 3 парах открылись сделки.
Ждем закрытия и проверяем результаты.
Если на всех 3 парах плюс, начинаем сначала т.е. ставка № 1 (из настроек)
Если есть хоть 1 минус выясняем сумму последней ставки (обычно для Бинарных опционов это лот) и эту сумму умножаем на 1.5


Я делаю так:

у меня 3 блока каждый из которых определяет результат последней сделки таким образом:

int GetN3()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == Symbol3 && (OrderType() == OP_BUY || OrderType() == OP_SELL))
        {


         if(time3 < OrderCloseTime())
           {
            time3 = OrderCloseTime();
            profit3 = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
            loss3 = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
            neutral3 = OrderClosePrice() == OrderOpenPrice();
           }


         if(loss3)
           {
            n=2;
           }

         if(profit3)
           {
            n=1;
           }
        }
     }
   return n3;
  }

Далее я планировала получить размер последней ставки:

double Get_Stavka()
  {
   int n = 0;
   double Stavka;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == Symbol3 && (OrderType() == OP_BUY || OrderType() == OP_SELL))
        {
         if(time4 < OrderCloseTime())
           {
            time4 = OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
            Stavka = OrderLots();
           }

        }
     }
   return Stavka;
  }

И после этого проверить результативность по 3 последним ордерам.

if((GetN1() == 1) && (GetN2() == 1) && (GetN2() == 1))
           {
            volume = StartLot;
           }

Или если был минус расчитать следующую ставку (лот):

if((GetN1() == 1) && (GetN2() == 1) && (GetN2() == 1))
           {
            volume = StartLot;
           }
         else
           {
            volume = Get_Stavka() * 1.5;
           }

Написала. Но мне кажется, я все слишком сложно делаю.


Подскажите как бы вы это реализовали?
Или может есть более простые решения.
Проверить результат по 3 парам, если минус последную ставку * 1.5

 

Наличие лося — это факт (и функция) типа bool (true или false). При нахождении одного можно возвращать true и дальше не проверять.

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

bool IsThereAMoose () {
  for(int i = OrdersHistoryTotal() - 1; i >= 0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && проверка_мэджика && проверка_времени) {
      if (проверка_на_лося) {
        // если один лось нашелся, другого можно уже не искать
        return(true);
      }
    }
  }
  // сюда мы попадем, если переберем сделки и лося не найдем
  return(false);
}

Как-то так. (Я давно на четверке уже не пишу, поэетому только общую картину могу предъявить)

Потом

if(!IsThereAMoose())
  {
    volume = StartLot;
  }
else
  {
    volume = Get_Stavka() * 1.5;
  }
 
Haruto Rat #:

Наличие лося — это факт (и функция) типа bool (true или false). При нахождении одного можно возвращать true и дальше не проверять.

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

Как-то так. (Я давно на четверке уже не пишу, поэетому только общую картину могу предъявить)

Потом

Спасибо, действительно верное решение Вы предложили. Спасибо.
Ничего страшного, что без кода, самое главное ход мыслей я поняла.
Только вот небольшая сложность, мне нужно проверить на наличие "лося" в 3 последних ордерах.
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
здесь как-то нужно указать что нужно проверить только крайние 3 ордера?