Форум » Предлагаю услуги программиста на MQL 4. » Арбитраж на ценах брокеров » Ответить

Арбитраж на ценах брокеров

Максим: Предлагаю всем, у кого хватит мощности попробовать свои силы в написании арбитражного советника, работающего на разности котировок различных брокеров. Идея такова: если Bid брокера А больше Ask брокера В, то одновременно продаём лот у брокера А и покупаем лот у брокера В. Закрываемся когда цены брокеров становятся равными.

Ответов - 24, стр: 1 2 3 All

SK: Это ненадолго. Брокер будет сопротивляться. Посмотрите здесь: http://autograf.dp.ua/Pages/7/72/724/724.htm

Максим: Сергей, брокер будет сопротивляться? Каким образом? Если брокер заблокирует моего советника, то я изменю его название, перекомпилирую наконец. Если брокер заблокирует любого моего советника, то обращусь в службу технической поддержки за разъяснениями, естественно будут писать разговор, потом в инет выложу. На самом деле считаю, что у брокера не так много рычагов. Реальны проскальзывания, задержки с исполнением ордеров, но это технически решаемые вопросы, надо только правильно собрать доказательства этих действий. У меня был опыт в 2008 году, когда я удачно открыл позицию по паре рубль доллар, когда профит достиг 6 килобаксов брокер стал срочно уменьшать плечо, сначала сделал 1 к 20, через пару дней 1 к 10, потом 1 к 5. Всё, вот их единственный реальный рычаг.

Scriptong: Я бы не сказал, что это их единственный рычаг. Если вести речь о различных ухищрениях, то их огромное количество. Не забывайте - вы торгуете на площадке брокера и по его правилам. С другой стороны, для арбитражных советников брокер не будет опускаться до подобных действий (если это не какой-нибудь маленький брокер с сотней клиентов), т.к. подобная тактика торговли сама себя изживет. Все дело в том, что описываемая вами закономерность не является постоянной, и успешно использовать ее на протяжении длительного времени не получится. Чаще всего вы будете попадать в лок с убытком, равным разнице котировок двух брокеров плюс два спреда.


Максим: Scriptong, надо открывать позицию учитывая два спрэда и проскальзывание и добавив немного профита. Мне эта тема интересна не ради наживы, а для удовлетворения любопытства. Реально ли брокеры подкручивают котировки? как часто? с какой амплитудой? Самому пока решить такую задачу не по зубам. Не знаю как осуществлять ввод-вывод информации с двух метатрейдеров в реальном времени. Через текстовый файл? Плюс, одному не охватить всего многообразия брокеров, которых надо исследовать. Какие рычаги есть у брокера? Он может выдавать для меня персональные котировки, чтобы загнать в убыток именно моего советника? Или все трейдеры видят как меня убивает брокер? Или это паранойя?

Максим: Арбитраж работает всегда!

SK: Максим пишет: Сергей, брокер будет сопротивляться? Каким образом? Если брокер заблокирует моего советника, то я изменю его название, перекомпилирую наконец. Если брокер заблокирует любого моего советника, то обращусь в службу технической поддержки за разъяснениями, естественно будут писать разговор, потом в инет выложу. Брокер не знает название Вашего советника, такой возможности у него нет. В целом, нужно исходить из того, что брокер не дурак. Обычно в брокерских компаниях работают люди с опытом, они хорошо знают все ухищрения работы на выбросах. Брокер просто собирает статистику. Они увидят сделки на выбросах, а это значит, что Вы торгуете не на рынке, а с самим брокером. Извлекать прибыль из кармана брокера - это, знаете ли.. действует на брокера как красная тряпка на быка. Брокер может начать исполнять Ваши торговые приказы с проскальзыванием, может отдавать реквот. И публичное охаивание брокера ни к чему не приведёт. Возможно, Вы сможете убедить стороннего слушателя в том, что брокер плохой. Но как средство давления на брокера это не годится - заработать таким способом всё равно не дадут. Исключение составляет работа на микро счетах некоторых брокеров. Для них это настолько мелочно, что они исполняют торговые приказы на микро автоматически, а в статистику вообще не заглядывают (до тех пор, пока объёмы сделок микро). Так можно по полцента за год заработать долларов пять.. : )

SK: Максим пишет: Арбитраж работает всегда! Не нужно питать иллюзии. Не Вы первый. Многие наступали на эти грабли. Нужно отличать теорию от практики. Они же тоже деньги считают, причём, без иллюзий.

Максим: Выходит, у брокера существует только две реальные возможности бороться с трейдерами проскальзывание и реквот. Правильно я понимаю, что оба эти варианта вызывают false у функции OrderSend и OrderClose? Теперь вопрос к специалистам по языку программирования: как правильно вести учёт подобных явлений? Кусочек кода если можно?

Scriptong: Максим пишет: Выходит, у брокера существует только две реальные возможности бороться с трейдерами проскальзывание и реквот. Намного больше. Видов ошибок существует очень много (см. Коды ошибок) и каждая из них - свой особый инструмент. Максим пишет: Правильно я понимаю, что оба эти варианта вызывают false у функции OrderSend и OrderClose Для OrderClose - да, для OrderSend - неправильно, т.к. она возвращает результат типа int, в котором указывается номер ордера (тикет). Если результат больше нуля - приказ исполнен. Если меньше нуля, то это ошибка, код которой можно узнать вызвав функцию GetLastError. Ссылка на коды ошибок дана выше. Максим пишет: Теперь вопрос к специалистам по языку программирования: как правильно вести учёт подобных явлений? Не знаю, как правильно, но думаю, что стоит начать со сборщика тиков. Хотя этот метод был разработан для других целей. На мой взгляд, толку от ведения подобной статистики нет. К примеру, вы собрали такую статистику и делаете вывод, что брокер большинство ваших приказов исполняет с проскальзыванием (отложенные ордера) или реквотами (рыночные ордера). Что вам это дает? 1. Предъявить претензию брокеру? Любой брокер укажет вам на пункт в договоре, который гласит, что котировки, получаемые вами, носят чисто информационный характер. То есть он вовсе не обязан выполнять ваши приказы по этим ценам. 2. На рынке есть такое понятие как ликвидность, т.е. реальное обеспечение цен объемами заявок. Вполне может быть ситуация, когда на объем вашего приказа не был найден противоположный приказ по данной цене. Брокер в этом случае берет худшую для вас цену и т.д., пока не выполнит весь приказ. 3. А может быть вы любите торговать на быстротечном рынке, когда у брокера действительно много приказов? В этих случаях описанные две ситуации - нормальное явление. Выбор брокера нужно осуществлять, исходя из своих предпочтений, которые также зависят от выбранной вами стратегии. Есть брокеры, которые открыто зазывают пипсовщиков и реально обеспечивают им все условия для торговли. Есть и противоположные им ДЦ, которые в договорах явно указывают критерии определения пипсовки. Такие сделки впоследствии аннулируются. Нужно понимать, что в любой игре (а жизнь ведь тоже - игра) есть правила, которые можно вполне законно обойти. В обычной жизни таких людей наказывают при помощи самосуда, т.к. законных мер воздействия на него нет. В ситуации с торговлей на Форекс это вполне может сделать брокер. Поэтому не нарушайте правила игры, даже если нашли в них изъян. Расплата придет, и не стоит на нее обижаться. Заработайте для себя и честно отдайте комиссию в виде спреда брокеру. Тогда и к вам будет такое же отношение.

Максим: Scriptong пишет: Нужно понимать, что в любой игре (а жизнь ведь тоже - игра) есть правила, которые можно вполне законно обойти. В обычной жизни таких людей наказывают при помощи самосуда, т.к. законных мер воздействия на него нет. В ситуации с торговлей на Форекс это вполне может сделать брокер. Поэтому не нарушайте правила игры, даже если нашли в них изъян. Расплата придет, и не стоит на нее обижаться. Заработайте для себя и честно отдайте комиссию в виде спреда брокеру. Тогда и к вам будет такое же отношение. Вы можете сформулировать этические правила игры, которые не надо нарушать, по которым мой советник не должен открывать или закрывать позицию? Я не против того, чтобы мой советник зарабатывал честно, и отдавал спред брокеру. Есть всего два варианта OrderClose и OrderSend. Честно это как?

Scriptong: Максим пишет: Вы можете сформулировать этические правила игры, которые не надо нарушать, по которым мой советник не должен открывать или закрывать позицию? Этика и мораль - это наше воспитание. Поэтому для каждого человека они различны. На мой взгляд эти правила таковы: 1. Не использовать нерыночные котировки (шпильки). Программно такие котировки можно отследить по мгновенному (от предыдущего тика до текущего) падению или росту цены на 10 и более процентов. Это значение навскидку. Возможно, его необходимо пересмотреть. 2. Не посылать слишком частые торговые запросы. В своих экспертах я использую торговые операции один раз за один бар. При этом на минутках я никогда не торгую. Получаем, что торговые запросы будут поступать на сервер не чаще, чем 1 раз в 5 минут. А если торговать на более высоких таймфреймах, то периодичность будет еще меньше. 3. Не ставить Stop Loss и Take Profit на границе минимального уровня стопов (Stop Level), что увеличивает вероятность получения ошибки 130. Понятно, что для исполнения таких правил одного воспитания недостаточно, т.к. нужно еще уметь правильно реализовать их в коде. Значит, приходим к выводу, что для "честности" требуется еще и образование. В принципе, это так и есть, т.к. чем больше знаешь и осознаешь, тем меньше неблаговидных поступков совершаешь - они просто перестают интересовать.

Максим: Scriptong пишет: 2. Не посылать слишком частые торговые запросы. В своих экспертах я использую торговые операции один раз за один бар. При этом на минутках я никогда не торгую. Получаем, что торговые запросы будут поступать на сервер не чаще, чем 1 раз в 5 минут. А если торговать на более высоких таймфреймах, то периодичность будет еще меньше. Что подразумевается под торговым запросом? Запрос текущих значений Bid, Ask, текущего времени или OrderSend, OrderClose?

Scriptong: Максим пишет: Что подразумевается под торговым запросом? К ним относятся функции, отправляющие запрос на сервер в торговом потоке. Таких функций всего пять: OrderSend, OrderClose, OrderModify, OrderCloseBy, OrderDelete. Торговый поток работает в синхронном режиме, т.е. программа при вызове этих функций не будет исполняться далее, пока вы не получите ответ от сервера. В МТ4, помимо торгового потока, есть поток данных (к сожалению, не знаю, как точно называется; возможно таких несколько), через который вы получаете котировки и информацию о рыночном окружении. Поток асинхронный. То есть, отправив запрос, вы получаете ответ не сразу, а спустя некоторое неопределенное время. Программа продолжает свое выполнение. На этот поток вы влияете, когда обращаетесь к историческим данным при помощи функций доступа к таймфсериям. В этом случае очень мала вероятность навлечь на себя гнев брокера, т.к. после первого обращения к несуществующим у вас на компьютере данным эти данные закачиваются и впоследствии вы их получаете без отправки запроса на сервер.

Максим: Спасибо за интересную информацию. Меня интересует асинхронный поток данных. Если мой советник анализирует информацию по мере её поступления, то есть не пользуется таймсериями, то возможна ли такая коллизия, что предыдущие данные о цене могут задержаться в пути и прийти чуть позже более поздних данных? То есть надо усложнять программу и вместе с бидом и аском проверять метку времени? Может неучёт этого фактора и приводит к худшим результатам работы советника в реале по сравнению с тестом?

Scriptong: Максим пишет: Если мой советник анализирует информацию по мере её поступления, то есть не пользуется таймсериями, то возможна ли такая коллизия, что предыдущие данные о цене могут задержаться в пути и прийти чуть позже более поздних данных? Да, об этом и речь. Поэтому для получения данных с других таймфреймов или других валютных пар в советниках (в индикаторах не получится, т.к. там Sleep не работает) я использую вот такую функцию: //+-------------------------------------------------------------------------------------+ //| Получение времени открытия дня Num | //+-------------------------------------------------------------------------------------+ datetime GetTime(int Num) { datetime Res; // Результат вычисления функции int P = 0; // Счетчик обращения к данным while (P < 120) // Обращение не более 120 раз подряд { Res = iTime(NULL, PERIOD_D1, Num); if (GetLastError() != 4066) break;//Ошибка 4066 свидетельствует о неготовности данных Sleep(1000); // Пауза 1 сек. для того чтобы данные успели обновиться P++; // Увеличение счетчика } if (P == 120) // Если выход из цикла по причине переполнения счетчика (долго ждали) return(0); // то функция вернет ошибку return(Res); // Если же цикл прервался успешным получением значения, то функция // вернет Res } Вместо iTime может быть обращение к любой другой таймсерии.

SK: Максим пишет: То есть надо усложнять программу..? Вообще-то, есть ребята, которые зарабатывают на сверх малых целях с очень большой частотой, - буквально на шероховатости рынка. Эти ребята, конечно, нам не чета. Например, оборудование у них такое, что нам и не снилось. Мощности и скорости обычных процессоров им не хватает, они изготавливают вычислительную часть машины на основе видеокарт (уж не знаю как, но скорость обработки инф. получается выше). И для них критично расстояние от их сервера до сервера на Wall Street. Они платят миллионы за аренду чердачных помещений, лишь бы быть поближе. И конкуренция в этом сегменте очень высока - кто первый успел, того и тапки. Использовать для заработка на шероховатости рынка обычное оборудование (главным образом, речь об ограничениях интернет) и котировки брокера нет смысла. Там такие запаздывания, настолько низкая надёжность, что расчитывать на результат не следует. И главное. Каким бы этот "арбитраж" не был, нужно понимать, что источником дохода при заработках на шероховатости является карман брокера. Пройдёт неделя, и каждый из брокеров-участников-арбитража вычислит: ага, парень ситематически зарабатывает, а за счёт чего? а стрижёт широховатость; дык, это ж за наш счёт! секир-башка ему! И начнутся реквоты, запаздывания, нервы и.. обычно всё это заканчивается повышением осознанности трейдера, причём как правило, пропорционально потерям его депозита.

Максим: SK пишет: Вообще-то, есть ребята, которые зарабатывают на сверх малых целях с очень большой частотой, - буквально на шероховатости рынка. Эти ребята, конечно, нам не чета. Например, оборудование у них такое, что нам и не снилось. Мощности и скорости обычных процессоров им не хватает, они изготавливают вычислительную часть машины на основе видеокарт (уж не знаю как, но скорость обработки инф. получается выше). И для них критично расстояние от их сервера до сервера на Wall Street. Они платят миллионы за аренду чердачных помещений, лишь бы быть поближе. И конкуренция в этом сегменте очень высока - кто первый успел, того и тапки. Наверно это всё-таки очень забавная сказка! ) Как в фильме ДМБ: "- Вот ты, не видишь инопланетян, и я не вижу... а они есть!"

Максим: Scriptong пишет: для получения данных с других таймфреймов или других валютных пар в советниках (в индикаторах не получится, т.к. там Sleep не работает) я использую вот такую функцию: Что-то я не понял, зачем надо ждать 2 минуты чтобы получить данные текущего бара.(неужели даже дневные бары могут перепутаться?) И из этого хитрого цикла мы выходим по ошибке 4066, то есть результатом работы этой функции является время последнего успешного бара? Получив это время мы можем быть уверены, что текущие Bid и Ask соответствуют этому времени?

Максим: Scriptong, прошу прощения != принял за ==. Но получается ещё хитрее. Выход из цикла при любой ошибке кроме 4066? Зачем это надо?

Максим: Scriptong, или плановый выход из цикла когда GetLastError() =0? А точно это точно что при успешном завершении функции iTime, last_error обновится?

Scriptong: Максим пишет: Что-то я не понял, зачем надо ждать 2 минуты чтобы получить данные текущего бара.(неужели даже дневные бары могут перепутаться?) И из этого хитрого цикла мы выходим по ошибке 4066, то есть результатом работы этой функции является время последнего успешного бара? Выход из цикла осуществляется в двух случаях: 1. Получено запрошенное значение. Срабатывает строка GetLastError() != 4066, т.е. ошибки "запрошенные котировки находятся в стадии обновления" нет. 2. Прошло 2 минуты ожидания (никто не запрещает изменить это значение на любое другое, которое вы считаете более адекватным), в течение которых мы все время получали ошибку 4066 (условие выхода по break не срабатывало). В первом случае функция GetTime возвращает актуальное запрошенное значение, с которым можно работать. Во втором случае функция возвращает 0, т.е. данные получить не удалось. Дальше уже принимайте решение, которое удовлетворяет вашему алгоритму. В своих экспертах я выводил сообщение пользователю, уведомляя о задержке в работе эксперта и предпринимал следующую попытку получения данных. Получив это время мы можем быть уверены, что текущие Bid и Ask соответствуют этому времени? Никакого отношения к Bid и Ask эта функция не имеет. Я показал пример получения исторических данных (времени открытия указанного бара дневного таймфрейма). Предполагается, что эксперт в это время работает на другом таймфрейме. Если вам нужно получить не время открытия, а, например, цену открытия бара, то потребуется создать подобную функцию, но внутри ее использовать другую таймсерию: iOpen, а не iTime. И таким же образом для любой другой таймсерии. Bid и Ask - это не исторические данные. Их значения для другого символа получают при помощи запросов: MarketInfo("имя символа", MODE_BID); MarketInfo("имя символа", MODE_ASK); Эти данные вы получаете сразу же (если правильно указали имя символа). Никакого ожидания в этом случае не нужно.

SK: Максим пишет: Наверно это всё-таки очень забавная сказка! ) Как в фильме ДМБ: "- Вот ты, не видишь инопланетян, и я не вижу... а они есть!" Я не ничего выдумываю.

Максим: Scriptong, разве при успешном завершении функции iTime, GetLastError() изменит своё значение? Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает?

Scriptong: Максим пишет: разве при успешном завершении функции iTime, GetLastError() изменит своё значение? Изменит. В ней будет содержаться 0 (нет ошибки). Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? Посмотрите здесь внизу список функций, которые не изменяют значение last_error. Все остальные функции изменяют это значение. Некоторые только в случае ошибки (таблица выше на той же странице), а остальные - всегда. А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает? Нет. Это функция, которая запрашивает состояние внутренней переменной терминала, объявляемой для каждой новой программы MQL4. Поэтому при запросе через iTime значений, которых нет на компьютере, вы сразу же получаете значение iTime = 0, а если спросите GetLastError, то получите 4066 (дальнейшие запросы GetLastError дадут вам 0 до исполнения другой функции). При следующем запросе iTime вы получите либо запрошенные данные, либо опять 0 и ошибку в GetLastError.



полная версия страницы