Jump to content

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


Recommended Posts

Eugeny_Iv

Доброго дня.

Может кто уже сталкивался с таким системным глюком советника: в коде прописаны параметры открытия сделки, но советник открывает сделку на первом тике, затем на втором тике видит, что параметры для открытия сделки не соблюдены и закрывает открытые на первом тике сделки.

Соответственно это видно как моментальное открытие-закрытие и попадаешь на спред((( Данный глюк происходит крайне редко и что характерно по утрам (время московское). Если у кого бывало такое - буду рад любой инфе.

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

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

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

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Malcolm
1 минуту назад, Eugeny_Iv сказал:

в коде прописаны параметры открытия сделки, но советник открывает сделку на первом тике, затем на втором тике видит, что параметры для открытия сделки не соблюдены и закрывает открытые на первом тике сделки.

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

  • Upvote 1
Link to post
Share on other sites
Eugeny_Iv
2 минуты назад, Malcolm сказал:

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

Спасибо за ответ. Для себя такое поведение могу объяснить только разницей в исторических данных на 1м тике и на 2м. Так как советник основное время работает корректно, за исключением таких вот редких моментов.

Link to post
Share on other sites
Eugeny_Iv
31 минуту назад, Malcolm сказал:

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

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

Link to post
Share on other sites
kaif
18.09.2019 в 04:42, Eugeny_Iv сказал:

Доброго дня.

Может кто уже сталкивался с таким системным глюком советника: в коде прописаны параметры открытия сделки, но советник открывает сделку на первом тике, затем на втором тике видит, что параметры для открытия сделки не соблюдены и закрывает открытые на первом тике сделки.

Соответственно это видно как моментальное открытие-закрытие и попадаешь на спред((( Данный глюк происходит крайне редко и что характерно по утрам (время московское). Если у кого бывало такое - буду рад любой инфе.

 

У меня есть предположение.

Если советник использует скользящие средние (MA) и те в свой расчет включают текущий бар, то вполне возможна такая ситуация.

Допустим, мы берем среднюю цену за последние 20 баров.

Это не совсем история, если считать не с бара 1, а с бара 0.

Так как бар 0 непосредственно влияет на это среднее.


механическая торговая система на основе индикатора AT-линий
описание торговой стратегии LTR-AUTO, хроника событий
Docendo discimus

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

 

У меня есть предположение.

Если советник использует скользящие средние (MA) и те в свой расчет включают текущий бар, то вполне возможна такая ситуация.

Допустим, мы берем среднюю цену за последние 20 баров.

Это не совсем история, если считать не с бара 1, а с бара 0.

Так как бар 0 непосредственно влияет на это среднее.

Спасибо за совет. Текущий бар не используется, без нулевых, минимум 1. Модифицировал блок автозакрытия.

Link to post
Share on other sites
  • 4 weeks later...
Mighty Mouse

@Ugar68 , индюк рисует стрелки на часовке через буфер, но при переключении на более высокие ТФ они перестают быть информативными, налазят на свечи и мешают. Как сделать ограничение по видимости вроде того что сделано для объектов? Пока придумал только проверять текущий ТФ и если он не устраивает обнулять буфер. Может еще какой способ есть?

Link to post
Share on other sites
Ugar68
53 минуты назад, Mighty Mouse сказал:

@Ugar68 , индюк рисует стрелки на часовке через буфер, но при переключении на более высокие ТФ они перестают быть информативными, налазят на свечи и мешают. Как сделать ограничение по видимости вроде того что сделано для объектов? Пока придумал только проверять текущий ТФ и если он не устраивает обнулять буфер. Может еще какой способ есть?

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

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

Edited by Ugar68

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

Link to post
Share on other sites
sviter

Добрый день помогите по параболику пожалуйста! хочу с советнике сделать логику как изображена на картинке:

 

 

код пишу так:

ParSar_0 = iSAR(NULL, time1_method, parsar_Step, parsar_Maximum, 0);
ParSar_1 = iSAR(NULL, time1_method, parsar_Step, parsar_Maximum, 1);

     if(ParSar_0 < Bid && ParSar_1 > Bid)
     {
         TP = NormalizeDouble(Ask + takeprofit * _Point, _Digits);
         ticket = OpenOrder(_Symbol, OP_BUY, lot, Ask, slippage, 0, TP, comment, Magic, 0, clrGreen); //покупка
     }
     
     if(ParSar_0 > Bid && ParSar_1 < Bid)
     {
         TP = NormalizeDouble(Bid - takeprofit * _Point, _Digits);
         ticket = OpenOrder(_Symbol, OP_SELL, lot, Bid, slippage, 0, TP, comment, Magic, 0, clrRed); //продажа
     }
     } 

 

посмотрите может я ошибок наделал каких? ибо он дает сбои....заранее благодарен!

 

Снимок.PNG

Link to post
Share on other sites
Ugar68

Ошибки надо анализировать. Для этого использовать Print().

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


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

Link to post
Share on other sites
  • 4 weeks later...
zvagolskiy.ru

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

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

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

На официальном сайте давно лежит. Достаточно что бы начать писать советники.


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

Link to post
Share on other sites
  • 2 weeks later...
sviter

Здравствуйте!!! делаю советник основываясь на таймфрэйме М5....но сигналы срабатывают (к примеру в 9:33, 12:11) и т.д.....подскажите, как открыть ордер на новой свече, если сигнал был на текущей?

Link to post
Share on other sites
Ugar68
10 минут назад, sviter сказал:

Здравствуйте!!! делаю советник основываясь на таймфрэйме М5....но сигналы срабатывают (к примеру в 9:33, 12:11) и т.д.....подскажите, как открыть ордер на новой свече, если сигнал был на текущей?

Сигнал запомнить в статической переменной. При открытии новой свечи исполнить сигнал. Для этого сравнивать время открытия текущей свечи с запомненным на прошлом тике.

//Сигнал открытия на текущем баре.

static int Signal;

if( условие для открытия Buy )Signal=1;

if( условие для открытия Sell )Signal=-1;

//Сигнал нового бара

bool NowBar=false;

static datetime PrevTime0;

datetime Time0=iTime(_Symbol,5,0);

if(PrevTime0==0)PrevTime0=Time0;

if(PrevTime0!=Time0)NowBar=true;

PrevTime0=Time0;

//Открываем ордер при сигнале и новом баре

if(Signal==1 && NowBar)

{

//Здесь открытие Buy

}

if(Signal==-1 && NowBar)

{

//Здесь открытие Sell

}


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

Link to post
Share on other sites
sviter

не работает! посмотрите пожалуйста, что  я делаю ни так?

 

datetime Time0;
bool NowBar = false;
static datetime PrevTime0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      M  = iStochastic(NULL,PERIOD_M5,KPeriod,DPeriod,Slowing,sto_metod,sto_Price,MODE_MAIN,1);
      M2 = iStochastic(NULL,PERIOD_M5,KPeriod,DPeriod,Slowing,sto_metod,sto_Price,MODE_MAIN,2);

      S = iStochastic(NULL,PERIOD_M5,KPeriod,DPeriod,Slowing,sto_metod,sto_Price,MODE_SIGNAL,1);
//=============================================
   static int Signal;

   if(S < 30 && M < 30 && M2 < S && M > S)
      Signal=1;
   if(S > 70 && M > 70 && M2 > S && M < S)
      Signal=-1;

   Time0 = iTime(NULL, PERIOD_M5, 0);
   if(PrevTime0 == 0)
     {
      PrevTime0 = Time0;

      if(PrevTime0 != Time0)
        {
         NowBar = true;
         PrevTime0 = Time0;

         if(Signal == 1 && NowBar)
           {
            TP = NormalizeDouble(Ask + takeprofit * _Point, _Digits);
            SL = NormalizeDouble(Ask - sloploss * _Point, _Digits);
            ticket = OpenOrder(_Symbol, OP_BUY, lot, Ask, slippage, SL, TP, comment, Magic, 0, clrGreen); //покупка
           }

         if(Signal == -1 && NowBar)
           {
            TP = NormalizeDouble(Bid - takeprofit * _Point, _Digits);
            SL = NormalizeDouble(Bid + sloploss * _Point, _Digits);
            ticket = OpenOrder(_Symbol, OP_SELL, lot, Bid, slippage, SL, TP, comment, Magic, 0, clrRed); //продажа
           }
        }
     }
  }

 

Link to post
Share on other sites
Ugar68
if(PrevTime0 == 0)
     {
      PrevTime0 = Time0;

      if(PrevTime0 != Time0)

Тут бред какой то.

Я же написал как надо. Зачем эта фигурная скобка? И почему внутри неё всё? Если уж так нравится всё делать с фигурными скобками то вот так:

//Сигнал открытия на текущем баре.

static int Signal;

if( условие для открытия Buy )

{

Signal=1;

}

if( условие для открытия Sell )

{

Signal=-1; 

}

//Сигнал нового бара

bool NowBar=false;

static datetime PrevTime0;

datetime Time0=iTime(_Symbol,5,0);

if(PrevTime0==0)

{

PrevTime0=Time0;

}

if(PrevTime0!=Time0)

{

NowBar=true;

}

PrevTime0=Time0;

//Открываем ордер при сигнале и новом баре

if(Signal==1 && NowBar)

{

//Здесь открытие Buy

}

if(Signal==-1 && NowBar)

{

//Здесь открытие Sell

}


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

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

посмотрите пожалуйста, что  я делаю ни так?

Уважаемый, ты пишешь "ни так", а надо писать "НЕ так". 🙂


В бой идут одни старики. (с)

Link to post
Share on other sites
  • 2 months later...
Geshi

Подскажите. В терминале простым движением мы можем наносить индикатор на индикатор. Например на ATR можем наложить MA  и измерять положение относительно него. Это так же легко реализовать в советнике? Т.е посылать запрос в терминал и получать данные, или нужна дополнительная эмуляция наложения индикатора на индикатор?

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

Подскажите. В терминале простым движением мы можем наносить индикатор на индикатор. Например на ATR можем наложить MA  и измерять положение относительно него. Это так же легко реализовать в советнике? Т.е посылать запрос в терминал и получать данные, или нужна дополнительная эмуляция наложения индикатора на индикатор?

В MQL4 есть вызов индикатора, при этом возвращается 1 значение одной линии на 1 баре. Что бы получить значения нескольких линий и/или на нескольких барах, придётся вызвать индикатор соответствующее количество раз.

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

В конкретном примере МА на ATR, последовательность действий такая.

1. создать массив для данных ATR.

2. В цикле вызывать функцию iATR() на нужном количестве баров. Количество баров должно быть больше или равно периода МА.

3. Вызвать iMAOnArray() по массиву с данными ATR. Она вернёт значение МА по ATR.

 

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

Edited by Ugar68
  • Thanks 1

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

Link to post
Share on other sites
Galim_v

Приветствую! Как научить бота отслеживать изменения свопа в четверке?


"Всегда приходит час, который отменяет предыдущий. И звезда, которая приносит свет. Нужно только дождаться."

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

Приветствую! Как научить бота отслеживать изменения свопа в четверке?

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

Получаем значение свопа и сравниваем с прошлым запомненным ранее.

Запоминаем текущее значение для сравнения позже.

Свопы для Buy и Sell, а также на разных символах, отличаются. Логично следить отдельно.


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

Link to post
Share on other sites
Galim_v
57 минут назад, Ugar68 сказал:

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

Получаем значение свопа и сравниваем с прошлым запомненным ранее.

Запоминаем текущее значение для сравнения позже.

Свопы для Buy и Sell, а также на разных символах, отличаются. Логично следить отдельно.

Спасибо, что отозвались! Да, но если записать значение в переменную, она ведь не переживет перезагрузку терминала?  


"Всегда приходит час, который отменяет предыдущий. И звезда, которая приносит свет. Нужно только дождаться."

Link to post
Share on other sites
Ugar68
10 минут назад, Galim_v сказал:

Спасибо, что отозвались! Да, но если записать значение в переменную, она ведь не переживет перезагрузку терминала?  

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

1. Записать в GV переменную.

2. Записать в файл.

Edited by Ugar68

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

Link to post
Share on other sites
Galim_v

Отслеживаю более десятка инструментов. Значит столько и глобальных? GV еще не использовал. Это не тяжко для терминала?

Неважно. Что делать понятно. Спасибо Ugar68.

Edited by Galim_v

"Всегда приходит час, который отменяет предыдущий. И звезда, которая приносит свет. Нужно только дождаться."

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

Отслеживаю более десятка инструментов. Значит столько и глобальных? GV еще не использовал. Это не тяжко для терминала?

Неважно. Что делать понятно. Спасибо Ugar68.

Если много данных, использование GV не оправдано. Слишком много GV. Можно конечно использовать много глобальных переменных, но проще, вместо переменных, использовать массив и скидывать его в файл при каждом изменении значений. При инициализации прочитать из файла в массив.

  • Thanks 1

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...