Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1226

 
Alexey Belyakov:


Такой вариант тоже не прокатил.

До чего-же барабашка любит километровые коды…

Ваша проблема решается в ШЕСТЬ строк кода, с учётом объявления переменных.

/************************Expert tick function************************/
void OnTick()
 {
  bool signal = true;
  datetime timeBar = iTime(_Symbol, PERIOD_CURRENT, 0);// период можно поставить по своему усмотрению
  datetime static timeOpen = 0;
  if(timeBar > timeOpen)
   {
    if(signal)
     {
      // открыть позицию
      timeOpen = timeBar;
     }
   }
 }/******************************************************************/

Надеюсь с переменной signal разберётесь.

 

О! Заработало! Спасибо, товарищи за идеи!

Правда пришлось подшаманить чуть-чуть. Ещё проще даже получилось, без (true). Правда объяснить не смогу эту хитро-запутанную логику MQL.)

Вот так внедрил:

datetime timeBar = iTime(_Symbol,PERIOD_CURRENT, 0);// период можно поставить по своему усмотрению
datetime static timeOpen = 0;

if((PositionsTotal()==0)&&(c0>h1)&&(rGENUP>0.30)&&(timeBar > timeOpen))    // Условие для открытия позиции.
     {
      MqlTradeRequest request;
      MqlTradeResult  result;
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_BUY;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Ask-50*_Point,_Digits);
      request.tp    = NormalizeDouble(Ask+50*_Point,_Digits);    

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      //--- информация об операции
      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
      // допустимое отклонение от цены
timeOpen = timeBar;
}
Я вот офигеваю, почему такой большой код в MQL5 для открытия позиции. В отличие от MQL4. В 4-ке одна строчка всего лишь. Тут же...Можно ли сократить? Например убрать обработчик ошибок?


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

О! Заработало! Спасибо, товарищи за идеи!

Правда пришлось подшаманить чуть-чуть. Ещё проще даже получилось, без (true). Правда объяснить не смогу эту хитро-запутанную логику MQL.)

Вот так внедрил:

Я вот офигеваю, почему такой большой код в MQL5 для открытия позиции. В отличие от MQL4. В 4-ке одна строчка всего лишь. Тут же...Можно ли сократить? Например убрать обработчик ошибок?


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

Пример:

//+------------------------------------------------------------------+
//|                                            Only_one_purchase.mq5 |
//+------------------------------------------------------------------+
#property version   "1.003"
#property script_show_inputs
#include <Trade\Trade.mqh>
CTrade         m_trade;          // trading object
//--- input parameters
input ENUM_POSITION_TYPE   InpPositionType   = POSITION_TYPE_BUY; // Position Type
input double               InpVolume         = 0.0;               // Volume
input ulong                m_magic           = 15489;             // magic number
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   m_trade.SetExpertMagicNumber(m_magic);
//--- open a position
   if(InpPositionType==POSITION_TYPE_BUY)
      m_trade.Buy(InpVolume);
   else
      m_trade.Sell(InpVolume);
  }
//+------------------------------------------------------------------+
 
Alexey Belyakov:

О! Заработало! Спасибо, товарищи за идеи!

Правда пришлось подшаманить чуть-чуть. Ещё проще даже получилось, без (true). Правда объяснить не смогу эту хитро-запутанную логику MQL.)

Вот так внедрил:

Я вот офигеваю, почему такой большой код в MQL5 для открытия позиции. В отличие от MQL4. В 4-ке одна строчка всего лишь. Тут же...Можно ли сократить? Например убрать обработчик ошибок?


Так если у вас в условии есть

if((PositionsTotal()==0)&&

то зачем ещё проверки на новый бар? Или есть вариант, что позиция закроется на этом-же баре и надо запретить второе открытие?

 
Alexey Belyakov:

О! Заработало! Спасибо, товарищи за идеи!

Правда пришлось подшаманить чуть-чуть. Ещё проще даже получилось, без (true). Правда объяснить не смогу эту хитро-запутанную логику MQL.)

Вот так внедрил:

Я вот офигеваю, почему такой большой код в MQL5 для открытия позиции. В отличие от MQL4. В 4-ке одна строчка всего лишь. Тут же...Можно ли сократить? Например убрать обработчик ошибок?


Знаете, когда-то давно, когда был MQL4, люди с возмущением говорили, что не дают им более низкоуровневого доступа - чтобы можно было что-то по-своему делать.

Ну вот, дали - теперь к составляющим OrderSend() в MQL4 дали доступ - так сказать развернули в MQL его логику - делайте что просили. Так нет - теперь возмущения, что слишком сложно.

Сложно? Не вопрос - нате вам торговые классы в СБ - практически то же самое, что и в MQL4 стандартные торговые функции.
Считайте, что в MQL4 такие классы - это и есть торговые функции. А в MQL5 - всё с открытым доступом.

Пользуйтесь.

 
Artyom Trishkin:

Знаете, когда-то давно, когда был MQL4, люди с возмущением говорили, что не дают им более низкоуровневого доступа - чтобы можно было что-то по-своему делать.

Ну вот, дали - теперь к составляющим OrderSend() в MQL4 дали доступ - так сказать развернули в MQL его логику - делайте что просили. Так нет - теперь возмущения, что слишком сложно.

Сложно? Не вопрос - нате вам торговые классы в СБ - практически то же самое, что и в MQL4 стандартные торговые функции.
Считайте, что в MQL4 такие классы - это и есть торговые функции. А в MQL5 - всё с открытым доступом.

Пользуйтесь.

Доцент, а Доцент. Ты почему такой злой (сегодня) ©

 
Alexey Viktorov:

Доцент, а Доцент. Ты почему такой злой (сегодня) ©

Давай в прорубь лезь...

 
Alexey Viktorov:

Так если у вас в условии есть

то зачем ещё проверки на новый бар? Или есть вариант, что позиция закроется на этом-же баре и надо запретить второе открытие?

Абсолютно верно - есть вариант, что позиция закроется на этом-же баре.

 

Врезался в новую стену. ) "Стена" называется - безубыток.

Вот на MQL4 реализовывал так: 

(содрал где-то не помню)

int BULevel=30;

   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel*Point)&&OrderOpenPrice()>OrderStopLoss())
            {      
             int p=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-50*Point,OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel*Point)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              p=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+50*Point,OrderTakeProfit(),0,Red);
             }
           } 
         }
       }

//------------------------------------------------------------------+

А вот на 5-рке. Как? 

Смотрел в торговых классах, вроде нигде не зашита. А вещь нужная. Что скажете профи?

 

Как сделать, чтобы на графике не отображались сделки с других графиков?

Только сделки того робота, который стоит на данном графике.