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

 
Artyom Trishkin #:

Добро. Попробую по-русски простыми словами.

Вы собрались на рыбалку.

  1. Дома открыли кладовку, почесали затылок и закрыли.
  2. Приехали на рыбалку и вам нужна удочка
  3. Поехали домой в кладовку за удочкой
  4. Приехали на рыбалку, закинули удочку и поймали рыбу, и тут вам потребовался сачок
  5. Поехали домой в кладовку за сачком
  6. Приехали на рыбалку, подцепили сачком пойманную и плавающую на крючке рыбу, и вам потребовалась ёмкость для складывания пойманной рыбы
  7. Поехали домой за ..... Мне продолжать?

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

Знать вы могли об этом здесь на форуме. Просто иногда нужно слушать и слышать что вам говорят.

А то получается, вопрос задали, получили ответ, сказали - фигня, и делаете так как вам кажется.

Сначала нужно вопрос обдумать, поспрашивать, а уже потом браться за редактор.

Вы в курсе, что в программировании самое простое - это печатать код? А львиную долю разработки занимает обдумывание логики.

Какая-то простите нелепая аналогия. В таком случае давайте будем все переменные, объекты классов и т.д. делать глобальными, а не создавать по мере необходимости или может граф. объект это что-то другое (уж точно не удочка или сачок :)) ? Так что мой подход вполне рациональный и оправданный, просто mql или метатрейдер лажает.

 
MakarFX #:
Так будет пропускать сигнал

Чего то или туплю, или все таки, нет условия, если есть открытые ордера И есть сигнал, и бар уже новый.

Если сигналы длинные, больше бара кратно, то работать будет и по первому тику бара.

Вопрос только, а когда нужно открывать ордер, в момент появления сигнала, или на первом тике следующего бара.
 
Valeriy Yastremskiy #:

Чего то или туплю, или все таки, нет условия, если есть открытые ордера И есть сигнал, и бар уже новый.

Если сигналы длинные, больше бара кратно, то работать будет и по первому тику бара.

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

Извините, что поднимаю вопрос второй раз. 

но есть проблема. которую пока не могу решить, а именно

открытие серии ордеров (один за другим) на одной свече.

Мне нужно, чтобы советник не мог открыть новый ордер на той же самой свече.

думал решить через Sleep() но Макар сказал что процесс лучше не останавливать.


код сейчас выглядит так:

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

 
законопослушный гражданин #:

В принципе, открытый ордер обычно закрыться на тиках уже открытого бара. MakarFX и Артём правильно заметили. Поэтому, правильно будет сделать так:

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

В принципе, открытый ордер обычно закрыться на тиках уже открытого бара. MakarFX и Артём правильно заметили. Поэтому, правильно будет сделать так:

Прав Артем, надо так

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Прав Артем, надо так

Здесь результат будет тот же. Только код более запутан. Ты пишешь один и тот же код в двух разных функциях.  И это будет менее читабельно. Хотя, каждый пишет как ему удобно или нравится...

 

Чего-то все нагородили.

У открытой позиции есть время её открытия. Время открытия можно сопоставить со временем свечи - узнать входит ли время открытия позиции внутрь свечи (а это текущая свеча)

И для чего постоянно во всех примерах узнаёте количество ордеров? И, если ордеров ноль, то открываете. Это очень сильно ограничивает возможности.

Вообще, привязываться к количеству ордеров/позиций - это только для очень узкого направления стратегий.

 
Mihail Matkovskij #:

Здесь результат будет тот же. Только код более запутан. Ты пишешь один и тот же код в двух разных функциях.  И это будет менее читабельно. Хотя, каждый пишет как ему удобно или нравится...

Твой код

  if (time != cTime && nOrders == 0)
    time = cTime;

(Открылся бар и ордеров нет)

проверили сигнал - сигнала нет

... ждем следующий бар

Ты повторил ту же ошибку, что и прошлый раз

P.S.

это

 time = cTime;
должно выполняться после открытия ордера
 
MakarFX #:

Прав Артем, надо так

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

Но, повторюсь - всё такое сильно ограничивает возможности доработки стратегий.

Нужно уходить от привязки к наличию/отсутствию ордеров (особенно в четвёрке - там за ордера приняты и отложенные ордера (что верно), и позиции (что не правильно)).

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

Вообще, правильно - это иметь в наличии функции для подсчёта ордеров и позиций (одна функция, заполняющая структуру при изменении количества ордеров и позиций), функции открытия/закрытия позиций, функции установки ордеров и сигнальные функции. Функции различных тралов и получения данных от индикаторов. Плюс - уметь сравнивать данные позиции (открытой или закрытой) с какими-либо величинами.

Из этого набора можно составить любую стратегию.

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