Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#5326

Скажите уважаемые камрады, чтобы работать с переменными советников на уровне двух терминалов, нужно создать DLL в програме C++ Builder, если правильно то подмигните хотя бы ?

#5327

Меня в первую очередь интересует спред в момент закрытия ордера. Может существует возможность получать эту информацию из истории?


Ну логично, что ты после закрытия ордера будешь ждать, пока сервер тебе выдаст ответ, после этого это будешь открывать csv, искать последнюю строчку, записывать туда данные, закрывать csv, далее только переходить к следующему ордеру. Но по времени это миллисекунды, не думаю, что тут стоит волноваться. Если ты закрываешь сетку, то вначале отсортируй ордера по лотности, а потом закрывай с самого большого, тогда тебе будет уже пофиг на задержки остальных, самый прибыльный ты закроешь первым. Всегда есть проскальзывание сервера, от него ты никак не застрахован. У меня может быть 1-2% сеток, которые должны быть в БУ закрываются в небольшой минус, но я даже не парюсь, он быстро отрабатывает.
По истории, я не анализирую спреды во время закрытия ордеров, мне не нужно особо, но после закрытия каждого ордера у меня идет принт, в который я записываю "ордер закрыт, все хорошо", профит ордера, плюс текущий спред. Можно спокойно проверить после этого из логов это значение.
Если просто интересен спред по паре, поставь мой индикатор "Spread Detected by ReVeR" на нее, он будет рисовать значение спреда каждый тик (минимум, максимум, средний по свече), плюс записывать, если нужно, это значение в файл.

Скажите уважаемые камрады, чтобы работать с переменными советников на уровне двух терминалов, нужно создать DLL в програме C++ Builder, если правильно то подмигните хотя бы ?


Знаю, что можно и без DLL, но как - не знаю, не было задачи узнать. Вот пример программы без dll, которая копирует сделки с одного терминала на другой: ТЫК

#5328

Вроде как должна работать но почему-то не хочет


По коду сначала идет перебор всех ордеров и запоминается профит последнего, который необязательно будет в плюсе.
Нужно prlock и тикет ордера запоминать на каждой итерации и сравнивать с prlock предыдущим (блин, сумбурно получилось), типа:

double max_prlock;
int ticket;
for(int y=OrdersTotal()-1; y>=0; y--) //перебор ордеров {
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES)) {
if(OrderSymbol()==Symbol() && (OrderMagicNumber()==magic_b || OrderMagicNumber()==magic_s))
//находим наш единственный ордер с уникальным магиком
{
prlock=OrderProfit();// и если он есть то определяем его профит в переменную
if(prlock>max_prlock) {
prev_prlock=prlock;
ticket=OrderTicket();
}
}
}
}
........
далее сравниваем профит ордера с max_prlock
........

Хотя тикет вроде и не нужен...
Впишите в код Принты со значением сравниваемых переменных, будет проще понять, правильно ли работает логика.

Изменено 29 ноября, 2018 пользователем usver73

#5329

Скажите уважаемые камрады, чтобы работать с переменными советников на уровне двух терминалов, нужно создать DLL в програме C++ Builder, если правильно то подмигните хотя бы ?


Знаю, что можно и без DLL, но как - не знаю, не было задачи узнать. Вот пример программы без dll, которая копирует сделки с одного терминала на другой: ТЫК


Ну копировщик зделок это не то, нужны даные переменных с разных терминалов(не очень особо нужны,но задача на ближаишее будущее уже созревает). Есть статья по этой теме "Как написать DLL для MQL4 на C++Builder.", там вроде не так сложно, даже для меня.
#5330



Скажите уважаемые камрады, чтобы работать с переменными советников на уровне двух терминалов, нужно создать DLL в програме C++ Builder, если правильно то подмигните хотя бы ?


Знаю, что можно и без DLL, но как - не знаю, не было задачи узнать. Вот пример программы без dll, которая копирует сделки с одного терминала на другой: ТЫК


Ну копировщик зделок это не то, нужны даные переменных с разных терминалов(не очень особо нужны,но задача на ближаишее будущее уже созревает). Есть статья по этой теме "Как написать DLL для MQL4 на C++Builder.", там вроде не так сложно, даже для меня.


Я пока встречал передачу через DLL, реестр windows, файл, виртуальный файл,,
в этой ветке есть библиотеки, пробуйте:
https://www.mql5.com/ru/forum/116821
#5331

файл


Простите, а разве mql может работать с файлами, расположенными вне "песочницы"?
Снимаю вопрос. Дошел до страницы по ссылке..
#5332

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

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

Добавлено: 29-11-2018 18:56:41

Вроде как должна работать но почему-то не хочет

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

Изменено 29 ноября, 2018 пользователем 0ll

#5333

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

Исходный_код.mq43 скач.
Test4.mq43 скач.

#5334

Пожалуйста помогите или хотя бы исправьте

Смотри.

Test4_.mq45 скач.

#5335

Доброго времени суток. Изучаю курс и столкнулся с проблемой ошибки при тестировании. в журнале появляется "cannot open file 'C:\Program Files (x86)\MetaTrader 4 - RoboForex\MQL4\indicators\TMA_Fair.ex4' [2]" . Разбираю 3 урок С внешним индикатором. с чем может быть связана данная ошибка и как ее исправить.

#5336

столкнулся с проблемой ошибки при тестировании. в журнале появляется "cannot open file 'C:\Program Files (x86)\MetaTrader 4 - RoboForex\MQL4\indicators\TMA_Fair.ex4' [2]"

Приведите код вызова индикатора и проверьте наличие файла по указанному пути. Сколько у Вас терминалов?
#5337

открыл каталог данных из терминала и перекинул туда TMA в папку MQL индикаторы, три терминала установлено. не понял что вы имели в виду "Приведите код вызова индикатора "


Добавлено: 05-12-2018 20:08:17

нашел ошибку, в конце названия у индикатора стоял пробел 8-}. теперь все заработало

Добавлено: 06-12-2018 14:27:27

Добрый вечер. Помогите найти ошибку. Столкнулся с проблемой в задании 3 урока. Стоп ордер моментально закрывается , при пересечении его ценой, хотя на закрытие я установил только по TP и SL. и не до конца понял правильно ли я добавил сигнал по стахастику. сделки открывает, но когда делаю тестирование с визуализацией мне кажется что как будто что то не так.

QIP_Shot_-_Screen_298.png
QIP_Shot_-_Screen_299.png
33.mq45 скач.

Изменено 6 декабря, 2018 пользователем Максим1990

Автор#5338


открыл каталог данных из терминала и перекинул туда TMA в папку MQL индикаторы, три терминала установлено. не понял что вы имели в виду "Приведите код вызова индикатора "


Добавлено: 05-12-2018 20:08:17

нашел ошибку, в конце названия у индикатора стоял пробел 8-}. теперь все заработало

Добавлено: 06-12-2018 14:27:27

Добрый вечер. Помогите найти ошибку. Столкнулся с проблемой в задании 3 урока. Стоп ордер моментально закрывается , при пересечении его ценой, хотя на закрытие я установил только по TP и SL. и не до конца понял правильно ли я добавил сигнал по стахастику. сделки открывает, но когда делаю тестирование с визуализацией мне кажется что как будто что то не так.


Вечер добрый!

Судя по коду тут многое не так.
Вот это, например, что такое?


NormalizeDouble(OrderModify(ticket, OrderOpenPrice(),SL, TP,0), Digits);


или это?

NormalizeDouble(OrderSend(Symbol(),OP_BUYSTOP,Lots,StopPrice, Slippage,SSL,STP,comment,magic,0,clrBlue),Digits);


а вот ещё, обратите внимание, что после "TMA_Fair" идёт пробел, это уже ошибка, т.к. сам индикатор идёт без пробела:


PriceHigh = iCustom(Symbol(),0,"TMA_Fair ",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate, 1, 0);



Обратите внимание на журнал метатрейдер, обязательно увидите это:

Изменено 6 декабря, 2018 пользователем xbms

#5339

NormalizeDouble(OrderModify(ticket, OrderOpenPrice(),SL, TP,0), Digits);


после компеляции у меня выставлял предупреждение(картинка 1) и NormalizeDouble исправил это, остальной код чисто по 3 уроку. кроме NormalizeDouble. ошибку с пробелом я уже нашел и исправил.
На данный момент у меня проблема с 3 заданием по 3 уроку."выше/ниже границ каналов поставить страховочные стоп-ордера на некотором расстоянии от рыночных ордеров, дабы компенсировать убытки при
возможных потерях от рыночных ордеров (с обязательной установкой SL, TP)."
данную задачу я решил вставить код на открытие стоп ордера в момент модификации рыночного, вставляя тутда вот этот код:
StopPrice = OrderOpenPrice() - sureStop*Point;
SSL = NormalizeDouble(StopPrice + StopStopLoss * Point,Digits);// расчитываем стоплос для стоп ордера
STP = NormalizeDouble(StopPrice - StopTakeProfit * Point,Digits);
OrderSend(Symbol(),OP_SELLSTOP,Lots,StopPrice, Slippage,SSL,STP,comment,magic,0,clrBlue);

сам ордер выставляет, но когда цена доходит до стоп ордера он моментом закрывается(картинка 2 и 3)
в чем может быть проблема?

QIP_Shot_-_Screen_300.png
QIP_Shot_-_Screen_301.png
QIP_Shot_-_Screen_299.png

Автор#5340

сам ордер выставляет, но когда цена доходит до стоп ордера он моментом закрывается(картинка 2 и 3)
в чем может быть проблема?



Ну так вот же Ваш код:



if(Ask 0)
{
for(int i = OrdersTotal()-1; i >=0; i--)
{//перебираем ордера которые у нас уже есть
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)== true)
{// если он выбран, проверяем является ли он нордером с нашим магиком
if(OrderMagicNumber() == magic && OrderType() == OP_SELL)
{
NormalizeDouble(OrderClose(OrderTicket(),OrderLots(), Ask, Slippage, clrBlack),Digits);
}
}
}

}

if(Bid >=PriceMedeum && CountBuy()> 0)
{
for(int i = OrdersTotal()-1; i >=0; i--)
{//перебираем ордера которые у нас уже есть
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)== true)
{// если он выбран, проверяем является ли он нордером с нашим магиком
if(OrderMagicNumber() == magic && OrderType() == OP_BUY)
{
NormalizeDouble(OrderClose(OrderTicket(),OrderLots(), Bid, Slippage, clrBlack),Digits);
}
}
}

}



Все условия выполняются, вот ордера и закрываются, всё честно.
#5341

Я так понимаю в терминалах MT5 и MT4 один язык программирования mql5 стал?

#5342

Я так понимаю в терминалах MT5 и MT4 один язык программирования mql5 стал?

Пока нет.

Добавлено: 07-12-2018 15:39:50

и тем самым этот тикет присваивается и стоп ордеру

Это Вы точно не туда пошли. Тикет не может "приравняться" это точно.
Автор#5343
Цитата


я думал этот код будет закрывать только рыночные ордера OP_SELL и OP_BUY, у меня же открывается OP_BUYSTOP и OP_SELLSTOP, я и думал что этот код их не будет затрагивать. Это может быть из-за того что стоп ордера у меня открываются в месте проверки условия открылся ли рыночный ордер и при ровнялся ему тикет, и тем самым этот тикет присваивается и стоп ордеру. И поэтому стоп ордер проходит проверку в условии закрытия рыночного ордера?? так это или я совсем не туда пошел в рассуждениях?



STOP-ордер стал рыночным, поэтому он стал BUY или SELL.
Именно поэтому к нему и применяются те же условия.

Да, и спрошу ещё раз, что это значит для Вас?


NormalizeDouble(OrderClose(OrderTicket(),OrderLots(), Ask, Slippage, clrBlack),Digits);


Если Вы хотите избежать предупреждения компилятора, то делать нужно так:


bool res;
res = OrderClose(OrderTicket(),OrderLots(), Ask, Slippage, clrBlack);

if (!res)
{
// тут обработка ошибок закрытия ордера
.....
}


NormalizeDouble - это функция, которая нормализует дробное значение и возвращает его.
Вы же пытаетесь нормализовать булевое значение, причём далее его нигде не используя.

bool OrderClose(
int ticket, // номер ордера
double lots, // количество лотов
double price, // цена закрытия
int slippage, // максимальное проскальзывание
color arrow_color // цвет
);



Вот я и спрашиваю, какой в этом сакральный смысл?
#5344

ребят а можно сделать такую сову, чтобы я расставил уровни, а он от них открывался. (То есть он работает с предварительно вручную расставленными линиями)?
Не хочу объявлять уровни как константы.

#5345


ребят а можно сделать такую сову, чтобы я расставил уровни, а он от них открывался. (То есть он работает с предварительно вручную расставленными линиями)?
Не хочу объявлять уровни как константы.


Вот Вам направление - OBJPROP_PRICE1 OBJPROP_PRICE2 OBJPROP_PRICE3
а если точнее - рисуете обьект, ищите его, открываетесь (или выставляте отложку) по цене найденного обьекта
#5346

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

Такие совы есть в изобилии, называется: торговля от линий/уровней
#5347

Новый урок:
http://tradelikeapro.ru/mql4-grafik-ekviti-i-statistika/

#5348

Подскажите, пожалуйста, новичку, как посчитать количество закрытых подряд убыточнх сделок. Нужно, чтобы советник останавливал тоговлю после определенного количества убыточны сделок подряд. В коде сделки закрываются по Стопу или Тейку.
Я пробовала перебирать закрытые одера функицей
OrderSelect(trade,SELECT_BY_POS,MODE_HISTORY) и отбирать убыточные, но поняла, что данная функция перебирает ордера в случайном порядке.

#5349

данная функция перебирает ордера в случайном порядке


Первый раз о таком слышу. И на уроках я не помню чтоб xbms упоминал что нибуть подобное. Перебор идет подряд. Предоставь код перебора.
#5350

Я пробовала перебирать закрытые одера функцей OrderSelect(trade,SELECT_BY_POS,MODE_HISTORY) и отбирать убыточные, но поняла, что данная функция перебирает ордера в случайном порядке.

Открытые ордера сортируются по времени открытия и тикету, закрытые по времени закрытия!

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025