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

 

Здравствуйте,

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

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

m_trade - это объект Ctrade.

// Current position information

bool Buy_openend = false;
bool Sell_openend = false;

double currentVolume = 0;

if(PositionSelect(_Symbol) == true)
  {
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      Buy_openend = true;
     }
      if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
     {
      Sell_openend = true;
      }   
        currentVolume = PositionGetDouble(POSITION_VOLUME);   
  } 

// Check for trade conditions

bool SellCondition = close <= closeprev && bar[1].time == startTime;
bool BuyCondition = close >= closeprev && bar[1].time == startTime;


// Entering trade

if(SellCondition)
  {
   if(Sell_openend)
   {
   Print("We already have a sell open");
   return;
   }
   m_trade.Sell(TradeVolume+currentVolume,_Symbol,m_symbol.Ask(),NULL,NULL,NULL);
  }
if(BuyCondition)
  {
   if(Buy_openend)
     {
      Print("We already have a buy open");
   return;
     }
     m_trade.Buy(TradeVolume+currentVolume,_Symbol,m_symbol.Bid(),NULL,NULL,NULL);
  }
 
Divania111 объект Ctrade.

Вы забыли, что время 'startTime' должно быть сброшено.

 
Vladimir Karputov #:

Вы забыли, что время 'startTime' должно быть сброшено.

Спасибо, Владимир, я постараюсь исправить это, основываясь на вашей подсказке.

Тем не менее, я все еще удивлен. Потому что в операторе if для входа в сделку мы проверяем наличие существующего размещения ордера того же типа. Если это так, то ордер не должен быть размещен. Поэтому я подумал, что с помощью этого оператора можно одновременно ввести только 1 тип ордера.

Является ли эта мысль неверной?

 
Divania111 # :

Спасибо, Владимир, я попробую исправить это, основываясь на вашей подсказке.

Тем не менее, я все еще удивлен. Потому что в операторе if для входа в сделку мы проверяем наличие существующего размещения ордера того же типа. Если это так, то ордер не должен быть размещен. Поэтому я подумал, что с помощью этого оператора можно одновременно ввести только 1 тип ордера.

Является ли эта мысль неверной?

Вы никак не контролируете ОРДЕРЫ, вы проверяете номер и тип ПОЗИЦИИ в коде. Кроме того - вы неправильно работаете с ПОЗИЦИЯМИ (ошибка в использовании 'PositionSelect(_Symbol)', если тип вашего счета - хеджирование). В вашем алгоритме есть серьезные ошибки проектирования.

Что вы должны сделать:

1. Работать ИСКЛЮЧИТЕЛЬНО в момент рождения нового бара. Если нового бара нет - ничего не делайте, не совершайте лишних движений.

2. Этот пункт будет раскрыт после выполнения пункта 1.

 
Здравствуйте. Не подскажите Comment в void OnTick() может замедлять работу советника. Поставил в int OnInit() намного быстрее работает.
 
Marco Nicholas #:
Здравствуйте. Не подскажите Comment в void OnTick() может замедлять работу советника. Поставил в int OnInit() намного быстрее работает.

Да, в МТ5 он значительно замедляет работу.

В OnInit он отрабатывает только 1 раз при инициализации и больше не работает.

 
Marco Nicholas комментарий в void OnTick() замедлять работу советника. Поместил его в int OnInit() работает намного быстрее.

Вы говорите о функции Comment()?

Если да, то это очевидно. В OnInit() комментарий будет обновляться только один раз, а в OnTick() комментарий может обновляться при каждом тике.

Решение состоит в том, чтобы обновлять комментарий только тогда, когда это необходимо. Если он статический, то обновлять его только в OnInit() и очищать в OnDeinit(), а если динамический, то в OnTick() обновлять комментарий только тогда, когда его нужно изменить.

EDIT: Это сообщение было первоначально сделано на английском форуме.

 
Здравствуйте преподаватели, когда я использую функцию SocketConnect() на стороне клиента , я не могу установить соединение с сервером даже после правильного заполнения параметров в соответствии с инструкцией пользователя, но после тестирования сервер нормально доступен.
 

 всем доброго времени суток.

у меня вопрос

как составить запрос к sqlite что выбрать строку по тикету.

структура бд такая:

symbol-text

ticket - text

pirce- real

s_l - real

t_p - real

нужно получить всю строку по ticket в структуру

 
Здравствуйте, подскажите в switch() можно Comment() использовать, вместо того же Print.
Причина обращения: