Я совсем потерялся

 

Я хочу создать "советника", как вы это называете. Хотя забавно, что вы продолжаете использовать его в качестве аббревиатуры, насколько я понимаю, он означает "эволюционный алгоритм", а это именно то, чем на самом деле является мой метод. Если он работает. Что он и делает, если разброс достаточно низок. Это на заборе.

В любом случае, у меня есть опыт программирования. И из того, что я видел, MQL4 выглядит практически так же, как и C++. Но мне не хватает некоторых важных деталей. Я уже знаю о переменных, константах и многих других вещах, но мне нужен какой-то базовый шаблон для работы, и мне немного не хватает нескольких концептуальных вещей. Может ли кто-нибудь выложить какой-нибудь паршивый пример программы торгового робота, которая проста, но имеет все необходимые мне элементы, и объяснить, что делает каждая ее часть, и тогда я смогу сказать "ага, вот как я делаю то, что мне нужно".

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

high, low, open, close данные для цен покупки и продажи (поскольку значение спреда может меняться) за некоторый промежуток времени, который я указываю в программе (если это можно сделать), включая последние данные либо сразу после их завершения (таким образом, каждую минуту, или каждые 5 минут, или каждые 10 минут и т.д., в зависимости от временного интервала) или, возможно, при каждом тике - при каждом изменении цены - в зависимости от того, что из этого можно сделать, я также хотел бы иметь возможность иметь переменную, которая представляет количество времени с момента завершения последнего (так что если это каждые 10 минут, есть переменная, которая обновляется с каждым тиком, который отсчитывает до 10 минут от 0, и когда он достигает 10 минут, есть еще одно обновление данных), Я также хотел бы загрузить общую стоимость счета при ликвидации, загрузить общее количество позиций и размер позиций и тип позиций (например, USD/JPY стоит 10000 или 100000 ДОЛЛАРОВ в иенах, а EUR/USD стоит 10000 или 100000 ЕВРО в долларах, но стоимость моего счета будет в долларах, поэтому нужно иметь возможность определить переменный размер лота позиции). Из текущих цен покупки и продажи программа, конечно, могла бы просто вычесть одну из них из другой, чтобы получить текущее значение спреда.

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

покупать или продавать с помощью рыночных или лимитных ордеров. Также, пожалуйста, скажите, если я поставлю лимитный ордер, но цена, когда он пройдет, могу ли я ожидать, что он даст мне лимитную цену, которую я поставил, или это может быть лучше? Например, предположим, цена EUR/USD для покупки составляет 1.3500, а у меня есть лимитный ордер на покупку по цене 1.3501, заплачу ли я 1.3501 или 1.3500? Должен ли я ожидать, что брокер обманет меня здесь? Или это функционально идентично выставлению рыночного ордера с тем исключением, что если цена будет 1.3502 или больше к тому времени, когда ордер попадет в систему, он не будет исполнен?

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

Также, пожалуйста, скажите, обычно ли это включает более одного фактического файла (с расширением mql4?), как это может быть в C++, или это обычно один единственный файл mql4, и компилируется ли он торговой платформой, или мне нужен какой-то компилятор для этого, а затем торговая платформа использует машинный код или то, что генерируется компилятором?

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

 
Еще лучше, если переменная, которая начинается с 0 и отсчитывается до 10 минут (или любое другое время, которое вы используете), должна быть нормализована - разделена на единицу времени - так, чтобы это было двойное число, которое изменяется между 0 и 1. Я говорю это на случай, если возникнет проблема с масштабным коэффициентом. Таким образом, возможно, это можно применить к 5-минутному графику, или 10-минутному, или 1-минутному, но независимо от единицы времени, эта переменная всегда будет между 0 и 1.
 
Не существует такой программы, которая за один раз даст вам все, что нужно знать о mql4. Я рекомендую просмотреть кодовую базу для примера ea, поскольку вы уже немного программируете. Если вы не любите учиться, просматривая коды, а предпочитаете объяснять язык, то обратитесь к книге mql4_book. Также есть документация для легкого ознакомления.
 
Я спрашивал, может ли кто-нибудь написать его. Если вы знаете базовый формат языка, это займет около 5 минут, примерно столько же, сколько ушло на чтение моего сообщения. Просто напишите программу, напечатайте пример каждой из этих вещей и выложите его. Я посмотрел книгу по mql4, она сразу переходит от объяснения, что такое переменная, к предположениям о моих знаниях о функциях, и я засыпаю, пытаясь найти точку перехода от более простого, чем мне нужно, к более сложному, чем я готов постичь. Знаете, я не прошу кого-то написать для меня "экономического советника", просто какую-то глупую штуку, в которой есть все инструкции, которые я могу захотеть использовать. Какую-то штуку, которая загружает в переменные на моем компьютере любую информацию, которую я могу захотеть использовать, и каждую инструкцию, которую я могу захотеть ввести - и теперь, когда я думаю об этом, я бы хотел, чтобы это были не только лимитные и рыночные ордера на покупку и продажу, но и что-то, что отменяет все существующие ордера, в конце концов, я бы не хотел оставлять неисполненными лимитные ордера, если они не будут исполнены, я бы не хотел, чтобы программа забыла о них.
 
zortharg: Я спрашивал, напишет ли кто-нибудь такой код. Если вы знаете базовый формат языка, это займет около 5 минут, примерно столько же, сколько ушло на чтение моего сообщения. Просто напишите программу, напечатайте пример каждой из этих вещей и выложите его. Я посмотрел книгу по mql4, она сразу переходит от объяснения, что такое переменная, к предположениям о моих знаниях о функциях, и я засыпаю, пытаясь найти точку перехода от более простого, чем мне нужно, к более сложному, чем я готов постичь. Знаете, я не прошу кого-то написать для меня "экономического советника", просто какую-то глупую штуку, в которой есть все инструкции, которые я могу захотеть использовать. Какую-нибудь штуку, которая загружает в переменные на моем компьютере любую информацию, которую я могу захотеть использовать, и каждую инструкцию, которую я могу захотеть ввести - и теперь, когда я думаю об этом, я бы хотел, чтобы это были не только лимитные и рыночные ордера на покупку и продажу, но и что-то, что отменяет все существующие ордера, в конце концов, я бы не хотел оставлять неисполненными лимитные ордера, если они не будут исполнены, я бы не хотел, чтобы программа забыла о них.

Думаю, вы обратились не по адресу.

На этом форуме мы не пишем коды для других людей.

Мы ожидаем, что вы сами напишете свой код.

Если вы застрянете, мы укажем вам правильное направление.

Если вы хотите, чтобы кто-то писал коды для вас, тогда идите сюда.

Они делают mql4 и mql5.

 
zortharg:

[...]

Ну, это сменит обсуждение крупного обновления MT4, которое должно произойти через несколько дней.


Я хочу создать "советника", как вы это называете. Хотя забавно, что вы продолжаете использовать это слово в качестве аббревиатуры.

Зависит от вашего опыта. К лучшему или худшему, MT4 и MQL4 в настоящее время имеют почти монополию на мировом розничном рынке FX, и термин "советник" имеет значение, как минимум, для сотен тысяч людей.


И из того, что я видел, MQL4 выглядит практически так же, как C++.

Существует фактически две версии языка MQL4. Та, которая существует последние 9 лет, не имеет классов и объектов и поэтому больше похожа на C, чем на C++. С другой стороны, в нем нет указателей и явного выделения памяти.

В новой версии MT4 и MQL4, которая должна выйти в следующий понедельник, добавлены классы, но опять же без явного выделения памяти и управления ею. Можно спорить, что это больше похоже на C++ или на Javascript, но без "утиной" типизации, лямбда-функций и т.д.


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

Если немного упростить, то платформа делает это за вас автоматически, и у вас нет простых способов переопределить ее стандартное поведение. Загрузка любых внешних ценовых данных и последующее манипулирование ими в MQL4 - особенно в традиционном MQL4, а не в новой расширенной версии - не очень красиво.

Вы можете получить текущие цены, и вы можете легко манипулировать историческими ценами для всех таймфреймов, которые обслуживает платформа: M1, M5, M15 и т.д., но не M3, H2 и т.д.


данные о максимумах, минимумах, открытиях и закрытиях для цен покупки и продажи (поскольку величина спреда может варьироваться).

Спред действительно может меняться, но одна из очаровательных идиосинкразий платформы MT4 заключается в том, что она предоставляет только исторические цены на покупку. (Текущие цены и текущий спред, очевидно, доступны).


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

По сути, платформа постоянно передает эти данные. Нет никакой явной "загрузки" этих данных. Например, код MQL4 постоянно имеет доступ к текущему эквити счета через функцию AccountEquity(). Открытые позиции автоматически отображаются в валюте вашего депозита.


Например, предположим, что цена EUR/USD для покупки составляет 1.3500, а у меня есть лимитный ордер на покупку по цене 1.3501, я заплачу 1.3501 или 1.3500?

Это зависит от брокера, но в целом платформа/брокер просто не примет лимитный ордер на уровне или выше текущего BBO. Я не могу сразу вспомнить исключение из этого правила.


если он обычно включает в себя более одного фактического файла (с расширением mql4?), как это может быть в C++, или если он обычно состоит из одного единственного файла mql4.

Вообще говоря, проект может состоять только из одного файла .mq4, но в нем может быть несколько #included .mqh файлов. Поэтому вы можете иметь общие библиотеки кода и повторно использовать их между проектами. Чего нельзя делать, так это иметь несколько файлов .mq4, которые существуют pari passu, т.е. компилируются вместе как часть одного проекта. Несмотря на то, что MQL4 был создан на языке C, структура типичного большого проекта отличается: один файл .mq4, плюс одна или несколько библиотек различного типа (предварительно скомпилированных или включенных).


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

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


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

Не самое подходящее время. Все на этом форуме слишком заняты спорами о первом действительно значительном обновлении MQL4 за 9 лет.

 
zortharg: Я спрашивал, напишет ли кто-нибудь такую книгу.
У вас есть только три варианта: Искать,учиться кодировать или платить кому-то. Мы не собираемся кодировать его за вас. Мы готовы помочь вам, если вы опубликуете свою попытку (используя SRC) и суть вашей проблемы.
 

Я не просил никого производить для меня что-то, имеющее коммерческую ценность. Я не прошу кого-то "кодировать мой метод ДЛЯ МЕНЯ", WHRoeder. Мне просто нужна отправная точка. Возможно, я смогу что-то понять по ссылке, которую вы разместили в разделе "поиск", хотя я действительно хотел бы получить "голые кости" "вот что нужно". Я не знаю, как на самом деле должна выглядеть программа. Я не знаю, что в ней должно быть строго обязательно. Если я попытаюсь сделать это сам, не имея никаких ориентиров, я просто получу ошибки компилятора, потому что я даже не буду знать, чего в ней не хватает. А если я сделаю что-то, что должно работать, я инициализирую это неправильно и даже не буду знать, что сделал это правильно. Хорошо, как насчет этого. Простой пример. Что-то, что потеряет ваши деньги, если вы сделаете это в реальной жизни: советник, который поддерживает позицию, которая равна daringness*(стоимость вашего счета)*(разница между ценой сейчас и ценой 1 единицу времени назад)/X, и X начинается с 1, но каждую единицу времени X обновляется, чтобы быть X=.9*X+.1*(цена сейчас-цена 1 единицу времени назад)^2, и daringness - это параметр, задаваемый пользователем. И чтобы определить, сколько купить или продать, он должен определить, сколько позиций уже принадлежит ему. Так что это просто тупая программа, но в ней есть все элементы, которые мне нужны для работы в качестве отправной точки.

gchrmt4 спасибо. Вы ответили на многие мои вопросы. Но когда вы говорите "вы можете легко манипулировать историческими ценами для всех таймфреймов, которые обслуживает платформа", как мне это сделать? Есть ли функция, подобная AccountEquity(), которая возвращает цену в определенное время, и вы указываете ей единицы времени назад и хотите ли вы, чтобы было открыто низкое высокое закрытие и какой тип единиц времени она использует? Определяется ли тип единиц времени типом графика, к которому вы его применяете? То есть, если вы применяете его к 1-минутному графику, 1 единица времени назад относится к 1 минуте назад, но если вы применяете его к 5-минутному графику, 1 единица времени назад относится к 5 минутам назад, или временной шаг жестко закодирован в самой программе, а не применяется к графику? И текущий спред, как я могу получить к нему доступ? Вы говорите, что эти вещи "потоковые" и легко доступны, но как к ним получить доступ?

Спасибо за любую помощь, которую вы решите оказать.

 
zortharg:
Существует ли функция, подобная AccountEquity(), которая возвращает цену в заданное время, и вы указываете ей единицы времени назад и хотите ли вы, чтобы было открыто low high close и какой тип единиц времени она использует? Определяется ли тип единиц времени типом графика, к которому вы его применяете? То есть, если вы применяете его к 1-минутному графику, 1 единица времени назад относится к 1 минуте назад, но если вы применяете его к 5-минутному графику, 1 единица времени назад относится к 5 минутам назад, или временной шаг жестко закодирован в самой программе, а не применяется к графику? И текущий спред, как я могу получить к нему доступ? Вы говорите, что эти вещи "потоковые" и легко доступны, но как к ним получить доступ?

Спасибо за любую помощь, которую вы решите оказать.

Существует целое семейство функций временных рядов. Например, iHigh("USDJPY", PERIOD_H1, 2) даст вам максимум бара USDJPY H1 на 2 бара назад (где текущий текущий бар - #0). Существуют функции для преобразования времени в индексы баров.

Текущий спред доступен в нескольких вариантах. Самым простым является Ask - Bid (что дает вам спред для символа, на графике которого запущен ваш код). Спред для символа, отличного от текущего графика, доступен разными путями и выражается в разных терминах, например, MarketInfo("symbol", MODE_ASK) - MarketInfo("symbol", MODE_BID) или MarketInfo("symbol", MODE_SPREAD).

 

@zortharg

Есть такая штука, как документация, здесь (частично устаревшая): docs.mql4.com/

и здесь (скоро появится, частично неприменимо): mql5.com/en/docs


Там вы найдете все, что когда-либо хотели знать; также есть примеры в самом терминале. Примеры скриптов, советников и индикаторов. А также вы можете импортировать DLL, чтобы выполнить вещи, которые выходят за рамки MQL.

Если вы можете получить это оттуда, вы готовы, а если нет, что ж...


 

Я понимаю вашу просьбу, рабочий пример для начала очень полезен.

https://www.mql5.com/en/code

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

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

start() {

   SearchOrders();
   DetectEnvironment();      
   UpdateIndicators();
   RiskAssessment();
   CalcVolume();
   if( EnterSignal() ) OpenOrder();
   if ( ExitSignal() ) CloseOrder();
   TrailingStop();
   DisplayInfos();

}