Как же всетаки правильно проверить результат последнего ордера?

 

Здравствуйте.
Вопрос как я вижу из поиска обсуждался множество раз.
Однако как бы я не делала все равно работает либо не верно, либо не так как нужно.

Гляньте пожалуйста одним глазком, в чем ошибка то.
Даже копировала код с готового советника и то не так...

Задача советника проверить был ли последний ордер плюсовым или минусовым (не важно в бай или сел) и выдать число, которое я далее использую.

Комментарии:

1. Код работает отлично, НО проблема в том, что при переходе на следующие сутки, не видит результат последнего ордера.

int GetN1()
  {
   int n1 = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == Symbol1 && (OrderType() == OP_BUY || OrderType() == OP_SELL))
        {
         if(time1 < OrderCloseTime())
           {
            time1 = OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
            profit1 = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
            loss1 = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
            neutral1 = OrderClosePrice() == OrderOpenPrice();
           }

         if(loss1)
           {
            n1 = 2;
           }

         if(profit1)
           {
            n1 = 1;
           }
        }
     }
   return n1;
  }


2. Код скопирован из советника, работает через раз. Т.е. один раз сработает правильно, второй нет....

int GetN1()
{
   int n1 = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == Symbol1 && (OrderType() == OP_BUY || OrderType() == OP_SELL))
      {
         profit1 = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         loss1 = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         neutral1 = OrderClosePrice() == OrderOpenPrice();
         
         if(loss1)
           {
            n1 = 2;
           }

         if(profit1)
           {
            n1 = 1;
           }
        }
     }
   return n1;
  }


Может быть есть еще более простое решение? Так как проверять каким был ордер (бай или селл) нет необходимости.

 

Что-то типа такого:

double GetLastProfit(int eMagic, string eSymbol)
   {
   datetime eTime=0;
   double eProfit=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber()==eMagic && OrderSymbol()==eSymbol && (OrderType()==OP_BUY || OrderType()==OP_SELL))
         {
         if(eTime<OrderCloseTime())
            {
            eTime=OrderCloseTime();
            eProfit=OrderProfit()+OrderSwap()+OrderCommission();
            }
         }
      }
   return(eProfit);
   }

Чтобы было меньше непонятных ошибок изолируйте переменные каждой функции от глобальных переменных. Введите допустим префикс и используйте его для переменных только внутри функций.

Внешние переменные, в том числе и глобальные передавайте через аргументы функции. Будет проще писать.

 

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

Красным прямоугольником я обвёл 2 непонятные мне строки. У меня не получается постичь их логику. Наверно я что-то не знаю.

Переменной profit1 присвоить значение выражения: тип ордера в сравнении с константой Бай...

Судя по логике, скорее всего переменная profit1 - булевая. В таком случае я не понимаю зачем в этих строках знак вопроса и двоеточие? Как вообще словами прочитать первые две строки красного прямоугольника?

 

По поводу Вашего вопроса. Я для себя уже давно ввёл в в свою библиотеку подобные функции, разделив между ними подзадачи. Например, одна функция у меня отыскивает ордер, открытый в истории последним. Если есть такой ордер, она возвращает его тикет. Зная тикет, я могу передать его на вход другой функции, которая возвращает мне нужный параметр ордера из списка тех параметров, которые в терминале доступны.

И вот ещё что, Ваш код не видит ордера на следующий день скорее всего потому, что на вкладке истории торгов у Вас стоит функция, отсортировывающая (отсекающая) вчерашние и более ранние ордера от сегодняшних. Посмотрите, что у Вас тут стоит?

Ну или вот тут:


 
Vitaly Murlenko #:

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

Красным прямоугольником я обвёл 2 непонятные мне строки. У меня не получается постичь их логику. Наверно я что-то не знаю.

Переменной profit1 присвоить значение выражения: тип ордера в сравнении с константой Бай...

Судя по логике, скорее всего переменная profit1 - булевая. В таком случае я не понимаю зачем в этих строках знак вопроса и двоеточие? Как вообще словами прочитать первые две строки красного прямоугольника?

тернарный оператор

"profit1 = Если тип ордера BUY, то профит есть когда цена закрытия выше открытия,иначе (подразумевается что SELL) профит бывает когда закрытие ниже открытия"

и так далее. :-)

а вообще - на скрине плохой код. Очень

 
Vitaly Murlenko #:

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

Красным прямоугольником я обвёл 2 непонятные мне строки. У меня не получается постичь их логику. Наверно я что-то не знаю.

Переменной profit1 присвоить значение выражения: тип ордера в сравнении с константой Бай...

Судя по логике, скорее всего переменная profit1 - булевая. В таком случае я не понимаю зачем в этих строках знак вопроса и двоеточие? Как вообще словами прочитать первые две строки красного прямоугольника?

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

А если на пальца́х, то получается так

int res = а == 7 ? 3 : 9;

Этот код равнозначен такому

if(a == 7)
 res = 3;
else
 res = 9;

И в некоторых случаях такой оператор сокращает код. А в неумелых руках только вредит.

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
Условный оператор ?: - Операторы - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

А я привык к такой записи:

int res = а == 7 ? 3 : 9;

В одной строчке объявил переменную, и присвоил значение по условию. Мало кода и наглядно. Красота!

 

Всё, нашёл: Справочник MQL4  / Основы языка  / Операторы / Условный оператор ?:

Ну и закопали. Я туда и не смотрю, думал, что всё знаю. Тернарный оператор. Обалдеть. Он круто неудобен - читабельность кода от него падает. Попробую освоиться. Возможно надо навык наработать.

 
Vitaly Murlenko #:

Всё, нашёл: Справочник MQL4  / Основы языка  / Операторы / Условный оператор ?:

Ну и закопали. Я туда и не смотрю, думал, что всё знаю. Тренарный оператор. Обалдеть. Он круто неудобен - читабельность кода от него падает. Попробую освоиться. Возможно надо навык наработать.

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

 
Alexey Viktorov #:

А в неумелых руках только вредит.

В неумелых руках многое вредит.
 
Aleksei Stepanenko #:

А я привык к такой записи:

int res = а == 7 ? 3 : 9;
А я к такой:
int res = (а == 7) ? 3
: 9
   ;
Визуально отделены друг от друга и условие и варианты.
Причина обращения: