Jump to content
Programmer

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

Recommended Posts

Ugar68
3 часа назад, Mighty Mouse сказал:

@Ugar68, как лучше всего организовать работу с текстовым файлом?

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

Если программно закрываю лог, то при новом открытии он перезаписывается. 

 

1. Открывая расшарить для чтения. Тогда его можно читать любым просмотрщиком.

2. После открытия перед записью новых данных перенести курсор в конец файла. Тогда его можно смело закрывать.

3. При открытии проверять открылся ли. Потому что если он будет открыт каким то редактором, то он будет открыт на запись. Тогда индикатор его не сможет открыть.

Edited by Ugar68
  • Thanks 1

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

Share this post


Link to post
Share on other sites
Eugeny_Iv

Доброго дня.

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

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

Share this post


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

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

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

  • Upvote 1

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

Share this post


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

 

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Mighty Mouse

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

Share this post


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

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

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

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

Edited by Ugar68

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

Share this post


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

Share this post


Link to post
Share on other sites
Ugar68

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

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


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

Share this post


Link to post
Share on other sites
zvagolskiy.ru

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

Share this post


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

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

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


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

Share this post


Link to post
Share on other sites
sviter

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

Share this post


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

}


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

Share this post


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); //продажа
           }
        }
     }
  }

 

Share this post


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

}


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

Share this post


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

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

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


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

Share this post


Link to post
Share on other sites
Geshi

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Galim_v

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

Share this post


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

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

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

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

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

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


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

Share this post


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

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

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

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

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

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

Share this post


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

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

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

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

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

Edited by Ugar68

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

Share this post


Link to post
Share on other sites
Galim_v

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

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

Edited by Galim_v

Share this post


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...