0ll Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 и ты меня обвинил в усложнениях! :))В том-то и дело, что всё зависит от того как реализована многопоточность или псевдо-мультипоточность в МТ... Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 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 enabled0 22:46:37.989 !!!testingThread EURUSD,H1: Begin 10 22:46:37.989 testingThread3 EURUSD,H1: Begin 30 22:46:37.989 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>00 22:46:37.989 testingThread2 EURUSD,H1: Begin 20 22:46:37.989 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>00 22:46:37.989 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>00 22:46:38.089 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>100 22:46:38.089 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>100 22:46:38.089 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>100 22:46:38.189 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>200 22:46:38.189 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>200 22:46:38.189 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>200 22:46:38.289 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>300 22:46:38.289 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>300 22:46:38.289 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>300 22:46:38.389 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>400 22:46:38.389 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>400 22:46:38.389 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>400 22:46:38.489 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>500 22:46:38.489 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>500 22:46:38.489 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>500 22:46:38.549 Automated trading disabled0 22:46:38.589 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>600 22:46:38.589 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>600 22:46:38.589 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>600 22:46:38.689 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>700 22:46:38.689 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>700 22:46:38.689 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>700 22:46:38.789 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>800 22:46:38.789 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>800 22:46:38.789 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>800 22:46:38.889 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>900 22:46:38.889 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>900 22:46:38.889 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>900 22:46:38.989 testingThread3 EURUSD,H1: End 30 22:46:38.989 testingThread2 EURUSD,H1: End 20 22:46:38.989 !!!testingThread EURUSD,H1: End 1 а вот такие вот пироги без слипов, начало вывода лога Спойлер 0 23:08:56.435 Automated trading enabled0 23:08:56.443 testingThread3 EURUSD,H1: Begin 30 23:08:56.443 testingThread2 EURUSD,H1: Begin 20 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>00 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>100 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>200 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>300 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>400 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>500 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>00 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>100 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>600 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>700 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>800 23:08:56.443 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>900 23:08:56.443 testingThread3 EURUSD,H1: End 30 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>200 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>300 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>400 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>500 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>600 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>700 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>800 23:08:56.443 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>900 23:08:56.443 testingThread2 EURUSD,H1: End 20 23:08:56.443 !!!testingThread EURUSD,H1: Begin 10 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>00 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>100 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>200 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>300 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>400 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>500 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>600 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>700 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>800 23:08:56.443 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>900 23:08:56.443 !!!testingThread EURUSD,H1: End 10 23:08:56.453 testingThread2 EURUSD,H1: Begin 20 23:08:56.453 !!!testingThread EURUSD,H1: Begin 10 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>00 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>100 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>200 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>300 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>400 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>500 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>00 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>100 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>200 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>300 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>400 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>500 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>600 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>700 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>800 23:08:56.453 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>900 23:08:56.453 testingThread2 EURUSD,H1: End 20 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>600 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>700 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>800 23:08:56.453 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>900 23:08:56.453 !!!testingThread EURUSD,H1: End 10 23:08:56.453 testingThread3 EURUSD,H1: Begin 30 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>00 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>100 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>200 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>300 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>400 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>500 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>600 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>700 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>800 23:08:56.453 testingThread3 EURUSD,H1: i'm third!!!!!! >>>>>>>>>>900 23:08:56.453 testingThread3 EURUSD,H1: End 30 23:08:56.473 testingThread2 EURUSD,H1: Begin 20 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>00 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>100 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>200 23:08:56.473 !!!testingThread EURUSD,H1: Begin 10 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>00 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>100 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>200 23:08:56.473 !!!testingThread EURUSD,H1: i'm first!!!!!! >>>>>>>>>>300 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>300 23:08:56.473 testingThread2 EURUSD,H1: i'm second!!!!!! >>>>>>>>>>400 23:08:56.473 testingThread3 EURUSD,H1: Begin 3 мт4 многопточный или псевдомногопточный, каким бы образом ты ни бился головой об стенку, это невозможно следить и управлять тем, какому из экземпляров активных советников сейчас будет передано управление и в какой момент обработки кода. Изменено 9 апреля, 2016 пользователем dermitay 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
VILNER Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130else { 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("Ошибка открытия отложенного ордера на продажу!"); Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130else { 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); Ссылка на сообщение Поделиться на другие сайты More sharing options...
VILNER Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 посмотрите пожалуйста в чем ошибка в этом коде на открытие отложенного ордера,при компиляции ошибок не выдает,нов журнале метатрейдера при тестировании пишет "ошибка открытия отложенного ордера на покупку" и выдаетт ошибку OrderSend error 130else { 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); СПАСИБО,БУДУ РАЗБИРАТЬСЯ!!!ПОКА СЛОЖНО ДАЕТСЯвсе с эти разобрался! Изменено 10 апреля, 2016 пользователем Старик Ссылка на сообщение Поделиться на другие сайты More sharing options...
Qj Опубликовано 9 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 апреля, 2016 Так к сведению можно воспользоваться GetCurrentTheadID и точно узнать в каких потоках работают боты. У меня сейчас к сожалению нету терминалов где была бы мультиботавая торговля. Изменено 10 апреля, 2016 пользователем Qj Ссылка на сообщение Поделиться на другие сайты More sharing options...
Старик Опубликовано 10 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 апреля, 2016 Тики по разным парам с высокой вероятностью поступают не синхронно.Другое дело как долго бот обрабатывает поступивший тик и не возникает ли при этом наложение. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 10 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 апреля, 2016 Спасибо dermitay за эксперимент. немного не так, как я планировал, но может и хорошо. Видимо Слип запускает временнУю нарезку потока и управление переключается, именно поэтому я писал о работе с текстом... Если МТ может такое проворачивать, значит и во время ожидания ответа сервера может переключить управление. Я наверно продолжу эксперимент dermitay и на демо одновременно попытаюсь открыть 3 ордера на 3 парах. Чтоб не было задержек с принтами может выводить миллисекунды в строковый буфер и по окончании работы выводить в лог? кстати вопрос - время в принтах на момент печати в лог или момент помещения принта в очередь? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 10 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 апреля, 2016 Чтоб не было задержек с принтами может выводить миллисекунды в строковый буфер и по окончании работы выводить в лог? кстати вопрос - время в принтах на момент печати в лог или момент помещения принта в очередь? я хз как это реализовать, когда у тебя три независимых друг от друга экземпляра совы. у каждого свой таймер(об этом кстати в официальной документации сказано, использованный 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) :)) :)) :)) Думаю, все просто, нужно просто сесть один разок и попробовать, реально ничего сложного ни в понимании на уровне абстракций, ни при написании кода.дерзайте!!! :) Изменено 10 апреля, 2016 пользователем dermitay 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
voldemar227 Опубликовано 10 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 апреля, 2016 Ребят мне кажется или Вы высасываете проблему из пальца ?Мультивалютную торговлю лучше делать в одном советнике.Как описал Выше автор большого поста.в настройках вводятся пары и парсятся по разделителю , потому что пары могут быть с префиксом, через стринг сплит не получиться...Используя такой метод мы можем задать приоритет по парам напримерEURUSD;USDCHF;NZDUSD где разделитель ; а EURUSD имеет наивысший приоритет ...Далее в цикле по парам мы начинаем перебор и если по первой паре есть сигнал то другие пары игнорируем, или в зависимости от условий так же просматриваем.Все что нужно от цикла это пошариться по валютам и поискать то что нам нужно... Есть ли там ордера или нет, какое состояние индикаторов, какие цены и прочее ...В случае если нам все равно как должны открываться ордера то мы просто шаримся по парам и если есть сигнал то открываем позицию...Если нам нужно один ордер мы можем пошарившись по парам найти наиболее сильный сигнал и войти по наиболее интересной паре.Если стоит приоритет то шаримся согласно приоритету...Может конечно я не понимаю Вашу проблему, но я не вижу проблем при работе советника в мультивалютном режиме...И еще MarketInfo морально устарела и получение с помощью неё Ask и Bid не самый лучший вариант... При использовании мультивалютной торговли лучше MqlTick 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
JR Опубликовано 10 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 апреля, 2016 Вот такая-же проблема, кстати - http://tlap.com/forum/index.php?topic=11821.msg277567#msg277567 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Сахалинец Опубликовано 11 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 апреля, 2016 Здравствуйте ! Как написать функцию что бы советник закрывал по общему профиту и ордера на покупку и ордера на продажу ? Что то не увидел может просмотрел в каком видео ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 11 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 апреля, 2016 Здравствуйте ! Как написать функцию что бы советник закрывал по общему профиту и ордера на покупку и ордера на продажу ? Что то не увидел может просмотрел в каком видео ? Посмотрите вот этот разделhttps://docs.mql4.com/ru/account/accountprofitну а функцию закрытия всех ордеров уже пару дней назад выкладывали в ветке обучения mql. Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 11 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 апреля, 2016 Свежий урок от Сергея XBMS:-> Как написать индикатор 6 Ссылка на сообщение Поделиться на другие сайты More sharing options...
SVS696 Опубликовано 11 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 апреля, 2016 Доброй(ый) ночи/день у меня такой вопрос: если я хочу закрыть ордер и мне все равно на проскальзывание то я ставлю 0 или просто сразу следующую запятую ставлю т.е. ничего не забиваю? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 12 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 апреля, 2016 SVS696, если мне не изменяет память, то лучше значение slippage максить(ну поставь в 30 или 50, это вполне адекватные значения), если тебе все равно по какой цене закроется ордер. иначе получишь отворот-поворот от сервера брокера. если поставишь запятую, то есть пропустишь значение, компилятор тебя скорее всего пошлет в пеший тур с ошибкой потери параметра функции. 5 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Сахалинец Опубликовано 12 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 апреля, 2016 Нифига не нашёл Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 12 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 апреля, 2016 Нифига не нашёл стоит немножко постараться и вы найдете все что ищите.помню вас по конкурсу, из уважения к вашим достижениям пишу на коленке примитив, показывающий базовую основу удалениявсех ордеров. а вобще это противопоказано делать, так как видя готовые решения вы расслабляете свой мозг и позже, когда будут более сложные задачи, вы не сможете сами найти ответ, так как не смогли решить до этого такие очень легкие вопросы.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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Сахалинец Опубликовано 12 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 апреля, 2016 Пасиб ! Я нашёл что то похожее. //+----------------------------------------------------------------------------+//| Закрытие всех позиций по профиту. |//+----------------------------------------------------------------------------+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();}Сейчас разбираюсь.... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Дмитрий_2008 Опубликовано 13 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 апреля, 2016 Большое Спасибо, за Урок от Сергея по построению индикаторов!!!!Когда начал делать "домашнее задание", заступорился при заполнении буфера значениями "скользящей средней" @-). Ясное дело, решил подсмотреть в оригинальном индикаторе, но там присутствуют "+=" и "/=". Поиски, как это понимать, в "буке по mql" и гугле, не увенчались успехом.Будьте добры, подскажите ссылку где описываются эти (+= ; /=) выражения. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 13 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 апреля, 2016 Будьте добры, подскажите ссылку где описываются эти (+= ; /=) выражения.Смотри здесь Ссылка на сообщение Поделиться на другие сайты More sharing options...
AndreyGold Опубликовано 13 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 апреля, 2016 Кто знает, подскажите плиз - нельзя ли внутри текста программы задавать рабочий спред для тестера ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Дмитрий_2008 Опубликовано 13 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 апреля, 2016 да, это они (в поиске писал += , но ничего не показывало(((0ll. спасибо, спасибо!!! Ссылка на сообщение Поделиться на другие сайты More sharing options...
kocunyc Опубликовано 13 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 апреля, 2016 Ребята, подскажите пожалуйста. есть индикатор, он не обновляется каждый тик, приходится его перезакидывать индикатор в окно, как быть? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Arius777 Опубликовано 14 апреля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 апреля, 2016 Дайте для начала исходник этого секретного индикатора, там видимо в коде что-то не то. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти