Перейти к содержанию

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


Рекомендуемые сообщения

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

и ты меня обвинил в усложнениях! :))
В том-то и дело, что всё зависит от того как реализована многопоточность или псевдо-мультипоточность в МТ...

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
Oll, я таки сделал то что ты говорил.

Знаешь в чем проблема? что хард не настолько быстро умеет писать инфу насколько быстро обрабатывает код оперативка. Пока харду подасться команда на запись следующей строчки, код сделает миллион итераций в оперативе.

вот этот код запустил в трёх эксземплярах, я специально вставил слипы и увеличил слиптаймер до 10милисекунд, так как при одной милисекунде в принты вобще выводилась полная каша, я надеюсь тебе не нужно объяснять почему там отражалась буквально наверно одна сотая или одна миллионная часть того что происходит в оперативке. после отключения автоторговли, происходила дальнейшая запись в логи - так как эти задачи стояли в очереди на запись на хард, и они ни коим образом не могли быть отключены уже выключенным кодом мт4.

я надеюсь, все меня понимают о чем я говорю.

Спойлер

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int mas[];
int OnInit()
{
//---
ArrayResize(mas,100);
for (int i=0; i {
mas= i;
}
EventSetMillisecondTimer(1);
OnTimer();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTimer()
{
if (!IsTradeAllowed()) return;
Print("Begin 1");
for (int i = 0; i {
if (MathMod(mas, 10 ) == 0)
Print("i'm first!!!!!! >>>>>>>>>>", (string)i );
Sleep(10);
}
Print("End 1");
}
//+------------------------------------------------------------------+



каждому экземляру были поменяны строчки где цифры и где он кричит какой он по счету.

вот начало вывода принта в логах
Спойлер

0 22:46:37.982 Automated trading enabled
0 22:46:37.989 !!!testingThread EURUSD,H1: Begin 1
0 22:46:37.989 testingThread3 EURUSD,H1: Begin 3
0 22:46:37.989 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>0
0 22:46:37.989 testingThread2 EURUSD,H1: Begin 2
0 22:46:37.989 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>0
0 22:46:37.989 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>0
0 22:46:38.089 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>10
0 22:46:38.089 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>10
0 22:46:38.089 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>10
0 22:46:38.189 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>20
0 22:46:38.189 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>20
0 22:46:38.189 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>20
0 22:46:38.289 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>30
0 22:46:38.289 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>30
0 22:46:38.289 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>30
0 22:46:38.389 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>40
0 22:46:38.389 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>40
0 22:46:38.389 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>40
0 22:46:38.489 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>50
0 22:46:38.489 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>50
0 22:46:38.489 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>50
0 22:46:38.549 Automated trading disabled
0 22:46:38.589 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>60
0 22:46:38.589 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>60
0 22:46:38.589 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>60
0 22:46:38.689 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>70
0 22:46:38.689 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>70
0 22:46:38.689 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>70
0 22:46:38.789 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>80
0 22:46:38.789 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>80
0 22:46:38.789 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>80
0 22:46:38.889 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>90
0 22:46:38.889 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>90
0 22:46:38.889 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>90
0 22:46:38.989 testingThread3 EURUSD,H1: End 3
0 22:46:38.989 testingThread2 EURUSD,H1: End 2
0 22:46:38.989 !!!testingThread EURUSD,H1: End 1



а вот такие вот пироги без слипов, начало вывода лога

Спойлер

0 23:08:56.435 Automated trading enabled
0 23:08:56.443 testingThread3 EURUSD,H1: Begin 3
0 23:08:56.443 testingThread2 EURUSD,H1: Begin 2
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>0
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>10
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>20
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>30
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>40
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>50
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>0
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>10
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>60
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>70
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>80
0 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>90
0 23:08:56.443 testingThread3 EURUSD,H1: End 3
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>20
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>30
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>40
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>50
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>60
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>70
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>80
0 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>90
0 23:08:56.443 testingThread2 EURUSD,H1: End 2
0 23:08:56.443 !!!testingThread EURUSD,H1: Begin 1
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>0
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>10
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>20
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>30
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>40
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>50
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>60
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>70
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>80
0 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>90
0 23:08:56.443 !!!testingThread EURUSD,H1: End 1
0 23:08:56.453 testingThread2 EURUSD,H1: Begin 2
0 23:08:56.453 !!!testingThread EURUSD,H1: Begin 1
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>0
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>10
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>20
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>30
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>40
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>50
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>0
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>10
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>20
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>30
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>40
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>50
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>60
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>70
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>80
0 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>90
0 23:08:56.453 testingThread2 EURUSD,H1: End 2
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>60
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>70
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>80
0 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>90
0 23:08:56.453 !!!testingThread EURUSD,H1: End 1
0 23:08:56.453 testingThread3 EURUSD,H1: Begin 3
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>0
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>10
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>20
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>30
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>40
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>50
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>60
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>70
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>80
0 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>90
0 23:08:56.453 testingThread3 EURUSD,H1: End 3
0 23:08:56.473 testingThread2 EURUSD,H1: Begin 2
0 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>0
0 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>10
0 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>20
0 23:08:56.473 !!!testingThread EURUSD,H1: Begin 1
0 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>0
0 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>10
0 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>20
0 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>30
0 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>30
0 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>40
0 23:08:56.473 testingThread3 EURUSD,H1: Begin 3



мт4 многопточный или псевдомногопточный, каким бы образом ты ни бился головой об стенку, это невозможно следить и управлять тем, какому из экземпляров активных советников сейчас будет передано управление и в какой момент обработки кода. Изменено пользователем dermitay
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130

else
{
int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastOrderPrice(OP_BUY);
{

sl = NormalizeDouble(price - StopLoss*Point,Digits);
tp = NormalizeDouble(price + TakeProfit*Point,Digits);
pricesellstop = NormalizeDouble(price - TakeProfit*Point,Digits);
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier,2);
ticket = OrderSend(Symbol(),OP_SELLSTOP, lastlot,pricesellstop,Slippage,sl,tp,"",Magic,0,Red);
if(ticket Print("Ошибка открытия отложенного ордера на продажу!");

Ссылка на сообщение
Поделиться на другие сайты

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


посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130

else
{
int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastOrderPrice(OP_BUY);
{

sl = NormalizeDouble(price - StopLoss*Point,Digits);
tp = NormalizeDouble(price + TakeProfit*Point,Digits);
pricesellstop = NormalizeDouble(price - TakeProfit*Point,Digits);
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier,2);
ticket = OrderSend(Symbol(),OP_SELLSTOP, lastlot,pricesellstop,Slippage,sl,tp,"",Magic,0,Red);
if(ticket Print("Ошибка открытия отложенного ордера на продажу!");



гугл в помощь
https://book.mql4.com/ru/appendix/errors

слишком близко к цене, либо некоррекные значения TP/SL, либо некорректно задан тип ордера(ну типа селлстоп сверху от текущей цены/селллимит снизу от текущей цены и так далее)

а боллее конкретней, вдумайтесь что вы пишите вот этих строчках и как они подставляются для бай ордера и для селл ордеров

sl = NormalizeDouble(price - StopLoss*Point,Digits);
tp = NormalizeDouble(price + TakeProfit*Point,Digits);
Ссылка на сообщение
Поделиться на другие сайты

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




посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130

else
{
int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastOrderPrice(OP_BUY);
{

sl = NormalizeDouble(price - StopLoss*Point,Digits);
tp = NormalizeDouble(price + TakeProfit*Point,Digits);
pricesellstop = NormalizeDouble(price - TakeProfit*Point,Digits);
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier,2);
ticket = OrderSend(Symbol(),OP_SELLSTOP, lastlot,pricesellstop,Slippage,sl,tp,"",Magic,0,Red);
if(ticket Print("Ошибка открытия отложенного ордера на продажу!");



гугл в помощь
https://book.mql4.com/ru/appendix/errors

слишком близко к цене, либо некоррекные значения TP/SL, либо некорректно задан тип ордера(ну типа селлстоп сверху от текущей цены/селллимит снизу от текущей цены и так далее)

а боллее конкретней, вдумайтесь что вы пишите вот этих строчках и как они подставляются для бай ордера и для селл ордеров

sl = NormalizeDouble(price - StopLoss*Point,Digits);
tp = NormalizeDouble(price + TakeProfit*Point,Digits);


СПАСИБО,БУДУ РАЗБИРАТЬСЯ!!!ПОКА СЛОЖНО ДАЕТСЯ
все с эти разобрался! Изменено пользователем Старик
Ссылка на сообщение
Поделиться на другие сайты

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

Так к сведению можно воспользоваться GetCurrentTheadID и точно узнать в каких потоках работают боты. У меня сейчас к сожалению нету терминалов где была бы мультиботавая торговля.

Изменено пользователем Qj
Ссылка на сообщение
Поделиться на другие сайты

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

Тики по разным парам с высокой вероятностью поступают не синхронно.
Другое дело как долго бот обрабатывает поступивший тик и не возникает ли при этом наложение.

Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо dermitay за эксперимент. немного не так, как я планировал, но может и хорошо.
Видимо Слип запускает временнУю нарезку потока и управление переключается, именно поэтому я писал о работе с текстом... Если МТ может такое проворачивать, значит и во время ожидания ответа сервера может переключить управление.
Я наверно продолжу эксперимент dermitay и на демо одновременно попытаюсь открыть 3 ордера на 3 парах. Чтоб не было задержек с принтами может выводить миллисекунды в строковый буфер и по окончании работы выводить в лог? кстати вопрос - время в принтах на момент печати в лог или момент помещения принта в очередь?

Ссылка на сообщение
Поделиться на другие сайты

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


Чтоб не было задержек с принтами может выводить миллисекунды в строковый буфер и по окончании работы выводить в лог? кстати вопрос - время в принтах на момент печати в лог или момент помещения принта в очередь?



я хз как это реализовать, когда у тебя три независимых друг от друга экземпляра совы. у каждого свой таймер(об этом кстати в официальной документации сказано, использованный OnTimer создается каждый отдельно для конкретного экземпляра совы), у каждого своя очередь вывода в лог, виндовый манагер просто берет и собирает все в кучу FIFO, по крайней мере я это вижу так. про передачу управления при слипе - да, именно так это и работает, нафига тикам процессора простаивать просто так когда его ресурсы на данный момент не нужны последнему застолбившему его потоку. управлением этим обычно занимается диспетчер. ну это теория, я думаю в ВУЗах все это проходили)))
про время в принтах - вот тоже хз чье это время, самого мт4 при обработке запроса или винды при записи в файл.

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

вот только один момент, я не знаю в мт4 ни одного инструментария для того чтобы корректно создавать многопоточную обработку запросов :))
можно конечно прикрутить костыль, замерять время работы одного сегмента кода и вот это замеренное врмя пихать в слип другого кода, ну типа пока один код работает, другой "спит", но это в теории, на практике такую жуть сделать - крайне трудно, может даже и нереально, так как идет уже привязка к конкретному железу, как быстро это исполняется, время обработки циклов, как быстро сервер вернет брокера запрос и т.д. и т.п.

Вобще, как мне кажется, Старик лучше расскажет как там у нас все работает на уровне железа))


Добавлено: 10-04-2016 09:34:51

Ладно, я попробую вкратце объяснить как легко перенести любой код на мультивалютную торговлю, в этом нет ничего сложного.
Два главных аспекта:
1. В коде ничего не нужно запоминать. Я имею ввиду работу с индюками, ну, например, ты не отслеживаешь какое было максимальное значение RSI на прошлом баре(не просто iRSI() а именно помнишь какой текущий максимум, обновляешь его, и при появлении нового бара смещаешь в массиве все элементы на единицу, тебе не интересно что покажет вызванный iRSI на баре назад, тебе нужен именно какой был максимум, а это сделать можно только отслеживая реальные показания и нужно их запоминать). Я привел чисто пример, понятное дело что мало кому это вобще надо.
Но если это не нужно, ничего не надо хранить, то перенос вобще очень прост.
- во внешних переменных обяъвляем строку, в нее вносим названия пар, в ините объявляем дополнительный дополнительный строковый массив, в него парсим названия пар(можно через StringSplit(), примеров в инете куча, там код на пару строк).
в итоге мы получим строковый массив, элементом которого будет являться название пары
- весь основной код оборачиваем в цикл, в котором будем идти по строковому массиву с парами.

для простоты
Спойлер


int sizemas = ArraySize(massivstrok);
for( int j=0; j{
string sym = sizemas[j];

// основной код
}


далее нужно заменить все Symbol() на sym, все вызовы функций тоже нужно подредактировать, добавить передачу sym в функцию, чтобы в самой функции обращаться к данным именного нужного символа через MarketInfo.
то есть все Bid и Ask заменить на MarketInfo(sym, MODE_BID) или MarketInfo(sym, MODE_ASK). тоже самое касается спредов.
тоже самое касается все iCustom(), где опять же нужно передавать текущий sym главного глобального цикла.
тоже самое касается все High[] и Low[], их нужно заменить на iHigh(sym, ...) и iLow(sym, ...)

вот в принципе и все

2. если все-таки нужно что-то хранить, то опять же легко делается. все тоже самое что я написал выше, но еще немножко нужно дополнить, я уже в этой теме вчера писал, нужно создать и описать структуру.
Ну например, в соловалютном коде мы хотим помнить минимальный спред по паре и максимальный. В солокоде у нас это пусть будут переменные sprdMax и sprdMin
в блоке объявления переменных создаем:

Спойлер

struct MainStruct{
string sym;
double sprdMax;
double sprdMin;
};
MainStruct MainBase();


далее в ините как описано выше в п1 при сплите строк в массив мы знаем сколько у нас будет элементов, меняем размерность MainBase()
ArrayResize(MainBase, ArraySize(massivstrok));
Заполняем его
Спойлер

for (int j=0; j{
MainBase[j].sym = massivstrok(j);
MainBase[j].sprdMax = -99999;
MainBase[j].sprdMin = 99999;
}



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


int sizemas = ArraySize(MainBase);
for( int j=0; j{
string sym = MainBase[j].sym;
GlobalNum = j; //он объявлен глобально в самом начале кода еще перед инитом
// основной код и обращение к спредам будет выглядеть вот так:
MainBase[j].sprdMax = блаблабла
MainBase[j].sprdMin = блаблабла
}


Вот пример. Была функция которая помнила максимальный и минимальный спред(я очень примитивно распишу, для наглядности):
Спойлер

void Spred()
{
if ((Ask-Bid)> sprdMax) sprdMax = Ask-Bid;
if ((Ask-Bid)}


Переезд на мультивалютные лыжи:
Спойлер

void Spred(string sym)
{
if (MarketInfo(sym,MODE_ASK) - MarketInfo(sym,MODE_BID) > MainBase[GlobalNum].sprdMax ) MainBase[GlobalNum].sprdMax = MarketInfo(sym,MODE_ASK) - MarketInfo(sym,MODE_BID);

if (MarketInfo(sym,MODE_ASK) - MarketInfo(sym,MODE_BID) }

ЗЫ: я в курсе что есть MarketInfo(..., MODE_SPREAD) :)) :)) :))


Думаю, все просто, нужно просто сесть один разок и попробовать, реально ничего сложного ни в понимании на уровне абстракций, ни при написании кода.
дерзайте!!! :) Изменено пользователем dermitay
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Ребят мне кажется или Вы высасываете проблему из пальца ?

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

Используя такой метод мы можем задать приоритет по парам например
EURUSD;USDCHF;NZDUSD
где разделитель ; а EURUSD имеет наивысший приоритет ...

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

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

Может конечно я не понимаю Вашу проблему, но я не вижу проблем при работе советника в мультивалютном режиме...

И еще MarketInfo морально устарела и получение с помощью неё Ask и Bid не самый лучший вариант...
При использовании мультивалютной торговли лучше MqlTick

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте ! Как написать функцию что бы советник закрывал по общему профиту и ордера на покупку и ордера на продажу ? Что то не увидел может просмотрел в каком видео ?

Ссылка на сообщение
Поделиться на другие сайты

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


Здравствуйте ! Как написать функцию что бы советник закрывал по общему профиту и ордера на покупку и ордера на продажу ? Что то не увидел может просмотрел в каком видео ?


Посмотрите вот этот раздел
https://docs.mql4.com/ru/account/accountprofit

ну а функцию закрытия всех ордеров уже пару дней назад выкладывали в ветке обучения mql.
Ссылка на сообщение
Поделиться на другие сайты

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

Доброй(ый) ночи/день у меня такой вопрос: если я хочу закрыть ордер и мне все равно на проскальзывание то я ставлю 0 или просто сразу следующую запятую ставлю т.е. ничего не забиваю?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SVS696, если мне не изменяет память, то лучше значение slippage максить(ну поставь в 30 или 50, это вполне адекватные значения), если тебе все равно по какой цене закроется ордер. иначе получишь отворот-поворот от сервера брокера.
если поставишь запятую, то есть пропустишь значение, компилятор тебя скорее всего пошлет в пеший тур с ошибкой потери параметра функции.
  • Лайк 5
Ссылка на сообщение
Поделиться на другие сайты

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


Нифига не нашёл



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

extern double Profit = 1.0; // внешняя переменная. профит

блок в основном коде

if (AccountProfit() > Profit) CloseAll();

описание функции вне основного блока кода:

void CloseAll()
{
int ord = OrdersTotal();
for (int i = ord; i{
if (!OrderSelect(i,SELECT_BY_POS)) continue;
if (OrderType() == 0) OrderClose(OrderTicket(),OrderLots(),Bid,100);
if (OrderType() == 1) OrderClose(OrderTicket(),OrderLots(),Ask,100);
if (OrderType()>1) OrderDelete(OrderTicket());
}
}
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Пасиб !
Я нашёл что то похожее.
//+----------------------------------------------------------------------------+
//| Закрытие всех позиций по профиту. |
//+----------------------------------------------------------------------------+
void CloseByProfit() {
double p;
int i, k=OrdersTotal(), pr=0;

for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
p=MarketInfo(OrderSymbol(), MODE_POINT);
if (p==0) if (StringFind(OrderSymbol(), "JPY") if (OrderType()==OP_BUY) {
pr+=NormalizeDouble((OrderClosePrice()-OrderOpenPrice())/p, 0);
}
if (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-OrderClosePrice())/p, 0);
}
}
}
}
CurProfit=pr;
if (CurProfit>=TakeProfit) CloseAllPositions();
}


Сейчас разбираюсь....

Ссылка на сообщение
Поделиться на другие сайты

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

Большое Спасибо, за Урок от Сергея по построению индикаторов!!!!
Когда начал делать "домашнее задание", заступорился при заполнении буфера значениями "скользящей средней" @-). Ясное дело, решил подсмотреть в оригинальном индикаторе, но там присутствуют "+=" и "/=". Поиски, как это понимать, в "буке по mql" и гугле, не увенчались успехом.
Будьте добры, подскажите ссылку где описываются эти (+= ; /=) выражения.

Ссылка на сообщение
Поделиться на другие сайты

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

Будьте добры, подскажите ссылку где описываются эти (+= ; /=) выражения.

Смотри здесь
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ребята, подскажите пожалуйста. есть индикатор, он не обновляется каждый тик, приходится его перезакидывать индикатор в окно, как быть?

Ссылка на сообщение
Поделиться на другие сайты

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

Дайте для начала исходник этого секретного индикатора, там видимо в коде что-то не то.

Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...