[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 333

 
Здравствуйте уважаемые программисты!

Возникла необходимость в следующем анализе - программа должна анализировать заданные ей параметры и выдавать результата в отдельном окне в виде таблицы с набором дат. Т.е. прога должна анализировать историю и выдавать необходимые даты.

Возможно ли такое на MQL4 или лучше сделать экспорт истории и анализировать данные при помощи программы написанной на другом языке?

Заранее спасибо!
 
GygaByte:


Правильно, но как показала практика - не всегда..

 Если пятый знак после запятой = 5 (1.хххх5), то значение все равно искажается:

 

вопрос пока остается актуальным...

P.S. Вообще мне нужно MagicNumber присвоить значение цены... а тип MagicNumber - int, вот и пытаюсь преобразовать путем

 Может кто еще посоветует?

Спасибо. 

Вы же выводите с разным округлением - поэтому не видите полное число - и думаете что что-то искажается. По умолчанию при выводе действительных чисел округление выводимого числа идёт до 4-го знака. При 5-ти знаке надо округлять выводимое явно:

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

 Посмотрите на своей же картинке - вывод bid без  DoubleToStr() и с  DoubleToStr().

 
hoz:

Артём и Борис, Благодарю Вас за то, что Вы "разжевали" мне мой вопрос. У меня бывают периоды, когда я могу заглючить на довольно-простых вещах, как было в этот раз..

 

Щяс появился новый вопрос.

 Я тут накидал функцию, добавил к функции расчёта количества открытых ордеров t, поиск ордеров заданного типа с заданных профитов и сравнение их профита с некоторых заданным значением(на данный момент 0). Дальше, если  открытых ордеров нет, то через параметры функции FindOrders() возвращаются 2 флага со значение True, что значит можно послать ордер, а если ордера есть, проверяется профит, чтоб значение профита было больше заданного значения, если профит меньше заданного значения, то через параметры функции FindOrders() возвращаются 2 флага со значение False, чтоб когда в каком-н. направлении есть убыточные ордера, то не было доливок в убыточную сторону.

 Ну после, я вызываю функцию FindOrders() в сигнальной функции:

 

 Ордера переставили вообще открываться. Логика вроде верная. Может видно, на вскидку, где я ошибся?

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

Виктор, я не могу понять до конца твой алгоритм, но могу посоветовать! Такое тоже у меня случается, когда в логике ошибка. Программа стопорится, если окажется двузначность или взаимоисключаемость в твоих условиях. Может быть, тебе понятно, что хочешь, а не можешь корректно построить логику кода. Ищи эти глюки, последовательно расписав на бумаге со стрелочками для наглядности весь тобой задуманный порядок выполнения условий! Удачи!
 
borilunad:
Виктор, я не могу понять до конца твой алгоритм, но могу посоветовать! Такое тоже у меня случается, когда в логике ошибка. Программа стопорится, если окажется двузначность или взаимоисключаемость в твоих условиях. Может быть, тебе понятно, что хочешь, а не можешь корректно построить логику кода. Ищи эти глюки, последовательно расписав на бумаге со стрелочками для наглядности весь тобой задуманный порядок выполнения условий! Удачи!


Так там всё просто в логике. Нужно, чтоб если нет ордеров открытых, то ордера открывались по сигналу.

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

Один логический косяк я нашёл. Вот что вышло:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

 Сейчас на продажу ордера открываются на всидку верно, а лонги вообще не открываются. Хотя флаг имеет значение обоих переменные 1 т.е. true.

 

  У меня такая непонятка с мт4 образовалось..

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

 Как вернуть запуск мт4.ехе без этого окна? Может кто знает или понял в чем дело..

 

Добрый день, столкнулся с необходимостью быстро отменить все отложенные ордера. OrderClose отложки игнорирует. Какой оператор удобнее использовать, и есть ли эта возможность? 

 
Notter:

Добрый день, столкнулся с необходимостью быстро отменить все отложенные ордера. OrderClose отложки игнорирует. Какой оператор удобнее использовать, и есть ли эта возможность? 


 Закрыть можно только рыночные ордера, а чтоб удалить отложки нужен оператор OrderDelete.
 

hoz

 

Спасибо! 

 
hoz:


Так там всё просто в логике. Нужно, чтоб если нет ордеров открытых, то ордера открывались по сигналу.

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

Один логический косяк я нашёл. Вот что вышло:

 Сейчас на продажу ордера открываются на всидку верно, а лонги вообще не открываются. Хотя флаг имеет значение обоих переменные 1 т.е. true.

Виктор, сделай проверку! Закомментировав лонг-бай, посмотри в журнале, как работает шорт-селл! И наоборот, тогда увидишь, в чём разница, и найдёшь, почему не работает!
 
borilunad:
Виктор, сделай проверку! Закомментировав лонг-бай, посмотри в журнале, как работает шорт-селл! И наоборот, тогда увидишь, в чём разница, и найдёшь, почему не работает!


 Борис, если закоментировать одно из условий в функции int GetGeneralSignal(), открытие чёткое.

Я отследил. Флаг не изменяет своё значение, когда профитность текущих открытых ордеров в минусе. Вот переписанная функция, которая должно перевести значение флагов short и long в false т.е. запрет на открытие позиции если есть минусовые ордера:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

 Вызывающая функция вот:

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}
Причина обращения: