Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 у Вас логическая ошибка - идейная, а в коде грубых ошибок нет (есть странности, но на работу не влияют)
Идея выставлять отложку на хай/лоу 10-го бара плохая. За прошедшие 9 баров цена может уйти далеко, а вы например лимитник на селл под ценой ставите ! Наверняка стартовая идея была ставить лимитник на хай/лоу 10-и предыдущих баров - чувствуете разницу ? В этом случае всё будет работать.
Пробуйте вместо цикла:
for (int i=0; i {
pLow = iLow(Symbol(), 0, i);
}
сделать так: pLow = Low[iLowest(_Symbol,0,MODE_LOW,10,1)];
для хая зеркально, только вместо MODE_LOW - MODE_HIGH.
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Понял, буду делать, спасибо! :)


Добавлено: 24-03-2015 15:21:23

Все изменения сделал, а проблемы остались... :( условие "if (_TimeStart == TimeHour(TimeCurrent()) && CountBayLimit () == 0 && CountSellLimit () == 0)" не работает, в журнале "OrderSend error 130". Из-за чего так подскажите пожалуйста.

Тест_1.mq4

Изменено пользователем Sany2912
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Переписал. так мне проще. Ошибка в том, что Лимитники вместо стоповых, когда поменял их местами, пришлось знаки в стопах менять.... В общем работает.
void OnTick()
{
if (TimeStart == Hour() && orderBayLimit() == 0 && orderSellLimit() == 0)
{
MaxPrice = NormalizeDouble(GetMaxPrice(), 5);
xSL = NormalizeDouble(MaxPrice + SL*_Point,_Digits);
xTP = NormalizeDouble(MaxPrice - TP*_Point,_Digits);
int V = OrderSend(NULL, OP_SELLLIMIT, Lots, MaxPrice, 20, xSL, xTP, "", Magik, 0, Blue);
if (V
MinPrice = NormalizeDouble(GetMinPrice(), 5);
xSL1 = NormalizeDouble(MinPrice - SL*_Point,_Digits);
xTP1 = NormalizeDouble(MinPrice + TP*_Point,_Digits);
int C = OrderSend(NULL, OP_BUYLIMIT, Lots, MinPrice, 20, xSL1, xTP1, "", Magik, 0, Red);
if (C }
}

Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо!) Так действительно работает! Но, только, идея алгоритма полностью изменилась: должно было быть покупка на максимальном уровне, например, (в дальнейшем хотел сделать) при пробитии максимального уровня, выставляем лимит на покупку. А сейчас мы продаём на максимуме, но зато работает)))
:-?

Теперь понял, все получилось!!!! Поменял OP_BUYLIMIT, на OP_BUYSTOP Спасибо, 0ll !!!

Изменено пользователем Sany2912
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Друзья доброго времени, возник вопрос. мне нужно вывести среднее количество пунктов по формуле за определенное количество баров хай+лоу/х баров. то есть посчитать количество пунктов от хай до лоу, х-баров назад и вывести среднее значение количества пунктов за х-баров. Была попытка сделать это, но мне показывает какую то аброко дабру. как правильно сделать это в коде. а вообще есть мысль полученный результат делим еще на 2. и от цены открытия нового бара откладываем расстояние одной половины верх, другой вниз.
Моя попытка реализовать эту формулу.Заранее спасибо !

Спойлер

[

extern int BarCount = 6;

double H_price ,
L_price;

int i,PunktCrlx;

for(i=0; i {
H_price = High(i); // Примечание квадратные скобочки в Spoiler не рисуются.
L_price = Low[(i);
PunktCrlx = MathAbs(L_price + H_price) / BarCount;
}



]

Изменено пользователем denis77515
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515 в цикле складываем величины баров, за циклом берём среднее:

PunktCrlx += H_price - L_price;
}
PunktCrlx /= BarCount;
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Oll спасибо за ответ. Я попробовал ваш вариант.что то не работает. вот код. Мне нужно посчитать количество пунктов, сколько прошла цена от хай до лоу каждой свечи и разделить на это количество свечей. В общем средний диапазон за заданое количество баров.

Спойлер



extern int History =1000;
extern int BarCount = 6;

double High_Price_Buff_0,
Low_Price_Buff_1,
PunktCrl,PunktCrlx;

double UP_Price_Buff_0[],
DWN_Price_Buff_1[];

int shift,n,
Counted_bars;

double Sum_H_Bars, // Сумма значений High быков за период
Sum_L_Bars; // Сумма значений Low быков за период

int OnInit()
{
IndicatorBuffers(2);
//--- indicator buffers mapping
SetIndexBuffer(0,UP_Price_Buff_0);
SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(1,DWN_Price_Buff_1);
SetIndexStyle(1,DRAW_LINE);

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[])
{

Comment("\n Среднее значение за 5 баров "+DoubleToStr(PunktCrl));



Counted_bars=IndicatorCounted(); // Количество просчитанных баров
shift = Bars-Counted_bars-1; // Индекс первого непосчитанного

if (shift > History-1) // Если много баров то ..
shift = History-1; // ..рассчитывать заданное колич.


High_Price_Buff_0 = 0;
Low_Price_Buff_1 = 0;

for(n=shift; n {
High_Price_Buff_0 = Sum_H_Bars + High[n]; // Накопление суммы макс.значений
Low_Price_Buff_1 = Sum_L_Bars + Low[n]; // Накопление суммы мин. значений
}

PunktCrlx += High_Price_Buff_0 - Low_Price_Buff_1;
PunktCrl = PunktCrlx /= BarCount;

//--- return value of prev_calculated for next call
return(rates_total);
}

Изменено пользователем denis77515
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515 Вы попробовали не мой вариант, а свой собственный. В моём вариант точно этого не было:
PunktCrl = PunktCrlx /= BarCount; :d
Что Вы хотите получить? если просто средний размер бара, то это просто. То что я вижу в коде - это совсем другое. Зачем Вам два буфера? или Вы хотите считать для бычьих и медвежьих отдельно?
Если делать индюк, то цикл нужен только по истории, а текущие значения можно рассчитывать используя експоненциальное сглаживание.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Oll до я хочу сделать идюк, который бы, выводил на экран ценовые метки , хай и лоу за 5 дневных свечей, потом считал пройденое количество пунктов за эти же пять свечей. делил их на 2, и на открытие новой дневной свечи, одну половину пунктов откладывал ближе к хаю от цены открытия дневной свечи, вторую ближе к лоу от цены открытия дневной свечи например на часавом графике.а буфера нужны для того что бы потом,взять значения для советника. или сразу прописать в советнике, но пока хочу опробовать эту идею в ручную. как то так.

Изменено пользователем denis77515
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Здравствуйте! Помогите пожалуйста разобраться со вторым уроком: код написал как на видео, только у меня в тестере почему то не работает, а на видео все норм. Ошибка в журнале "OrderSend error 130", и условие "if (_TimeStart == TimeHour(TimeCurrent()) && CountBayLimit () == 0 && CountSellLimit () == 0)" не работает, по моему... Не могу понять из-за чего? Ошибок при компиляции нет...



Например посмотрев вышеописанную ошибку error 130 становится понятно, что функция OrderModify пытается изменить стоп-лосс или тейк-профит слишком близко к текущей цене.
Коды ошибок

GetLastError() — функция, возвращающая коды ошибок. Кодовые константы ошибок определены в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib.mqh.

Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:
Значение Описание
0 Нет ошибки
1 Нет ошибки, но результат неизвестен
2 Общая ошибка
3 Неправильные параметры
4 Торговый сервер занят
5 Старая версия клиентского терминала
6 Нет связи с торговым сервером
7 Недостаточно прав
8 Слишком частые запросы
9 Недопустимая операция нарушающая функционирование сервера
64 Счет заблокирован
65 Неправильный номер счета
128 Истек срок ожидания совершения сделки
129 Неправильная цена
130 Неправильные стопы
131 Неправильный объем
132 Рынок закрыт
133 Торговля запрещена
134 Недостаточно денег для совершения операции
135 Цена изменилась
136 Нет цен
137 Брокер занят
138 Новые цены
139 Ордер заблокирован и уже обрабатывается
140 Разрешена только покупка
141 Слишком много запросов
145 Модификация запрещена, так как ордер слишком близок к рынку
146 Подсистема торговли занята
147 Использование даты истечения ордера запрещено брокером
148 Количество открытых и отложенных ордеров достигло предела, установленного брокером.

Коды ошибок выполнения MQL4 программы:
Значение Описание
4000 Нет ошибки
4001 Неправильный указатель функции
4002 Индекс массива — вне диапазона
4003 Нет памяти для стека функций
4004 Переполнение стека после рекурсивного вызова
4005 На стеке нет памяти для передачи параметров
4006 Нет памяти для строкового параметра
4007 Нет памяти для временной строки
4008 Неинициализированная строка
4009 Неинициализированная строка в массиве
4010 Нет памяти для строкового массива
4011 Слишком длинная строка
4012 Остаток от деления на ноль
4013 Деление на ноль
4014 Неизвестная команда
4015 Неправильный переход
4016 Неинициализированный массив
4017 Вызовы DLL не разрешены
4018 Невозможно загрузить библиотеку
4019 Невозможно вызвать функцию
4020 Вызовы внешних библиотечных функций не разрешены
4021 Недостаточно памяти для строки, возвращаемой из функции
4022 Система занята
4050 Неправильное количество параметров функции
4051 Недопустимое значение параметра функции
4052 Внутренняя ошибка строковой функции
4053 Ошибка массива
4054 Неправильное использование массива-таймсерии
4055 Ошибка пользовательского индикатора
4056 Массивы несовместимы
4057 Ошибка обработки глобальныех переменных
4058 Глобальная переменная не обнаружена
4059 Функция не разрешена в тестовом режиме
4060 Функция не подтверждена
4061 Ошибка отправки почты
4062 Ожидается параметр типа string
4063 Ожидается параметр типа integer
4064 Ожидается параметр типа double
4065 В качестве параметра ожидается массив
4066 Запрошенные исторические данные в состоянии обновления
4067 Ошибка при выполнении торговой операции
4099 Конец файла
4100 Ошибка при работе с файлом
4101 Неправильное имя файла
4102 Слишком много открытых файлов
4103 Невозможно открыть файл
4104 Несовместимый режим доступа к файлу
4105 Ни один ордер не выбран
4106 Неизвестный символ
4107 Неправильный параметр цены для торговой функции
4108 Неверный номер тикета
4109 Торговля не разрешена
4110 Длинные позиции не разрешены
4111 Короткие позиции не разрешены
4200 Объект уже существует
4201 Запрошено неизвестное свойство объекта
4202 Объект не существует
4203 Неизвестный тип объекта
4204 Нет имени объекта
4205 Ошибка координат объекта
4206 Не найдено указанное подокно
4207 Ошибка при работе с объектом
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте!
Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Здравствуйте!
Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-?



Циклов может быть много, проверка значений индикаторов скорее всего идет на каждом тике (можно сделать проверку значений только один раз на открытии нового бара, если конечно логика ТС не подразумевает отслеживание каждого тика)

Oll,
у меня возникла проблема... раньше не сталкивался с таким
В советнике через iCustom вызвал пользовательский индикатор (тот, который ты по сути писал), я пользуюсь этим шаблоном, все работает

Но вот при тестировании советника в журнале получаю :
2015.03.30 14:43:12.223 2012.01.03 17:35 Custom indicator PA_pinbar EURJPY,H1: removed
2015.03.30 14:43:12.222 2012.01.03 17:35 Custom indicator PA_pinbar EURJPY,H1: removed

Индикатор:
Спойлер


#property copyright "-"
#property link "-"
#property strict
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- количество индикаторных буфферов
#property indicator_buffers 2
//---- цвета индикатора
#property indicator_color1 Blue
#property indicator_color2 Red
//---- входные параметры индикатора

extern string settings1 = "General";

input int pinbar_bars = 30;

extern string settings2 = "Pinbar";

input double pinbar_size_k_min = 1.5;
input double pinbar_size_k_max = 5;
input double pinbar_body_k = 0.3;
input double pinbar_tail_k = 1;
input int pinbar_atr_period = 50;


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, Green);
SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 2, Green);
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)
{
//Здесь все расчёты


//----------------------Maximum/Minimum--------------------------

int highest_i = iHighest(Symbol(), 0, MODE_HIGH, pinbar_bars, i+1);
int lowest_i = iLowest (Symbol(), 0, MODE_LOW, pinbar_bars, i+1);
int highest_i1 = iHighest(Symbol(), 0, MODE_HIGH, pinbar_bars, i+2);
int lowest_i1 = iLowest (Symbol(), 0, MODE_LOW, pinbar_bars, i+2);

int condition_highest_i = 0;
int condition_lowest_i = 0;
int condition_highest_i1 = 0;
int condition_lowest_i1 = 0;

if(High>High[highest_i]) condition_highest_i = 1;
if(Low if(High[i+1]>High[highest_i1]) condition_highest_i1 = 1;
if(Low[i+1]

//------------------Pinbar---------------------------------------

int pinbar_buy = 0;
int pinbar_sell = 0;
double pinbar_atr = iATR(_Symbol, 0, pinbar_atr_period, i+1);


if(MathAbs(High-Low)>pinbar_atr*pinbar_size_k_min && MathAbs(High-Low) {
if (condition_highest_i == 1)
{
if(Open>Close && MathAbs(Open-Close) MathAbs(High-Open)>pinbar_atr*pinbar_tail_k && MathAbs(Close-Open)> Close-Low) pinbar_sell =1;
}
if(condition_lowest_i == 1)
{
if(Open && MathAbs(Open-Close) MathAbs(Low-Open)>pinbar_atr*pinbar_tail_k && MathAbs(Close-Open)> High-Close) pinbar_buy =1;
}
}


//========================================================================================================================


buf_2 = pinbar_sell == 1 ? High + delta*_Point : 0.0;
buf_1 = pinbar_buy == 1 ? Low - delta*_Point : 0.0;
//-----------------
i--;
}



return(rates_total);
}
//+------------------------------------------------------------------+



Вот так вставляю через iCustom:
Спойлер


int pinbar_buy = iCustom(Symbol(), 0, "PA_pinbar", pinbar_bars, pinbar_size_k_min, pinbar_size_k_max, pinbar_body_k, pinbar_tail_k, pinbar_atr_period, 0, 1);
int pinbar_sell = iCustom(Symbol(), 0, "PA_pinbar", pinbar_bars, pinbar_size_k_min, pinbar_size_k_max, pinbar_body_k, pinbar_tail_k, pinbar_atr_period, 1, 1);



Буфер проверяю вот так:
if (pinbar_buy >0) //дальше код для открытия ордера
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени всем,помогите разобраться. нужно что бы в индикаторе создавалась правая ценовая метка. по уже посчитанным параметрам вернее даже 3.Что бы они вставали на ту цену которые посчитанные , потом перемещались на новые данные. смотрел по учебнику, попал в ступор. как все сделать не пойму особенно время привязки и перемещения метки. код прилагаю. заранее спасибо !

Спойлер




//+------------------------------------------------------------------+
//| Test 2.mq4 |
//| Klonoz Denis |
//| Skype_denis77515 |
//+------------------------------------------------------------------+
#property copyright "Klonoz Denis"
#property link "Skype_denis77515"
#property version "1.00"
#property strict
#property indicator_chart_window
/*#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 clrBlue // HIGH
#property indicator_color2 clrDeepPink // LOW
#property indicator_color3 clrYellow // he average price for 5 candles / Cредняя цена за 5 свечей
#property indicator_color4 clrLime
#property indicator_color5 clrWhite*/

input string InpName = "RightPrice"; // Имя ценовой метки
input int InpDate = 0; // Дата точки привязки в %
input int InpPrice = 90; // Цена точки привязки в %
input color InpColor = clrRed; // Цвет ценовой метки
input ENUM_LINE_STYLE InpStyle = STYLE_SOLID; // Стиль окаймляющей линии
input int InpWidth = 2; // Размер ценовой метки
input bool InpBack = false; // Метка на заднем плане
input bool InpSelection = true; // Выделить для перемещений
input bool InpHidden = true; // Скрыт в списке объектов
input long InpZOrder = 0; // Приоритет на нажатие мышью
extern int BarCount = 5;

double Average_Price_High,
Average_Price_Low,
Min_Price,Max_Price,
dOpenPrice,Average;

/*double UP_Price_Buff_0[];
DWN_Price_Buff_1[],
Average_Price_High_Buff_2[],
Average_Price_Low_Buff_3[],
Average_Price[];*/

int punkt,
max_index,min_index,dPunkt,
sub_windowx=0,dwidth=1,
symbol=NULL,obj_arrow_right_price = OBJ_ARROW_RIGHT_PRICE;

datetime dtime = 0;

double val_h,
val_l;

string name_0 = "RightPrice";



//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
/*IndicatorDigits(_Digits);
//--- indicator buffers mapping
//IndicatorBuffers(2);

SetIndexBuffer(0,UP_Price_Buff_0);
SetIndexStyle(0,DRAW_LINE);
SetIndexArrow(0,59);

SetIndexBuffer(1,DWN_Price_Buff_1);
SetIndexStyle(1,DRAW_LINE);
SetIndexArrow(1,59);

SetIndexBuffer(2,Average_Price_High_Buff_2);
SetIndexStyle(2,0);

SetIndexBuffer(3,Average_Price_Low_Buff_3);
SetIndexStyle(3,0);

SetIndexBuffer(4,Average_Price);
SetIndexStyle(4,0); */

if(Digits == 5 || Digits == 3)
{
punkt *= 10;
Average_Price_High *= 10;
Average_Price_Low *= 10;
}
//---
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[])
{


/*Max_Price = GetMaxPrice();
Min_Price = GetMinPrice();*/

if(InpDate100 || InpPrice100)//--- проверим входные параметры на корректность
{
Print("Ошибка! Некорректные значения входных параметров!");
return(0);
}

int bars=(int)ChartGetInteger(0,BarCount);//--- количество видимых баров в окне графика

int accuracy=1000; //--- размер массива price

//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки метки
datetime date[];
double price[];
double price_high[];
double price_low[];
double price_average[];

//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price_high,accuracy);
ArrayResize(price_low,accuracy);
ArrayResize(price_average,accuracy);

//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return(0);
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика за BarCount

max_index = 0; // обнуляем переменные
min_index = 0;

max_index = iHighest(Symbol(),PERIOD_D1,MODE_HIGH,BarCount,1); // индекс наибольшего найденного значения High за BarCount со здвигом в 1 бар
min_index = iLowest(Symbol(),PERIOD_D1,MODE_LOW,BarCount,1); // индекс наименьшего найденного значения Low за BarCount со здвигом в 1 бар

if(max_index !=-1) // Если достаточно баров
val_h = iHigh(Symbol(), PERIOD_D1, max_index); // Максимальное значение за BarCount
if(min_index !=-1)
val_l = iLow(Symbol(), PERIOD_D1, min_index); // Минимальное значение за BarCount

//---
dOpenPrice = OpenPrice();
// Цена открытия дневного бара
dPunkt = 0; // Обнуляем переменные
punkt = 0;

dPunkt = Punkt(); // Количество пунктов от High до Low за 5 дней
if(dPunkt)
punkt = dPunkt / 2; // Среднее делим на 2

Average_Price_High = 0; // Обнуляем переменные
Average_Price_Low = 0;

Average_Price_High = NormalizeDouble(dOpenPrice + punkt * _Point,_Digits); // Откладыаем 1/2 часть пунктов к High от цены открытия дневного бара
Average_Price_Low = NormalizeDouble(dOpenPrice - punkt * _Point,_Digits); // Откладыаем 1/2 часть пунктов к Low от цены открытия дневного бара

Comment("\n Количество пунктов от High до Low за 5 дней "+ IntegerToString(dPunkt)+
"\n Количество пунктов от открытия дня до High за 5 дней "+ DoubleToStr(Average_Price_High,_Digits)+
"\n Количество пунктов от открытия дня до Low за 5 дней "+ DoubleToStr(Average_Price_Low,_Digits)+
"\n Цена открытия дня "+DoubleToStr(dOpenPrice,_Digits));

//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Создает правую ценовую метку |
//+------------------------------------------------------------------+
bool ArrowRightPriceCreate(const long chart_ID=0, // ID графика
const string name="RightPrice", // имя ценовой метки
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=clrRed, // цвет ценовой метки
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=1, // размер ценовой метки
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
ChangeArrowEmptyPoint(time,price); //--- установим координаты точки привязки, если они не заданы
ResetLastError(); //--- сбросим значение ошибки

if(!ObjectCreate(chart_ID,name,OBJ_ARROW_RIGHT_PRICE,sub_window,time,price)) //--- создадим ценовую метку

{
Print(__FUNCTION__,": не удалось создать правую ценовую метку! Код ошибки = ",GetLastError());
return(false);
}
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,0); //--- установим угол привязки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,710); //--- установим Х координату
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,105); //--- установим Y координату
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим цвет метки
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- установим размер метки
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- отобразим на переднем (false) или заднем (true) плане

//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);//- установим приоритет на получение события нажатия мыши на графике
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowRightPriceMove(const long chart_ID=0, // ID графика
const string name="RightPrice", // имя метки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
if(!time)
time=TimeCurrent();//--- если время точки не задано, то она будет на текущем баре

if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);//--- если цена точки не задана, то она будет иметь значение Bid

}
//+------------------------------------------------------------------+
double OpenPrice()
{
double open_price = -1;
if(open_price !=Open[0])
{
open_price = iOpen(Symbol(),PERIOD_D1,0);
}
return(open_price);
}

//+------------------------------------------------------------------+
int Punkt()
{
int r=1000000;
double d, point;

point=MarketInfo(Symbol(), MODE_POINT);

if (point == 0) if(StringFind(Symbol(), "JPY")
d=MathAbs(val_h-val_l)/point;

if (r>d) r=NormalizeDouble(d, 0);

return(r);
}

//--------------------------------------------------------------------+

//--------------------------------------------------------------------+
/*double GetMinPrice()
{
double dlow = 1000000,
dprice;

for (int i=BarCount-1; i>=0; i--)
{
dprice = iLow(Symbol(), PERIOD_D1, i);
if(dprice dlow = dprice;
}
return(dlow);

}
//+------------------------------------------------------------------+
double GetMaxPrice()
{
double dhigh = 0,
dprice;

for (int i=BarCount-1; i>=0; i--)
{
dprice = iHigh(Symbol(), PERIOD_D1, i);
if(dprice > dhigh)
dhigh = dprice;
}
return(dhigh);
}*/

Изменено пользователем denis77515
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Здравствуйте!
Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-?

Закрытые ордера анализируете? - основная причина. Остальные мелочи тоже могут быть, например на каждом тике пересчитывать ордера сетки и рассчитывать уровень БУ, или использовать рекурсивный индикатор типа ТМА
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll Оффтоп , Вы случайно преподавателем в политехе не работали (не важно в каком городе) , просто не стерпел уже)? Слишком устойчивая у Вас психика , и грамотный ответ на специализированный вопрос :) Изменено пользователем ekwelibrium
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо, 0ll !!! А как их нужно анализировать? Закрытие ордера происходит по противоположному сигналу индикатора - с этого момента и начинается тормоз.

Изменено пользователем Sany2912
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 без кода что-либо подсказать я Вам вряд-ли смогу...
ekwelibrium никогда ничего не преподавал (кроме русской речи на стройке).
oleguitar не знаю чем помочь. у меня бывало такое - исправлял незаметно, т.е. что-то делал и оно исправлялось, а что конкретно - хз. Изменено пользователем 0ll
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Oll , прошу помочь: как рекомендуется анализировать закрытые ордера, что бы избавится от тормозов при тестировании? Прилагаю код...

Тест_3.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Oll , прошу помочь: как рекомендуется анализировать закрытые ордера, что бы избавится от тормозов при тестировании? Прилагаю код...

Вы не анализируете закрытые ордера. Вы на каждом тике рассчитываете значения индикаторов на 0-баре - если это необходимо, то терпите тормоза, если не знаете, то думайте насколько это необходимо. Далее: Вы на каждом тике 4 раза пересчитываете свои ордера - в этом точно нет необходимости. Решений здесь много и зависит от Вашей стратегии, например если в системе каждый тик может быть открыт только один ордер, то можно просто использовать флаг (есть/нет открытые ордера).
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Oll,

А я хоть правильно проверяю буфер индикатора? Больше нуля он должен быть, как я понимаю...
Просто странно как-то, я код советника рабочего не менял, только триггер сменил, теперь он представляет собой набор индикаторов на основе того, что я описал ранее..

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

А я хоть правильно проверяю буфер индикатора? Больше нуля он должен быть, как я понимаю...

Вы определили 2 буфера:
//---- 2 индикаторных буффера использованы для счёта
SetIndexBuffer(0, buf_1); // 0
SetIndexBuffer(1, buf_2); // 1
Вы их и читаете на 1-баре
У Вас явно не стыкуются объявленные и передаваемые индюку параметры - нужно сделать их абс. одинаковыми. У Вас в индюке объявлено 8 внешних параметров, а Вы передаёте через iCustom 7
не хватает extern string settings2 = "Pinbar"; - попробуйте исправить.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо, Oll !! буду искать информацию о том, как рассчитывать значения не на каждом тике, а только по закрытию бара.


Добавлено: 31-03-2015 14:34:51

0ll , я сделал функцию, что бы весь расчет параметров шел не на каждом тике, а только на первом тике нового бара! Но все равно тормозит, когда позиция закрывается. Из-за чего еще может так долго работать, посмотрите пожалуйста?

Тест_3.mq4

Изменено пользователем Sany2912
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 пробуй - чуть поправил, изучи внимательно каждую строчку, изменений много мелких и не всегда очевидных, но имхо так лучше. Больше выжать из совы ничего нельзя

_Тест_3.mq4

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...