Jump to content
Programmer

Общие вопросы по языку MQL

Recommended Posts

TeLePyZik
В 13.06.2018 в 00:49, cmillion сказал:

 

Ну если уж совсем так просто, то Вам нужно перебирать все ордера

   for (int i=OrdersTotal()-1; i>=0; i--)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        {
                    if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(),0,0,clrWhite))
                     Print ("Ошибка модификации ,безубыток ");
       }

   }

}

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

Спасибо..... просто не умею пользоваться функцией FOR еще с детства осталось не понимание.... только использую готовые решения или заменяю множеством других)))

Все получилось.... еще раз спасибо))

 

По поводу проверки....то не нужно.... я вручную тыкаю - так что я знаю что можно установить))) иначе не стал бы тыкать в кнопку))

 

еще раз спасибо....

Edited by TeLePyZik

Share this post


Link to post
Share on other sites
ZeleBoba

Столкнулся со следующей проблемой при использовании функции OrderSelect(...):

для открытого ордера при выборе по тикету функция возвращает успех как в MODE_TRADES,  так и в MODE_HISTORY.

то же самое для закрытого ордера также возвращает успех в обоих случаях.

 

Test (script).mq4

журнал.txt

 

может кто сталкивался, или выскажет свои замечания/соображения.

Надо в истории искать закрытый ордер по тикету.

Edited by ZeleBoba

Лучше маленький профит, чем большие рога.

Share this post


Link to post
Share on other sites
AntFX
7 часов назад, ZeleBoba сказал:

Надо в истории искать закрытый ордер по тикету.

OrderCloseTime()>0 только у ордеров в истории.


1

Share this post


Link to post
Share on other sites
ZeleBoba
12 минут назад, AntFX сказал:

OrderCloseTime()>0 только у ордеров в истории.

Спасибо.


Лучше маленький профит, чем большие рога.

Share this post


Link to post
Share on other sites
torgf
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<4) return(0);

   int limit=rates_total-prev_calculated;
   if(limit>0) 
     {
      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);
      limit=rates_total-2;

     }
///*
   for(int i=limit; i>0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

Здравствуйте. Как ограничить историю 300 бароа? Чтобы индикатор не пересчитывал их на каждом тике. Если вместо limit поставить 300, то грузит терминал.

Share this post


Link to post
Share on other sites
Ugar68

Он и так не пересчитывает их на каждом тике. Он вообще ничего не считает на каждом тике.

Вот так он будет считать на каждом тике только текущий бар.

 for(int i=limit; i>=0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

Вот если надо что бы он на каждом тике считал 300 баров

то это выглядит так

if(limit<300)limit=300;
for(int i=limit; i>=0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
torgf
В 15.07.2018 в 08:06, Ugar68 сказал:

Вот если надо что бы он на каждом тике считал 300 баров

то это выглядит так

Возможно неправильно был задан вопрос.

Нужно ограничить историю 300 баров и чтобы не пересчитывались на новом баре уже посчитанные.

Share this post


Link to post
Share on other sites
Ugar68

Ваш код считает не на каждом тике а при появлении нового бара.

И действительно он считает всю историю при появлении нового бара.

Вот эта строчка заставляет считать всю историю

limit=rates_total-2;

Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре. Обычно делают пересчёт только тех баров которые перерисовываются.

После этой строчки добавляем ещё одну.

if(limit>300)limit=300;

Теперь индикатор будет считать только 300 баров.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
torgf
В 19.07.2018 в 16:18, Ugar68 сказал:

Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре

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

 

Share this post


Link to post
Share on other sites
Ugar68
1 час назад, torgf сказал:

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

 

 

В 14.07.2018 в 11:20, torgf сказал:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<4) return(0);

   int limit=rates_total-prev_calculated;
   if(limit>300)limit=300;
///*
   for(int i=limit; i>0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

 

 

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
torgf
В 20.07.2018 в 20:16, Ugar68 сказал:

 

 

Спасибо.

Это можно выкинуть, для чего это делается?

      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);

Share this post


Link to post
Share on other sites
Ugar68
1 час назад, torgf сказал:

Спасибо.

Это можно выкинуть, для чего это делается?


      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);

Эти строчки заполняют буферы пустыми значениями перед тем как полностью пересчитать их. Очистка перед пересчётом.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
torgf
В 23.07.2018 в 08:55, Ugar68 сказал:

 

Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5?

Edited by torgf

Share this post


Link to post
Share on other sites
Ugar68
15 часов назад, torgf сказал:

Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5?

 

Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4.

  • Upvote 1
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
torgf
8 часов назад, Ugar68 сказал:

 

Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4.

Отлично, но меня это не спасает😳. Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано ? 

datetime time=D'2018.07.27 11:15';
barIndex = iBarShift(NULL,PERIOD_M1, time,false );

 

Edited by torgf

Share this post


Link to post
Share on other sites
AntFX

11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются.

П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит...

Edited by AntFX
  • Thanks 1

1

Share this post


Link to post
Share on other sites
torgf
3 часа назад, AntFX сказал:

11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются.

П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит...

Спасибо.

Хочу поставить линию на цену открытия свечи в 11:15 каждый вчерашний день в истории. Не получается. Что неправильно?

  if(!TrendCreate(0,"__"+time[i+1],0,iTime(NULL,PERIOD_D1,i+1),iOpen(NULL,PERIOD_CURRENT,i+iBarShift(NULL,PERIOD_CURRENT, iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600,false )),iTime(NULL,PERIOD_D1,i),0,clrRed,STYLE_SOLID,2,false,false,false,false,0)){continue;}

 

Share this post


Link to post
Share on other sites
DVargo

Для начала бы неплохо научится писать код так, чтобы он был читабельным.

Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку.

А в  TrendCreate ставте переменные даты и цены.

 

4 часа назад, AntFX сказал:

Для символов, у которых торговый день начинается не в 00:00, не подходит...

Что мешает сравнивать текущее время со временем начала дня?

А дату D'2018.07.27 11:15' собирать из вычисленного дня и '11:15'

Тогда и субботу с воскресеньем исключить просто.

Share this post


Link to post
Share on other sites
AntFX
12 часов назад, DVargo сказал:

Что мешает сравнивать текущее время со временем начала дня?

Ничего не мешает


1

Share this post


Link to post
Share on other sites
torgf
15 часов назад, DVargo сказал:

Для начала бы неплохо научится писать код так, чтобы он был читабельным.

Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку.

 

Не найду. На 11:15 пятницы, ставит линию правильно, четверг уже неправильно  дальше в историю неправильно. Куда искать?

datetime dat1,dat2,dat3;
double prise;
int index;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<4) return 0;

   int limit=rates_total-prev_calculated;
   if(limit>1000)
     {
      limit=1000;//rates_total-20;
     }
//--- Цикл расчёта индикатора
   for(int i=limit; i>=0; i--)
     {
      dat1=iTime(NULL,PERIOD_D1,i+1);
      dat2=iTime(NULL,PERIOD_D1,i);
      dat3=iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600;
      index=iBarShift(NULL,PERIOD_CURRENT, dat3,false );
      prise=iOpen(NULL,PERIOD_CURRENT,i+index);
      if(!TrendCreate(0,"__"+time[i+1],0,dat1,prise,dat2,0,clrLime,STYLE_SOLID,2,false,false,false,false,0))
        {
         continue;
        }
      //Comment("");
     }
///

//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

Edited by torgf

Share this post


Link to post
Share on other sites
AntFX
3 минуты назад, torgf сказал:

index=iBarShift(NULL,PERIOD_CURRENT, dat3,false );

prise=iOpen(NULL,PERIOD_CURRENT,i+index);

index - это не смещение относительно i, это смещение относительно нулевого бара.


1

Share this post


Link to post
Share on other sites
Pirojoque Project
21 час назад, torgf сказал:

Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано?

Нужно создать структуру типа MqlDateTime, присвоить её полям необходимые значения и далее использовать там, где необходимо. В вашем случае нужно сконвертировать структуру в простой тип времени datetime и уже эту переменную применять в iBarShift().

 

Пример:

MqlDateTime mqltime; // Время-структура

mqltime.year = 2018; // Устанавливаем год
mqltime.mon = 7; // Устанавливаем месяц
mqltime.day = 30; // Устанавливаем день
mqltime.hour = 11; // Устанавливаем час
mqltime.min = 15; // Устанавливаем минуту

datetime time = StructToTime(mqltime); // Конвертируем время-структуру в обычное время
int n = iBarShift(_Symbol, _Period, time); // Получаем номер бара, захватывающего искомое время

Если нужно организовать какой-либо сдвиг относительно текущего момента, то можно пойти таким путём:

MqlDateTime mqltime; // Время-структура
datetime basetime = TimeCurrent(); // Время, от которого будем отсчитывать сдвиг (здесь — текущее время сервера)

TimeToStruct(basetime, mqltime); // Конвертируем базовое время в структуру
mqltime.day--; // Модифицируем структуру (здесь — ровно день назад)

datetime targettime = StructToTime(mqltime); // Конвертируем время-структуру в искомое время простого формата
int n = iBarShift(_Symbol, _Period, targettime); // Получили номер искомого бара (который был ровно день назад)

Думаю, идея понятна.

Edited by Pirojoque Project
  • Upvote 2

Share this post


Link to post
Share on other sites
torgf
1 час назад, AntFX сказал:

index - это не смещение относительно i, это смещение относительно нулевого бара.

Спасибо. Убрала i+ , линии на правильной цене.

Share this post


Link to post
Share on other sites
torgf
35 минут назад, Pirojoque Project сказал:

Думаю, идея понятна.

Вы пишете конкретную дату и время, как взять только время для каждого ЗАКРЫТОГО бара - дня, непонятно.

Share this post


Link to post
Share on other sites
nasdaq

Как остановить оптимизацию из функции OnTester() ?


Быть честным хочется, но меньше, чем богатым.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×