Как начать работу с MQL5 - страница 18

 
Ahmad861 :

Я использую несколько символов и таймфреймов через циклы, объявление хэндлов в OnInit не будет работать без циклов

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

 
Ahmad861:

Я использую несколько символов и таймфреймов через циклы, объявление хэндлов в OnInit не будет работать без циклов

Не делайте двойных сообщений!

Я удалил вашу дублирующую тему.

Исправьте свой код, как уже сказал Владимир, и создавайте хэндлы только в OnInit().

Код, который вы пытаетесь сделать, слишком сложен для новичка.

Вы совершаете распространенную ошибку новичков - используете _Point при работе с несколькими символами.

               request.sl = SymbolInfoDouble(sym,SYMBOL_BID) + (StopLoss * _Point);
               request.tp = SymbolInfoDouble(sym,SYMBOL_BID) - (TakeProfit * _Point);

Так, если советник размещает сделку на японском трехзначном символе, а символ графика - пятизначный, очевидно, что TP и SL будут в 100 раз меньше, чем вы ожидаете.

 
Ahmad861:

Будет ли замена _Point на эту функцию работать правильно?

Конечно, нет.

Если _Point неверна для неграфического символа, то и _Digits не будет правильной.

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

 
Ahmad861 :


При написании многосимвольного эксперта следует помнить, что свойства каждого символа могут сильно различаться - начиная от количества символов после нуля и заканчивая ценой.

 
Ahmad861 :

Самый простой пример Multi-symbol Two iMA Simple:

Торговая стратегия

Сама стратегия довольно тривиальна - это пересечение двух iMA (Moving Average, MA). Но реализация заслуживает отдельного описания. Это многосимвольный советник, который торгует сразу двумя символами. Выполняется в виде одного файла. Весь торговый код находится в классе 'CTradingEngine31 ' , главный советник в блоке инициализации создает два экземпляра советников - один для символа 'Symbol 0 ' и один для символа 'Symbol 1 ' . После этого главному советнику необходимо вызвать OnTick и OnTradeTransaction в обоих экземплярах.

Сам советник максимально упрощен: нет ни стоп-лосса, ни тейп-профита, ни трейлинга. Появление любого торгового сигнала означает сначала безусловное закрытие позиции и немедленное открытие новой. Поиск сигнала осуществляется только в момент рождения нового бара, то есть пересечение ищется на баре № 1, а не на текущем. Объем позиции ("Количество минимальных лотов " ) устанавливается как количество минимальных лотов.

Торговые сигналы:

  • Открыть BUY: пересечение индикаторов 'Fast' и 'Slow' снизу вверх
  • Открыть SELL: пересечение индикаторов 'Fast' и 'Slow' сверху вниз.

Особенности:

  • Советник может быть оптимизирован под 'Рабочий таймфрейм ' .
  • На одном баре может быть только одна сделка "вход в рынок".

Теперь более подробно о каждой группе параметров:

Торговые настройки:

'Рабочий таймфрейм ' - Рабочий таймфрейм. Таймфрейм, на котором создаются индикаторы и на котором происходит поиск нового бара.

Управление размером позиции (расчет лота)

Лотзадается как количество минимальных лотов.

Дополнительные функции:

'Печать журнала' печать расширенного журнала всех операций. Параметр'Freeze и StopsLevels Coefficient' зада ет коэффициент для уровней стопа и заморозки для случаев, когда эти уровни для символа равны нулю. Рекомендуемое значение - '3'.

 

Здравствуйте, Владимир.

Спасибо за ваш труд.

Я пытаюсь вернуть этот MQL4 код в MQL5. С помощью этого кода я получаю цену открытия последней текущей позиции.

double open_price(int t)
  {
   double OpenPrice=0;
   if(OrderSelect(OrdersTotal()-t,SELECT_BY_POS,MODE_TIME))
     {
      OpenPrice=OrderOpenPrice();
     }
   return(OpenPrice);
  }
Я написал этот код на MQL5 и, к сожалению, он не работает.
double open_price(int t)
  {
   double OpenPrice=0;
   datetime last_pos_time=0;
   double   last_pos_price;
   double   last_pos_lot;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(m_position.SelectByIndex(PositionsTotal()-t))
        {
         if(m_position.Time()>last_pos_time)
           {
            last_pos_time  = m_position.Time();
            last_pos_price = m_position.PriceOpen();
            last_pos_lot   = m_position.Volume();
            OpenPrice = m_position.PriceOpen();
           }
        }
     }
   return(OpenPrice);
  }
Можете ли вы мне помочь?
Documentation on MQL5: Constants, Enumerations and Structures / Indicator Constants / Price Constants
Documentation on MQL5: Constants, Enumerations and Structures / Indicator Constants / Price Constants
  • www.mql5.com
Price Constants - Indicator Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
RZAMK :

Здравствуйте Владимир.

Спасибо за ваши труды.

Я пытаюсь вернуть этот MQL4 код в MQL5. С помощью этого кода я получаю цену открытия последних позиций.

Я написал этот код на MQL5 и, к сожалению, он не работает. Можете ли вы мне помочь?

Мне очень нравится работать с OnTradeTransaction. Именно здесь я получаю всю необходимую информацию о последней сделке.

 
Vladimir Karputov:

Мне нравится работать с OnTradeTransaction. Именно здесь я получаю всю необходимую информацию о последней сделке.

Как я могу использовать OnTradeTransaction для получения OpenPrice последней текущей позиции?
 
RZAMK :
Как я могу использовать OnTradeTransaction для перехвата OpenPrice последней текущей позиции?

Пример:

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      ResetLastError();
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ","HistoryDealSelect(",trans.deal,") error: ",GetLastError());
         return;
        }
      if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic)
        {
         if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry()==DEAL_ENTRY_IN)
              {
               Print(m_deal.Price());
              }
           }
        }
     }
  }
 
Vladimir Karputov:

Пример:

Спасибо.

Но вы приводили этот код на предыдущих страницах.

Возможно, я не до конца объяснил, что я имел в виду. Яне ищу в истории закрытые позиции.

Я хочу найти цену открытия последней позиции, которая все еще открыта, и взять другую позицию или позиции в соответствии с ее ценой.