MQL для чайников, программирование на MQL4, MQL5
25 Мар
Столкнулся с проблемой и вот уже третий день бьюсь и решить не могу. В готовом советнике решил вместо лота ввести % риска, поэтому нужен расчёт лота к стопу, например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1 а вот при стопе 200 лот уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне. Надеюсь всё понятно изложил.
Для расчета лота в зависимости от стоплосса мы должны знать стоимость 1 пункта.
Расчет стоимости пункта
Все валютые пары можно условно разделить на три категории — пары с обратной котировкой (EURUSD, GBPUSD), пары с прямой котировкой (USDJPY, USDCHF) и кросс-курсы (GBPCHF, EURJPY и т.п.).
1. Для валютных пар с обратной котировкой стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика.
Для валютных пар с обратной котировкой стоимость пункта постоянна и не зависит от текущей котировки.
Пример:
Для EURUSD размер лота 100,000 евро, размер тика — 0.0001
PIP = 100,000 * 0.0001 = $10.00
2. Для валютных пар с прямой котировкой стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE / CURRENT_QUOTE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика, CURRENT_QUOTE — текущая котировка пары.
Для валютных пар с прямой котировкой стоимость пункта меняется в зависимости от текущей котировки.
Пример:
Для USDJPY размер лота 100,000 долларов, размер тика — 0.01. При котировке USDJPY 114.66
PIP = 100,000 * 0.01 / 114.66 = $8.72
3. Для кросс-курсов стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика, BASE_QUOTE — текущая котировка базовой (первой) валюты к доллару США, CURRENT_QUOTE — текущая котировка пары.
Для кросс-курсов стоимость пункта меняется в зависимости от текущих котировок как самой пары, так и базовой валюты.
Пример:
Для GBPJPY размер лота 100,000 фунтов, размер тика — 0.01, базовая валюта — GBPUSD. При котировке GBPJPY 230.82 и котировке GBPUSD 2.0107
PIP = 100,000 * 0.01 * 2.0107 / 230.82 = $8.71
Разработчики MetaTrader позаботились об этом и предоставили нам функцию: MarketInfo(Symbol(),MODE_TICKVALUE) — стоимость 1 пункта в валюте депозита для 1 лота. Напишем скрипт для расчета лота:
//±-----------------------------------------------------------------+
//| Расчет лота в зависимости от размера стоплосса |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property show_inputs
extern int MaxRisk=2;
extern int StopLoss=100;
//±-----------------------------------------------------------------+
int start()
{double Free =AccountFreeMargin();
double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor((Free*MaxRisk/100)/(StopLoss*LotVal)/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
Alert(Lot);
return(0);}
//±-----------------------------------------------------------------+
Скачать скрипт: lotstop.mq4
10 Янв
На предыдущих уроках по изучению языка MQL мы написали скрипт Metatrader4 — «test» для расчета лота. Теперь мы знаем сколько использовать средств для торговли и можем спокойно открывать ордера в Metatrader 4 автоматически.
Но зачем их открывать в ручную если это можно поручить компьютеру? Да и не удобно запускать скрипт на Metatrader 4, а потом еще открывать ордер. Опять же цена между этими действиями не стоит на месте, а постоянно меняется и мы можем потерять несколько пунктов прибыли.
Давайте научим наш скрипт открывать ордера автоматически. Для этого, нам нужно определиться какие ордера он должен открывать. В MetaTrader можно использовать как рыночные ордера (открываемые по текущей цене) так и отложенные(автоматически открываемые брокером при достижении цены заданного уровня).
В нашем тестовом скрипте на MQL4, мы будем открывать рыночные ордера так как мы обучаемся, а любое обучение идет от простого к сложному.
Все эти типы ордеров програмно открываются одной и той же функцией: OrderSend().
Кроме того ордера бывают на покупку и на продажу валюты. Значит скрипту надо указать эти сведения.
Введем в параметры нашего скрипта еще 2 параметра:
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=false; //для открытия ордера на продажу
Оба параметра имеют логический (bool) тип. Значит они будут принимать только два значения: true (истина) и false (ложь). Мы установили их значение в false чтобы при запуске нашего скрипта в MT4 с параметрами по умолчанию ничего не происходило. Если бы мы установили их в true то при запуске с параметрами по умолчанию у нас открылось 2 ордера. Один на покупку, а второй на продажу. В большинстве случаев нам это не нужно. Будем при запуске говорить скрипту «какой ордер открыть».
Тип ордера мы теперь можем указать скрипту, но осталось непонятно как указать стоплосс и тейкпрофит. Согласитесь, что их тоже желательно указывать в параметрах. Например так:
extern int TakeProfit=100;
extern int StopLoss=100;
мы выбрали тип int (целое число), а скрипту поручим переводить их в пункты в зависимости от котировки валютной пары. Для этого достаточно их умножить на служебную переменную Point (размер пункта текущего инструмента в валюте котировки).
Но а как быть если наша стратегия не подразумевает установку тейкпрофита или стоплосса?
воспользуемся знакомой нам функцией проверки условия if:
double buyTP=0; //тейкпрофит для покупки
double sellTP=0; //тейкпрофит для продажи
double buySL=0; //стоплосс для покупки
double sellSL=0; //стоплосс для продажи
if(TakeProfit>0)
{buyTP=Ask+TakeProfit*Point;
sellTP=Bid-TakeProfit*Point;}
if(StopLoss>0)
{buySL=Ask-StopLoss*Point;
sellSL=Bid+StopLoss*Point;}
Здесь мы использовали фигурные скобки чтобы после проверки условия выполнялась не одна команда, а несколько.
Итак, наши команды для открытия ордеров будут выглядеть:
if(Buy) OrderSend(Symbol(),OP_BUY,Lot,Ask,3,buySL,buyTP,"«,0,0,CLR_NONE);
if(Sell) OrderSend(Symbol(),OP_SELL,Lot,Bid,3,sellSL,sellTP,»",0,0,CLR_NONE);
С помощью функции if() мы проверяем какой ордер нужно открыть. А функцией OrderSend() открываем.
Функция OrderSend() достаточно сложная и требует много параметров.
Давайте разберемся с ними: (далее…)
9 Янв
На предыдущем уроке Язык MQL — Урок 3 «расчет лота» мы научили наш скрипт «test» рассчитывать лот в зависимости от свободных средств на торговом счете форекс. Но чего то ему не хватает, давайте взглянем еще раз на рисунок:
Вот оно!!! — Лот у нас получился с 4 знаками после запятой. А брокер форекс требует 2 знака после запятой. Конечно в ручную не составит труда откинуть лишние 2 знака, но мы стремимся автоматизировать нашу торговлю, т.е. всю работу свалить на компьютер. Кроме того — на рисунке не понятно по какой валютной паре рассчитан автоматически лот. Да и цифру максимального риска не помешает видеть на экране монитора.
Итак, давайте продолжим улучшать наш скрипт «test».
Для начала заставим компьютер отбрасывать лишние цифры. Округлять нельзя. Ведь при округлении получится не то что нам надо (нам надо 0.06, а при округлении будет 0.07 - это больше указанного нами риска).
Для того чтобы узнать сколько знаков после запятой разрешено вашим брокером форекс — воспользуемся известной нам функцией MarketInfo(string symbol, int type).
Только вторым параметром будем передавать MODE_LOTSTEP — шаг изменения размера лота.
double Step =MarketInfo(Symbol(),MODE_LOTSTEP); переменная Step будет содержать шаг изменения лота.
Если разделить наш лот на шаг (например 0.01) мы получим: 0.0684/0.01=6.84
Теперь возьмем целую часть от этого числа (функция MathFloor()) = 6 и умножим на шаг (0.01) получим 0.06 (то что и требовалось).
Объединим это с нашим расчетом:
double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
результат:
Получилось отлично.
Осталось добавить информацию о валюте и риске в выводимое окно.
Риск содержится в переменной MaxRisk, а текущая валюта выдается функцией Symbol().
Все это мы знаем из предыдущих уроков.
5 Янв
На первом уроке по изучению языка MQL мы научились запускать редактор MetaEditor и создавать новый скрипт MQL4. Но как мы можем увидеть, созданный нами скрипт MT4 пока не выполняет никаких функций в торговом терминале Metatrader 4.
В данном уроке мы научимся его выполнять какую — нибудь полезную функцию. Для примера, рассмотрим одну из полезных функций, которую мы реализуем на языке MQL4 — «расчет лота в зависимости от имеющихся у нас свободных средств».
Для этого мы должны определится с допустимым риском для нашего депозита на форекс (т.е. какое кол-во средств мы будем задействовать в торговле при использования советника форекс или в нашем случаи — скрипта для Metatrader 4).
Все учебники по форекс и опытные трейдеры рекомендуют: "никогда не рискуйте при заключении сделок на форекс более чем 2−5% от своего депозита". Ну что ж, давайте прислушаемся к их советам. Но т.к. четкой цифры нет, то нам нужно чтобы созданный нами скрипт запрашивал эту цифру.
Теперь давайте реализуем эту функцию на языке MQL4:
Введем в начале скрипта команду: #property show_inputs
У нас получилось:
//±-----------------------------------------------------------------+
//| test.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property show_inputs
//±-----------------------------------------------------------------+
//| script program start function |
//±-----------------------------------------------------------------+
int start()
{
//----
//----
return(0);
}
//±-----------------------------------------------------------------+
команда #property show_inputs означает выводить окно со свойствами перед запуском нашего скрипта MQL.
Попробуем запустить наш получившийся скрипт. Но для этого его нужно предварительно откомпилировать !
Компиляция — это преобразование нашей получившийся программы из языка понятного нам (в данном случаи MQL) в язык понятный компьютеру. Для компиляции скрипта MQL нажмем клавишу «компилировать» —
При этом в нижней части экрана высветится:
Это сообщение означает, что наш скрипт на языке MQL проверен на отсутствие ошибок и преобразован в код, понятный компьютеру. (далее…)