Jump to content

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


Recommended Posts

Ugar68

В MQL4 пришло много интересного из MQL5. Например можно использовать перечисления, что позволит в настройках удобно выбирать варианты значений. Кнопочки и окошки редактирования прямо на графике позволят удобнее управлять программой. Удобнее работать с файлами. Раньше всё это нельзя было сделать в MQL4, если сильно надо, приходилось выходить за пределы языка с помощью dll.

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

GBPAUDM1.png.52b073fa01a7694c0c63dd19f35a84d6.png

 

Edited by Ugar68
  • Thanks 1

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

Link to post
Share on other sites
  • 7 months later...
  • 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

sviter

Всем привет!

Пытаюсь прикрутить к (любому)индикатору проверку на счет!

bool VerifityToSchet()
  {
   if(AccountNumber() != account)
     {
      Print("На данном счете индикатор работать не будет, вы его приобрели незаконным путем!!!");   
     }else
     {
     Print("На данном счете индикатор авторизован");
     }
   return(false);
  } 

естественно включаю его в init() и в start(), но при перезапуске терминала, он ругается на то что счет недействителен!

Что не так делаю?

Print((string)AccountNumber()+" = "+(string)account);

при перезапуске терминала, в консоль AccountNumber() приходит 0, но сам терминал загружается под счетом и работает

Link to post
Share on other sites
Ugar68

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


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

Link to post
Share on other sites
sviter

Хорошо! Исправил! Работает! А вот еще актуальный вопрос:

На индикаторе стоит проверка на счет! Он стоит и работает в терминале, но в определенный момент пользователь вручную меняет счет, по правилам проверки индикатор должен возразить, что счет не тот, но он ничего не делает и может продолжать работать пока не изменить его настройки, даже после перезагрузки терминала! Как с этим бороться?

Edited by sviter
Link to post
Share on other sites
Ugar68

В каком обработчике событий вызывается функция проверки номера счёта?

Edited by Ugar68

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

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

В каком обработчике событий вызывается функция проверки номера счёта?

там же! OnStart и OnInit!!! Заметил что, это только с индикаторами так, а с советниками все работает!

Edited by sviter
Link to post
Share on other sites
Ugar68

В индикаторах не выполняется переинициализация при смене счёта. По этому выполнять проверку номера счёта в OnInit бесполезно. Функция OnStart предназначена для скриптов, для индикаторов OnCalculate, вот там и стоит выполнять все вычисления и проверку номера счёта в том числе.

  • Upvote 1

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

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

В индикаторах не выполняется переинициализация при смене счёта. По этому выполнять проверку номера счёта в OnInit бесполезно. Функция OnStart предназначена для скриптов, для индикаторов OnCalculate, вот там и стоит выполнять все вычисления и проверку номера счёта в том числе.

Хорошо! Попробую! А какие параметры выставлять в 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[])
унего же много параметров.... все по нулям?

Link to post
Share on other sites
sviter

Сделал так! не работает...

 

datetime time[];
double close[],low[],high[],open[];
int spread[];
long tick_volume[], volume[];

OnCalculate(0, 0, time, open, high, low, close, tick_volume,volume, spread);

 

естественно положил это в OnTimer()

Edited by sviter
Link to post
Share on other sites
Ugar68

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

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[])
  {
//---
   Print("Номер счёта ",AccountNumber());
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Edited by Ugar68

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

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

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

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[])
  {
//---
   Print("Номер счёта ",AccountNumber());
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

если смотреть по Print("Номер счёта ",AccountNumber());

то счет меняется сразу, но ничего не происходит! 

Link to post
Share on other sites
Ugar68

Как это не происходить? В обработчике OnCalculate только строчка печати в лог номера счёта, что он и выполняет. Если надо что бы выполнял что то ещё, то надо написать код этого.

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


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

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

Как это не происходить? В обработчике OnCalculate только строчка печати в лог номера счёта, что он и выполняет. Если надо что бы выполнял что то ещё, то надо написать код этого.

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

OnCalculate Вызывается и Print в нем тоже! Я добавил в OnCalculate проверку на счет, но при ручной смене счета в Print приходит новый счет, а проверка не срабатывает!

 

bool VerifityToSchet()
  {
   Print((string)AccountNumber()+" = "+(string)account);
   if(AccountNumber() != account)
     {
      Alert("На данном счете индикатор работать не будет, вы его преобрели незаконным путем!!!");
      Comment("");
      Print("На данном счете индикатор работать не будет, вы его преобрели незаконным путем!!!");   
     }else
     {
     Print("На данном счете индикатор авторизован!");
     }
   return(false);
  }  

и в проверке в Print приходит: новый счет = указанный счет

Print((string)AccountNumber()+" = "+(string)account); 
Edited by sviter
Link to post
Share on other sites
Ugar68

Я не вижу как Вы выполняете проверку. Покажите весь код.

Так же мне не понятна идея Вашей функции проверки. Что она должна возвращать, почему она всегда возвращает false или только сообщать о правильном или неправильном счёте?


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

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

подскажите пожалуйста,

каким образом советник для МТ5 может получить данные о прибыли за день, неделю и месяц чтобы потом вывести это на его экран, например как на скрине? Для этого есть специальные функции или нужно самому записывать значение на начало дня, недели, месяца, в каком-нибудь файле?

изображение_2021-02-25_034236.png

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

подскажите пожалуйста,

каким образом советник для МТ5 может получить данные о прибыли за день, неделю и месяц чтобы потом вывести это на его экран, например как на скрине? Для этого есть специальные функции или нужно самому записывать значение на начало дня, недели, месяца, в каком-нибудь файле?

изображение_2021-02-25_034236.png

Сначала надо запросить историю за нужный промежуток времени HistorySerlect.

Узнать количество сделок в истории HistoryDealsTotal.

В цикле выбирать сделки HistoryDealGetTicket.

Получать прибыль сделок HistoryDealGetDouble и суммировать их в переменную.

  • Upvote 1

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

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

Сначала надо запросить историю за нужный промежуток времени HistorySerlect.

Узнать количество сделок в истории HistoryDealsTotal.

В цикле выбирать сделки HistoryDealGetTicket.

Получать прибыль сделок HistoryDealGetDouble и суммировать их в переменную.

спасибо за обстоятельный ответ )

Link to post
Share on other sites
  • 1 month later...
sable57

Вот простенький скрипт:

//+------------------------------------------------------------------+
//|                                                #s Test iTime.mq4 |
//+------------------------------------------------------------------+
#property strict

string ArrFI[]={"EURUSD","GBPUSD","USDCHF","USDJPY"}, FI,
       ArrTS[]={"M 1","M 5","M15","M30","H 1","H 4","D 1"};
int    ArrTF[]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1},
       TF, fi,tf, qFI=ArraySize(ArrFI),qTF=ArraySize(ArrTF), DG;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
 for(fi=0;fi<qFI;fi++)
    {FI=ArrFI[fi]; DG=(int)MarketInfo(FI,MODE_DIGITS);
     for(tf=0;tf<qTF;tf++){TF=ArrTF[tf];
                           Print(ArrTS[tf],"  Curr:" , TimeCurrent(),"  Bar:",iTime(FI,TF,0),
                                           "  Open:" , DoubleToStr(iOpen (FI,TF,0),DG),
                                           "  Close:", DoubleToStr(iClose(FI,TF,0),DG)    );
                          }
     Print(FI);
    }
}//end of start
//+------------------------------------------------------------------+

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

Сразу же запускаю во 2-ой раз и получаю достаточно верный результат, хотя на PERIOD_M1 все же есть отклонение.  Если это моя беда, то пережить можно, но если проблемы с языком, то как можно рассчитывать на правильную автоматическую торговлю?

For FX.docx


"Призрачно все в этом мире бушующем."

Link to post
Share on other sites
Pirojoque Project
12.04.2021 в 09:46, sable57 сказал:

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

Это не ошибки. Это особенность подгрузки данных на графиках. Пока график не активен (не открыт) и к нему не обращаются, МТ не обновляет массивы данных (цены, время бара, спред). Как только запустили первый раз, обратившись к данным графиков, мы заставляем этим МТ подгрузить данные, но распечатываются в Print ещё старые данные (на подгрузку нужно время, к тому же МТ делает это в своём внутреннем потоке, не завязанном на исполнение скрипта). Второй запуск уже показывает обновлённые в прошлый раз массивы данных. М1, в силу своей скорости накопления данных, успевает между запусками немного устареть.

  • Upvote 1
Link to post
Share on other sites
Pirojoque Project
12.04.2021 в 09:46, sable57 сказал:

Если это моя беда, то пережить можно, но если проблемы с языком, то как можно рассчитывать на правильную автоматическую торговлю?

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

 

В вашем случае нужно лишь дёргать интересующие данные, вынуждая МТ обновлять их, по времени баров проверять их актуальность (текущее время – время бара < количество секунд в одном баре искомого тайм-фрейма). Если данные устаревшие, подождать и перепроверить позже. И так до полной подгрузки, когда все проверки данных пройдут успешно.

 

В общем, это не беда 🙂

  • Upvote 1
Link to post
Share on other sites
sviter

Всем привет! Вопрос вот какой:

Делаю сеточника с мартином, но не по очереди, а общую(открываются все ордера и сетки по мере сигналов, а не по очереди)! Столкнулась с проблемой....когда срабатывает один ордер или его сетка, то все отрабатывает отлично, а вот когда открывается ордер или его сетка и потом в это же время(или позже) открывается другой ордер и его сетка, то мартин начинает продолжать первую сетку! В чем может быть проблема?
Link to post
Share on other sites
sable57
14.04.2021 в 12:36, Pirojoque Project сказал:

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

 

....

 

В общем, это не беда 🙂

Спасибо за разъяснение.  Это в самом деле не беда - просто запускать предварительно что-л, что "подразогреет" МТ.


"Призрачно все в этом мире бушующем."

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

Всем привет! Вопрос вот какой:

Делаю сеточника с мартином, но не по очереди, а общую(открываются все ордера и сетки по мере сигналов, а не по очереди)! Столкнулась с проблемой....когда срабатывает один ордер или его сетка, то все отрабатывает отлично, а вот когда открывается ордер или его сетка и потом в это же время(или позже) открывается другой ордер и его сетка, то мартин начинает продолжать первую сетку! В чем может быть проблема?

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

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

Если так проще, можно отказаться от неопределённых сленгов и оперировать отдельными ордерами.


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

Link to post
Share on other sites
sviter

Всем привет! Делаю сову на кастомном индикаторе, и появились проблемы!

Надо, что бы был сигнал(когда он есть) только на первой свече и все (пример: Buy первая свеча по сигналу,  Sell первая свеча по сигналу). А он открывает с первой свечи и продолжает открывать на каждой! Скажите может есть какая нибудь блокировка?
Link to post
Share on other sites
Ugar68
21.04.2021 в 00:34, sviter сказал:

Всем привет! Делаю сову на кастомном индикаторе, и появились проблемы!

Надо, что бы был сигнал(когда он есть) только на первой свече и все (пример: Buy первая свеча по сигналу,  Sell первая свеча по сигналу). А он открывает с первой свечи и продолжает открывать на каждой! Скажите может есть какая нибудь блокировка?

Нет никаких блокировок. Надо продумывать условия для открытия.


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

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