Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 471

 
Vadim Novikov:

Добрый  день  всем  неравнодушным !!!


Я    продвинутый  пользователь.    Но  пишу  не  так  часто.  Потому.  За некоторыми    новшествами  не   поспеваю.  А  иногда  просто  забываю  кое-что. 


 Прошу  помочь  в  одном  вопросе.   Не  могу  вспомнить  один  момент.  


Ситуация  такая.  Вот  я  задал  extern   переменные.   Задал  много  таких  переменных.  20  переменных.   Они  отображаются  в  входном  меню  программы,  когда  ты   эту  программу    прикрепляешь  к  графику.  


Вопрос  такой.  Не  как  не  могу  вспомнить.   Как  разделить   блоки  таких  переменных  комментариями?  Чтоб  так  было.  В  входном  меню.  К  примеру:


Это  блок  по  изменению   переменных   MA (комментарий)

Период  МА

Метод  задания  МА

Цена  МА  

Это  блок  по  изменению  переменных   MACD (комментарий)

..........................

...........................

...........................

Это  блок  по  изменению  переменных  BB (комментарий)

.........................

..............................

...........................


Вроде  раньше    я  такие  комментарии  вводил    функцией   комментарий  к  коду.  То  есть  прописывал  //  или  /* */.  Но  сейчас  что-то  не  выходит.  

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Как то так

 
OrderStopLoss() выводит два знака после запятой.
Можно ли принудить его выводить три знака?
 
Alekseu Fedotov:

Как то так

Спасибо.  Вспомнил!!!

 
Igor Golieniev:

Попробуйте так:

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Это для показа всех значащих цифр котировки. Если же нужно какое-то другое количество знаков, то Digits() замените на конкретное число.

 
Добрый вечер, подскажите пожалуйста. В OnInit функция создает две горизонтальные линии, в OnTick две функии, одна отправляет push и mail уведомление если Bid > первой линии, вторая если Bid < второй линии. Bid=линия не стал делать, что бы исключить гэп. Естественно тут же столкнулся с тем, что если условие выполняется, то уведомление приходит с каждым тиком, что плохо. Как решить эту проблему? В настройках стандартного алерта можно выставить таймаут или задать количество уведомлений, а как это сделать в советнике?
 
Ihor Herasko:

Попробуйте так:

Это для показа всех значащих цифр котировки. Если же нужно какое-то другое количество знаков, то Digits() замените на конкретное число.

Теперь выводит в Print правильно 15,155 , однако - invalid stoploss for OrderModify function

Эта проблема только с Silver в OrderModify

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Теперь выводит в Print правильно 15,155 , однако - invalid stoploss for OrderModify function

Эта проблема только с Silver в OrderModify

В приведенном коде бросаются в глаза две ошибки:

  1. Отсутствие проверки на минимально допустимый размер стопов (его называют Stop Level).
  2. Неправильное сравнение вещественных чисел.

Для решения первой проблемы нужно получить текущий уровень Stop Level:

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Если fStopLevel оказывается равен нулю и тип счета при этом не ECN, то следует принудительно назначить fStopLevel равным трем спредам.

Перед установкой стопов (как Stop Loss, так и Take Profit) проверить, что новый уровень отстоит от цены закрытия ордера на величину Stop Level и более. Для проверки стопа ордера Buy это делается так:

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Для стопа ордера Sell:

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


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

 
Ihor Herasko:

В приведенном коде бросаются в глаза две ошибки:

  1. Отсутствие проверки на минимально допустимый размер стопов (его называют Stop Level).
  2. Неправильное сравнение вещественных чисел.

Для решения первой проблемы нужно получить текущий уровень Stop Level:

Если fStopLevel оказывается равен нулю и тип счета при этом не ECN, то следует принудительно назначить fStopLevel равным трем спредам.

Перед установкой стопов (как Stop Loss, так и Take Profit) проверить, что новый уровень отстоит от цены закрытия ордера на величину Stop Level и более. Для проверки стопа ордера Buy это делается так:

Для стопа ордера Sell:


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

Спасибо.

Однако, вопрос не закрылся. OrderModify начинает срабатывать сразу же при открытии ордера. Где ошибка? (повторюсь - на всех(всех) валютах/фьючах работает, на Silver - нет)

 
Igor Golieniev:

Спасибо.

Однако, вопрос не закрылся. OrderModify начинает срабатывать сразу же при открытии ордера. Где ошибка? (повторюсь - на всех(всех) валютах/фьючах работает, на Silver - нет)

1. Директиву 

#property strict

используете ?

2. Это происходит с Buy и Sell или только с Sell

3. Stop Loss при открытии позиции ставится или его тралл должен при возможности поставить и тянуть ?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

Спасибо.

Однако, вопрос не закрылся. OrderModify начинает срабатывать сразу же при открытии ордера. Где ошибка? (повторюсь - на всех(всех) валютах/фьючах работает, на Silver - нет)

Покажите отрывок журнала (если онлайн, то вкладка Эксперты), где видно открытие рыночного ордера и его модификации и укажите, какие значения TrailingStop и TrailingStep использовали.

Причина обращения: