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

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

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

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

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 обновится?



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