Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1302

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Dmitri Custurov, 2020.08.27 13:10

Приветствую. 

В МТ4 есть такая вот штука:

#import "user32.dll"
   int SendMessageA(int hWnd, int Msg, int wParam, char &lParam[]);
   int RegisterWindowMessageA(uchar &lParam[]);
#import

string IndiName="TestBot";

void OnStart()
  {
   char buf[];
   StringToCharArray("MetaTrader4_Internal_Message", buf);
   int MT4InternalMsg=RegisterWindowMessageA(buf);
   StringToCharArray(IndiName, buf);
   long handle=ChartGetInteger(0, CHART_WINDOW_HANDLE);
   Print(MT4InternalMsg);
   bool res=SendMessageA((int)handle, MT4InternalMsg, 14, buf);
   Print("Функция SendMessageA завершила работу с результатом: ",res);
  }

Этот код отправляет в окно терминала команду на запуск конкретного советника.

Есть ли подобный функционал и для МТ5 ?

Пробовал вот так:

#import "user32.dll"
   int SendMessageA(long hWnd, long Msg, uint wParam, uchar &lParam[]);
   int RegisterWindowMessageA(uchar &lParam[]);
#import

string IndiName="TestBot";

void OnStart()
  {
   uchar buf[];
   StringToCharArray("MetaTrader5_Internal_Message", buf);
   long MT5InternalMsg=RegisterWindowMessageA(buf);
   StringToCharArray(IndiName, buf);
   long handle=ChartGetInteger(0, CHART_WINDOW_HANDLE);
   Print("Window handle: ", handle);
   Print("Message: ",MT5InternalMsg);
   for(int i = 0; i<100; i++){
      bool res=SendMessageA(handle, MT5InternalMsg, i , buf);
      printf("Функция SendMessageA завершила работу с результатом: %d, номер: %d ",res, i);
   }
  }

Не выходит.

Пробовал сканировать spy++, но сообщений в МТ5 нет от слова совсем, в отличие от МТ4.

Мне нужно именно вызвать окно настроек эксперта.


Нужно уметь запускать скрипт через WinAPI. Есть решение для пятерки?

 
Привет! Мужики, выручайте! Ни как не могу придумать функцию. Советник открывает одну позицию в день (в промежуток с 00:00 до 23:59), то есть один день-один ордер. Задача такая --> найти серию непрерывных убытков и вывести ее в лог (через команду Print(), вывести один раз). Кол-во элементов в серии вводится с клавиатуры (Например, если с клавы введено значение 5, а серия из 4х убыточных дней, то мы ее игнорируем --> ждем появление 5 и более дней). Серией считается, если убыточные дни идут подряд или ордера закрыты в один день (открываются один раз в день, а уже рыночные могут "висеть" более одного дня). В лог должно выводится (например) " убыточная серия в эти дни: 01.05, 02.05, 03.05, 04.05, 05.05 ". Важное условие: распознавать серию ( и соответсвенно выводить ее в лог), которая больше или равна значению, введенному с клавы (extern). 
//
Лично у меня идея сложена так:
1. Фия заполняет массив Убыточных ордеров значениями их закрытия ( Mass[i] = OrderCloseTime();). То есть в массиве хранятся только даты-время закрытия убыточных ордеров 
2. Начинаем сравнивать элемент на позиции i и на позиции i-1 (2 соседних)
2.1 сравниваем их путем преобразования данных ячейки в номер дня года ( TimeDayOfYear(Mass[i]) и TimeDayOfYear(Mass[i-1])
2.2 такое сравнение позволяет узнать, идут ли убыточные дни друг за другом (Допустим первый убыточный день = 178, а предыдущий = 176 --> серии нет, т.к дни идут неподряд, соответственно если первый = 178, а второй 177 --> серия есть)
2.3 Через цикл for перебираем все ячейки  массива и сравниваем соседние. Если есть серия убытков на соседних элементах массива --> начинаем гнать пока 1.НЕ дойдем до минимально необходимого  кол-ва  убыточных дней, чтобы считать это серией. 2. (если выполнен пункт 1)  ПОКА серия не прекратиться. 
2.4 СЕРИЯ ПРЕКРАЩАЕТСЯ --> запоминаем индекс элемента массива, на котором она закончилась, и запоминаем кол-во элементов в серии (серия может быть == ИЛИ больше значения, введенного с клавы)
3. ---вот здесь начинается проблема реализации---
3.1 Нужно через for как-то "отшагать" обратно по серии убыточных дней, при этом узнавая у каждого элемента его дату, переводить эту дату из datetime --> string, 
3.11 на основе этого заполнить строку ( Не знаю, может как-нибудь через StringAdd()?), и вывести ее в ЛОГ-файл (не миллион раз, а всего-лишь один)

Алгоритм советника не играет роли, важна сама пользовательская функция 

Христа ради, помогите!))
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива...
Файлы:
 

Здравствуйте.
Требуется совет по алгоритму.
Пытаюсь оформить следующее требование перед обработкой блока открытия ордеров:

Если уже имеются ордера на покупку/продажу и цена открытия последнего ордера меньше на Х пунктов чем текущая цена, то игнорируем блок/не открываем ордера.

Подскажите пожалуйста - какие есть варианты реализации в коде?

 

Может кто то делал измерения для мт 5 с момента отправки приказа на открытие позиции до ее реального появления сколько может пройти времени ?

Меня больше интересует, если отправлен ордер и советшены сделки с момента отправки и до появления сделок сколько может пройти времени ?

 
Сергей Таболин:

k = {1,2,4,8,16,......}

cn = k[c]

Прикольное решение))))

 
Vladimir Baskakov:
Планирует ли MQ добавление пользовательских индикаторов в мобильную платформу?

Судя по ответам по новому мобильному терминалу, в ближайшем будущем нет. Только ручки.

 
Valeriy Yastremskiy:

Прикольное решение))))

Ну, если коэффициенты заранее известны, то нафига их высчитывать? )))

 
Сергей Таболин:

Ну, если коэффициенты заранее известны, то нафига их высчитывать? )))

Более универсально получается, если высчитывать. 

 

Коллеги, всем доброго времени суток - интуитивно понятно мне решение, хотелось бы от Вас.

Каким образом оптимальным способом, выделить части лота для их последующего закрытия (частичное закрытие ОБЩЕГО лота - частями - 5 ед. частей).

В моем понимании, например, лот 2.58. Делю  на 5, в итоге 0,51 лот для закрытия 4-х  частей и пятая часть 0,54 лот.

Как это лучше в коде изобразить? Какая мат ф-ия берет остаток от деления, чтобы взять к закрытию 0,54?

 
Roman Shiredchenko:

Коллеги, всем доброго времени суток - интуитивно понятно мне решение, хотелось бы от Вас.

Каким образом оптимальным способом, выделить части лота для их последующего закрытия (частичное закрытие ОБЩЕГО лота - частями - 5 ед. частей).

В моем понимании, например, лот 2.58. Делю  на 5, в итоге 0,51 лот для закрытия 4-х  частей и пятая часть 0,54 лот.

Как это лучше в коде изобразить? Какая мат ф-ия берет остаток от деления, чтобы взять к закрытию 0,54?

А документацию почитать?