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

 
Alexey Kozitsyn:
Если предположить, что последний ордер по времени - не последний в списке, то Ваш пример не корректен потому, что не учитывает самый первый ордер (№0).

Сначала находится тикет последнего ордера по времени, а затем делается цикл с модификациями. При встрече в цикле ранее найденного тикета последнего ордера, он пропускается.

Для поиска тикета последнего ордера не нужно гонять всю историю всех ордеров - можно задать размер искомой истории - день, два, три, неделя... "по месту" короче, и пропускать все ордера со временем, которое раньше диапазона поиска. Например: задан размер истории поиска 1 день - все ордера, которые были по времени раньше, чем текущее время-один день, пропускаются. Но цикл всё же нужен. Так как если брать только последний в списке, то он может быть Buy, а нам нужен Sell. А он предпоследний. Таким образом его данные мы уже не получим.

 
Artyom Trishkin:

Сначала находится тикет последнего ордера по времени, а затем делается цикл с модификациями. При встрече в цикле ранее найденного тикета последнего ордера, он пропускается.

Для поиска тикета последнего ордера не нужно гонять всю историю всех ордеров - можно задать размер искомой истории - день, два, три, неделя... "по месту" короче, и пропускать все ордера со временем, которое раньше диапазона поиска. Например: задан размер истории поиска 1 день - все ордера, которые были по времени раньше, чем текущее время-один день, пропускаются. Но цикл всё же нужен. Так как если брать только последний в списке, то он может быть Buy, а нам нужен Sell. А он предпоследний. Таким образом его данные мы уже не получим.

Артем, спасибо за объяснения конечно, но я знаю как найти ордер в списке. И мой ответ был не Вам, а Алексею на его пример (в частности на то, что условие "> 0" не пойдет).

Вы бы лучше mila.com написали, как правильно (только с кодом). Мне - лень :)

 
Alexey Kozitsyn:
Если предположить, что последний ордер по времени - не последний в списке, то Ваш пример не корректен потому, что не учитывает самый первый ордер (№0).

Ну как-же не учитывает?

Alexey Viktorov:

Доп. вариант: Перед циклом в переменную _1 записать тикет, например нулевого ордера, а потом

/********************Script program start function********************/
void OnStart()
{
  int i, t1, t2, modTicket , total = OrdersTotal();
   datetime d1, d2;
    if(OrderSelect(0, SELECT_BY_POS))
     {
      t1 = OrderTicket();
       d1 = OrderOpenTime();
     }    
    for(i = 1; i < total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        t2 = OrderTicket();
         d2 = OrderOpenTime();
          modOrder((d1 < d2) ? t1 : t2);
         t1 = d1 < d2 ? t2 : t1;
        d1 = d1 < d2 ? t2 : t1;
       }
     }
}/********************************************************************/

void modOrder(int ticket);
{
// здесь код модификации ордера.
}/********************************************************************/
Надеюсь больше ничего не напутал. опять ведь не проверял...
 
Alexey Viktorov:

Ну как-же не учитывает?

/********************Script program start function********************/
void OnStart()
{
  int i, t1, t2, modTicket , total = OrdersTotal();
   datetime d1, d2;
    if(OrderSelect(0, SELECT_BY_POS))
     {
      t1 = OrderTicket();
       d1 = OrderOpenTime();
     }    
    for(i = 1; i < total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        t2 = OrderTicket();
         d2 = OrderOpenTime();
          modOrder((d1 < d2) ? t1 : t2);
         t1 = d1 < d2 ? t2 : t1;
        d1 = d1 < d2 ? t2 : t1;
       }
     }
}/********************************************************************/

void modOrder(int ticket);
{
// здесь код модификации ордера.
}/********************************************************************/
Надеюсь больше ничего не напутал. опять ведь не проверял...
Если возьмете как стартовый - то пойдет, но перебор лучше делать с конца... хотя, если без удаления ордеров, то тоже норм.
 
Alexey Kozitsyn:
Если возьмете как стартовый - то пойдет, но перебор лучше делать с конца... хотя, если без удаления ордеров, то тоже норм.

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

А направление цикла ... да совсем не важно, это ведь не закрытие ордеров. В предыдущем варианте я попутал и написал закрытие, так там и цикл был соответствующим...

 

Доброе время суток!

Пробую себя в написании индикатора. Вроде бы, что я хотел получить - получил, визуально, но хочется чтоб индикатор передавал нужную информацию информацию, например текстовую, ну или типа int. Подскажите, как это сделать учитывая, что у меня 10 буферов по которым строятся линии? Спасибо!

 

Добрый день ! Сильно не пинайте, но нашел эту рубрику и решил задать несколько вопросов ..у меня по терминалу ..cкачал у одного брокера МТ4 (1) .. гонял демо ...через какое-то время зарегился у другого ,тоже 

предложили скачать терминал ..скачал (2) в итоге 2 терминал не идет ..а в  1  появился профиль 2 брокера ..вообщем весь запутался ..тут от binary приходит письмо ,что они переходят на МТ5 ..установил и на первый взгляд все намного лучше сделано чем на МТ4 .. Вопрос возможно ли открывать счета разных брокеров на одном терминале?  и могу ли я всех их перенести на МТ5 ?  и еще подходят ли индикаторы от МТ4 к 5?

 спасибо ...

 

Такая активная помощь, Спасибо Большое.

Уже с новой задачкой бьюсь)

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

Пыталась запомнить в переменную цену первой вершины, потом сравнивать, если цена изменилась поднять флаг, есть новая вершина.
if(newZZH1_PR!=GetExtremumZZPrice(Symbol(),T_F_,1))
{
   newZZH1_PR=GetExtremumZZPrice(Symbol(),T_F_,1);
   newZZH1=true;
}

Но оказалось, что функция, с течением времени, возвращает хаотично, то цену первой вершины, то второй.

 Получается, новая вершина не сформирована, а флаг поднят.
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0)
{

  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
В идеале нужно подправить функцию, чтобы она всегда возвращала цену первой вершины, но буду рада любому решению.
 
mila.com:

Такая активная помощь, Спасибо Большое.

Уже с новой задачкой бьюсь)

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

Пыталась запомнить в переменную цену первой вершины, потом сравнивать, если цена изменилась поднять флаг, есть новая вершина.
if(newZZH1_PR!=GetExtremumZZPrice(Symbol(),T_F_,1))
{
   newZZH1_PR=GetExtremumZZPrice(Symbol(),T_F_,1);
   newZZH1=true;
}

Но оказалось, что функция, с течением времени, возвращает хаотично, то цену первой вершины, то второй.

 Получается, новая вершина не сформирована, а флаг поднят.
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0)
{

  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
В идеале нужно подправить функцию, чтобы она всегда возвращала цену первой вершины, но буду рада любому решению.

У зигзага на самом деле три буфера - 0 общий, 1 - верхний экстремум, 2 - нижний

На нулевом баре всегда в каком-то из буферов есть значение - либо в первом (если колено направлено вверх), либо во втором (если вниз). Соответственно, в нулевом буфере на текущей свече всегда есть значение - либо от первого буфера, либо от второго.

Ну и, чтобы найти однозначно верхний закрепившийся экстремум, нужно искать первое не пустое значение первого буфера, начиная от бара 1. Для нижнего экстремума нужно найти первое не пустое значение второго буфера, начиная с бара 1.

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

Сумбурно, но, надеюсь, поймёте...

 
Есть два терминала МТ5. Задача: можно ли написать скрипты, чтобы в одном терминале были разрешены только лонговые сделки, а в другом - только шортовые?  
Причина обращения: