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

 
Всем доброго времени суток.
Я написал на mql4 простой код, который на минутном графике  открывает ордер каждый раз когда цена поднимается на 30 пунктов от ближайшего локального минимума. После открытия ордера локальным минимумом становится цена открытия ордера.
void OnTick()
{
if (Bid<LoU)
LoU=Bid;
//********************
if (Bid-LoU>=0.0030&&Pr!=LoU)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,0,0,"300",0);
Pr=LoU;
LoU=Bid;
}
}

Что меня не устраивает в моем коде..... То что он должен исполняться почти на каждом тике. Я могу усовершенствовать этот код и он будет исполняться не на каждом тике, а почти на каждой минутной свече. То есть, что бы найти точку открытия ордера программе приходится проделать огромный объем работ.

ВОПРОС

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

Спасибо за помощь.

 
ANDREY:
Всем доброго времени суток.
Я написал на mql4 простой код, который на минутном графике  открывает ордер каждый раз когда цена поднимается на 30 пунктов от ближайшего локального минимума. После открытия ордера локальным минимумом становится цена открытия ордера.

Что меня не устраивает в моем коде..... То что он должен исполняться почти на каждом тике. Я могу усовершенствовать этот код и он будет исполняться не на каждом тике, а почти на каждой минутной свече. То есть, что бы найти точку открытия ордера программе приходится проделать огромный объем работ.

ВОПРОС

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

Спасибо за помощь.

//+------------------------------------------------------------------+
int OnInit()
  {
   LoU=Bid;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if ((Bid+30*Point)<=LoU)
     {
      if(OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,0,0,"300",0)) LoU=Bid;
     }
  }
 
MakarFX:

Спасибо за помощь.

Но результат работы кода не совпадает с моим. Вот результат работы моего кода на паре GBPUSD на минутном графике за один день с 04.01.2010 по  05.01.2010.
Вот результат работы моего кода

А это результат работы Вашего кода

 
ANDREY:

Спасибо за помощь.

Но результат работы кода не совпадает с моим. Вот результат работы моего кода на паре GBPUSD на минутном графике за один день с 04.01.2010 по  05.01.2010.
Вот результат работы моего кода

А это результат работы Вашего кода

Код OnInit() покажи

 
MakarFX:

Код OnInit() покажи

double LoU;
int OnInit()
  {
   LoU=Bid;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if ((Bid+30*Point)<=LoU)
     {
     
      if(OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,0,0,"300",0)) LoU=Bid;
     }
  }

Я просто скопировал твой в код в Метаэдитор и получился результат , который выше.

Твой код открывает ордер  и отсчитывает 30 пп  сверху вниз (желтый), а мой , снизу вверх ( голубой)

Спасибо за помощь

 
ANDREY:

Я просто скопировал твой в код в Метаэдитор и получился результат , который выше.

Спасибо за помощь

Мне нужен твой код,чтобы понять в чем суть.

В твоем коде LoU меняется на каждом тике если цена идет вниз, а моем LoU меняется только после открытия сделки.

 
MakarFX:

Мне нужен твой код,чтобы понять в чем суть.

В твоем коде LoU меняется на каждом тике если цена идет вниз, а моем LoU меняется только после открытия сделки.

У тебя не с той стороны отсчитывается 30 пп. Я дополнил картинкой предыдущий пост
А мой код в первом посте.  Как только цена прошла 30 пп от локального минимум *снизу - вверх* - открыть ордер. И мой код открывает ордера точна так как мне нужно. Но я хочу что она тратил на это минимум времени.

Согласен в моем коде  LoU после открытия каждого ордера меняется на каждом тике. А без этого программа не найдет ближайший локальный минимум, от которого нужно отсчитывать 30 пп.. Вот я думаю как сделать так что бы  LoU не менялась на каждом тике или на каждой минутной свече, но что бы ордера при этом открывались в тех же местах где их открывает мой код.
 
ANDREY:

Я просто скопировал твой в код в Метаэдитор и получился результат , который выше.

Твой код открывает ордер  и отсчитывает 30 пп  сверху вниз (желтый), а мой , снизу вверх ( голубой)

Спасибо за помощь

Моя ошибка...замени

double LoU;
int OnInit()
  {
   LoU=Bid;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if ((Bid-30*Point)>=LoU)
     {
     
      if(OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,0,0,"300",0)) LoU=Bid;
     }
  }
 
MakarFX:

Моя ошибка...замени

Спасибо за помощь.
Заменил. Открывает огромное количество ордеров(27657 ордеров), среди которых есть и те что мне нужны

Вот скрин начальных ордеров

 
MakarFX:

Моя ошибка...замени

Вот твой код с измененной строкой. 

double LoU;
int OnInit()
  {
   LoU=Bid;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if ((Bid+30*Point)>=LoU)
     {
     
      if(OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,0,0,"300",0)) LoU=Bid;
     }
  }
Как сделать так что бы код открывал только нужный ордера?
Причина обращения: