Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Делаю третий урок из видео) советник по ТМА. Переписал как в видео от и до. Но советник теперь открывает ордера на покупку и продажу из любой позиции, из какой он хочет. А не четко от границ канала ТМА
возможно вы правы и причина в этом. попробую поэксперементировать с другими индикаторами
возможно вы правы и причина в этом. попробую поэксперементировать с другими индикаторами
Deymos, попробуй вот такой индикатор, если тебе нужен не перерисовывающийся канал
HalfLength - период канала (как MA)
PRICE_MODE - точно не знаю, скорее всего к какой цене применять, можно стандартно, по ценам закрытия, т.е. значение "0"
ATR_PERIOD - Период индикатора ATR, который KC берет для своих расчетов
K - коэффициент для значения ATR
То есть принцип работы такой: берем среднюю цену за N свечей(HalfLength) и строим от нее канал. Границей будет сдвиг от средней цены за N свечей на значение индикатора ATR с периодом (ATR_PERIOD), умноженное на коэф. (K) (вверх и вниз)
Поэкспериментируй, гибкий инструмент достаточно
Добавлено: 15-03-2015 15:06:29
oleguitar переписал для 600 билда. изучай пользуйся.
Добавил дельту (отступ) от графика, а то за стрелками его не видно
+ исправил логику вместо: open1-low1 - close1-low1.
Oll, я тут пытаюсь менять индикатор, в данном случае хочу заложить в него разные свечные паттерны, но вот на графике индикатор ведет себя совсем "не по правилам"
Пытался так же проверять, является ли максимум i-той свечи максимумом за период N свечей, так же неудачно...
В чем ошибка? (хотя бы касательно паттернов)

#property copyright "-"
#property link "-"
#property strict
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- количество индикаторных буфферов
#property indicator_buffers 2
//---- цвета индикатора
#property indicator_color1 Blue
#property indicator_color2 Red
//---- входные параметры индикатора
// input int ma_period = 48;
input int atr_period = 100;
input int bars = 50;
input int delta = 150;
int MA_Slow = 260;
//---- индикаторные буфферы
double buf_1[];
double buf_2[];
//+------------------------------------------------------------------+
//| Функция инициализации, запускается один раз |
//+------------------------------------------------------------------+
int OnInit()
{
//---- 2 индикаторных буффера использованы для счёта
SetIndexBuffer(0, buf_1);
SetIndexBuffer(1, buf_2);
//---- Стиль исполнения графика
//---- DRAW_ARROW - стрелки(символы)
SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 2);
SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 2);
SetIndexArrow (0, 233);
SetIndexArrow (1, 234);
//---- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- установка номера бара, начиная с которого будет отрисовываться индикатор
SetIndexDrawBegin(0,MA_Slow);
SetIndexDrawBegin(1,MA_Slow);
//---- завершение инициализации
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total, const int prev_calculated,
const datetime &time[],const double &open[],const double &high[], const double &low[], const double &close[],
const long &tick_volume[],const long &volume[],const int &spread[])
{
int i = (prev_calculated if (i while(i > 0)
{
//Здесь все расчёты
// double atr = iATR(_Symbol, 0, atr_period, i);
// double highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i-1);
// double lowest = iLowest (Symbol(), 0, MODE_LOW, bars, i-1);
double outside_bar_buy = 0;
double outside_bar_sell = 0;
if(Open[i ]Close[i-1] && High[i ]>High[i-1] && Low[i ]if(Open[i ]>Close[i ] && Open[i-1]High[i-1] && Low[i ]
// if(High[i-1]>highest) condition_highest = 1;
// if(Low[i-1] >lowest) condition_lowest = 1;
buf_2[i ] = outside_bar_sell ==1 ? High[i ] + delta*_Point : 0.0;
buf_1[i ] = outside_bar_buy ==1 ? Low[i ] - delta*_Point : 0.0;
//-----------------
i--;
}
return(rates_total);
}
//+------------------------------------------------------------------+
Изменено 15 марта, 2015 пользователем oleguitar
1. Это условие: High[i ]>High[i-1] && Low[i ]2. [i-1] этот индекс на 0-баре заглядывает в будущее. Вообще нужно i+1.
3. Если Вы делаете сравнение: outside_bar_sell ==1, а тип double, то может некорректно работать, надо int.
4. Про максимум я не понял, но Вы-то поняли, что в цикле мы проходим от 1-бара до N (в обратную сторону) и даст-ли Вам что-то Ваш максимум при этом? Пробуйте через iHighest.
oleguitar
1. Это условие: High[i ]>High[i-1] && Low[i ]2. [i-1] этот индекс на 0-баре заглядывает в будущее. Вообще нужно i+1.
3. Если Вы делаете сравнение: outside_bar_sell ==1, а тип double, то может некорректно работать, надо int.
4. Про максимум я не понял, но Вы-то поняли, что в цикле мы проходим от 1-бара до N (в обратную сторону) и даст-ли Вам что-то Ваш максимум при этом? Пробуйте через iHighest.
1. Ну да, поглощение же
2. Так вон оно как... попробую
3. Да, по привычке double поставил, а вообще, обычно работает
4. Упростит картину мне. Я же просто тоже индекс брал [i-1], поэтому не работало вероятно
Добавлено: 16-03-2015 09:27:58
Максимум не определяет... даже не знаю прям
Т.е. я понимаю, что это не должно выглядеть как индикатор фракталов, мне просто нужно, чтобы индикатор знал, является ли High текущей свечи максимумом за N баров...
input int bars = 50;
double highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i);
double lowest = iLowest (Symbol(), 0, MODE_LOW, bars, i);
int condition_highest = 0;
int condition_lowest = 0;
if(High[i ]>highest) condition_highest = 1;
if(Low[i ]
buf_2[i ] = condition_highest == 1 ? High[i ] + delta*_Point : 0.0;
buf_1[i ] = condition_lowest == 1 ? Low[i ] - delta*_Point : 0.0;

Изменено 16 марта, 2015 пользователем oleguitar
int iHighest - Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика.
А Вы индекс с ценой сравниваете.
И если Вы сравниваете хай от i бара с хаем нескольких баров начиная с i - нормально ? и хотите чтоб условие выполнилось?
Надо так: int highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i+1);
if(High[i ]>High[highest]) condition_highest = 1;
oleguitar Вы хоть справку читали?
int iHighest - Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика.
А Вы индекс с ценой сравниваете.
И если Вы сравниваете хай от i бара с хаем нескольких баров начиная с i - нормально ? и хотите чтоб условие выполнилось?
Надо так: int highest = iHighest(Symbol(), 0, MODE_HIGH, bars, i+1);
if(High[i ]>High[highest]) condition_highest = 1;
Точно, индекс же)
Спасибо, вроде сработало
Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.
Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.
Спасибо!
Был бы рад помочь, но загружен своими задачами выше крыши.
Могу только подсказать.
Там необходимо еще много всяких параметров, т.к. ситуаций много разных:
1. Могут быть безоткатные движения но по малым сдвигам и недалеко, например ночью :
есть движение, но короткое на малых объёмах тиков. Будет ловить лоси. т.к. спреды ночью большие.
2. Могут быть такие движения возле уровней - "тестирование уровня" .
3. Ограничивать (отделять) открытие одного ордера от другого, а то может на одной минуте несколько
ордеров, причем в разные стороны открыть.
ну и т.д.
Изменено 24 ноября, 2017 пользователем Pavel888
Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.
Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.
Спасибо!
не совсем понятно намеренье.
Советник просто должен следить за ценой на каждом тике? В чём проблема то? Следи за ценой, а не за свечками
Изменено 24 ноября, 2017 пользователем Pavel888
Всем доброго времени суток.
У меня проблема с 8 уроком по открытию и модификации ордеров.
В первой части по OrderSendX у меня в новом билде выдает ошибку.
Функцию Start() подставляю в void OnTick() чтобы было похоже на старый билд.
Далее вроде все по видео но выдает ошибку.
Может кто нибудь объяснить, что не так?
Изменено 22 марта, 2015 пользователем chistaia-rodina
rva7171, перед последней скобкой, для возобновления общего цикла работы кода, нужно добавить return(0); .
Работает. Благодарю.
Всем привет, это мой первый советник, так-что просьба тапки не кидать.
Сов работает, но не так. Помогите понять почему :-/
Изменено 22 марта, 2015 пользователем AVE-Tip
Deymos . При компиляции увидел ошибку в твоём коде, пропущено return(0); и скобки фигурные
int init()
{
{
//Проверка брокера на пятизнак
if (Digits ==3 || Digits == 5)
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(0);
}
Добавлено: 22-03-2015 14:10:57
Делаю третий урок из видео) советник по ТМА. Переписал как в видео от и до. Но советник теперь открывает ордера на покупку и продажу из любой позиции, из какой он хочет. А не четко от границ канала ТМА
Действительно в уроке Сергей (xbms) в конце упомянул что необходимо в условия добавить ещё индикатор , например RSI. Чтоб убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности индикатора RSI. Вот строка кода с условиями как добавить RSI в неё ??? if (Bid >= PriceHight && CountSell() == 0) Где указать что будут использоваться оба индикатора???
Изменено 22 марта, 2015 пользователем Гриня
Вам нужно описать РСИ: rsi = iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,1); и в условие на вход дописать:
Действительно в уроке Сергей (xbms) в конце упомянул что необходимо в условия добавить ещё индикатор , например RSI. Чтоб убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности индикатора RSI. Вот строка кода с условиями как добавить RSI в неё ??? if (Bid >= PriceHight && CountSell() == 0) Где указать что будут использоваться оба индикатора???
if (Bid >= PriceHight && rci && CountSell() == 0) ...
Вместо 70 можно писать RSI_Up и вывести его во внешние настройки (вместе с RSI_Down)
- что такое просадка ? по балансу, эквити или какого-то ордера? (есть подозрение что эта задача решается проще)
- "Определяет если ордер закрылся по стопу" - для этого достаточно проверить OrderProfit() > 0
- Эту строку: Pros =+ OrderLots()/2; надо писать так Pros += OrderLots()/2; - см. справку.
- заканчивать цикл можно: break; Ваш вариант тоже рабочий.
- Здесь тоже самое: Pros =- Pros / Drob;
- ф-ция CountTrades() будет только в тестере работать. Вы сами её написали или взяли где-то? ужасно кривая.
0ll, большое спасибо >:d1. В данном случае просадка (сумма всех OrderLots()) закрытых по стопу минус отработанная часть.
2. Спасибо, не знал, но и так тоже работает :)
3. Исправил
4. Исправил
5. Исправил
6. Функцию взял в видео уроке ___http://tradelikeapro.ru/category/uroki-po-mql/ (помним первый советник)
Ну и главное (код нерабочий) подправил, суть проблемы изменилась:
Суть ошибки, пока сделки закрываются по стопу, он всё делает правильно, после тейка забывает общую просадку.
Например первую сделку открывает лотом 0.7, при Drob = 1 Удваивает или Drob >1 увеличивает. Но после тейка может открыть сделку лотом 0.01 что меньше стартового лота и забыть весь Pros :(
Всё, разобрался, спасибо :)
Добавил варианты входа, стало семпотнее :d
Изменено 22 марта, 2015 пользователем AVE-Tip
Вдумайтесь! То что Вы хотите есть в МТ нужно только взять. Например, запоминаем стартовый баланс. На каком-то ордере текущий баланс Потом если текущий > стартового, то стартовый = текущий и так далее.1. В данном случае просадка (сумма всех OrderLots()) закрытых по стопу минус отработанная часть.
Еще раз спасибо!!!
Но... баланс общий для всех инструментов и советников. В любом случае, с ММ вроде ПОКА* разобрался, теперь над более правильными входами сижу.
*ПОКА - Pros придётся потом скорее всего в ini пихать, т.к. это будет мультивалютник с входами от силы валюты и он должен быть общим для всех (что кстати неплохо как вы предлагаете сделать), но опять же другие совы на счету и все пойдет не так. Пока сижу, учусь с ini работать.
Изменено 22 марта, 2015 пользователем AVE-Tip
С .ini? файлы инициализации виндовс? если да, то как Вы учитесь - чераз АПИ Виндовс или через текстовый файл средствами мкл?Пока сижу, учусь с ini работать.
Через текстовый файл средствами мкл
ini символически можно и без расширения, нужно несколько параметров от сова на одном инструменте передать сову на другом, копаюсь в библиотеке, но пока ничего не понял...
Если Вы только начинаете программировать, то лучше не тратить на это время. Тем более передать параметры внутри одного терминала можно через глобальные переменные, а если в разных терминалах - скачайте сову копировщик с открытым кодом и смотрите как совы общаются.
Здравствуйте! Помогите пожалуйста разобраться со вторым уроком: код написал как на видео, только у меня в тестере почему то не работает, а на видео все норм. Ошибка в журнале "OrderSend error 130", и условие "if (_TimeStart == TimeHour(TimeCurrent()) && CountBayLimit () == 0 && CountSellLimit () == 0)" не работает, по моему... Не могу понять из-за чего? Ошибок при компиляции нет...
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем