0ll Опубликовано 24 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 марта, 2015 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. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 24 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 марта, 2015 Понял, буду делать, спасибо! :) Добавлено: 24-03-2015 15:21:23Все изменения сделал, а проблемы остались... :( условие "if (_TimeStart == TimeHour(TimeCurrent()) && CountBayLimit () == 0 && CountSellLimit () == 0)" не работает, в журнале "OrderSend error 130". Из-за чего так подскажите пожалуйста.Тест_1.mq4 Изменено 24 марта, 2015 пользователем Sany2912 Ссылка на сообщение Поделиться на другие сайты More sharing options...
AVE-Tip Опубликовано 24 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 марта, 2015 Да вот как-раз к глобальным переменным уже присматриваюсь. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 24 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 марта, 2015 Переписал. так мне проще. Ошибка в том, что Лимитники вместо стоповых, когда поменял их местами, пришлось знаки в стопах менять.... В общем работает.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 }} Изменено 25 марта, 2015 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 25 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 марта, 2015 Спасибо!) Так действительно работает! Но, только, идея алгоритма полностью изменилась: должно было быть покупка на максимальном уровне, например, (в дальнейшем хотел сделать) при пробитии максимального уровня, выставляем лимит на покупку. А сейчас мы продаём на максимуме, но зато работает))) :-?Теперь понял, все получилось!!!! Поменял OP_BUYLIMIT, на OP_BUYSTOP Спасибо, 0ll !!! Изменено 25 марта, 2015 пользователем Sany2912 Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 28 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 марта, 2015 Друзья доброго времени, возник вопрос. мне нужно вывести среднее количество пунктов по формуле за определенное количество баров хай+лоу/х баров. то есть посчитать количество пунктов от хай до лоу, х-баров назад и вывести среднее значение количества пунктов за х-баров. Была попытка сделать это, но мне показывает какую то аброко дабру. как правильно сделать это в коде. а вообще есть мысль полученный результат делим еще на 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; }] Изменено 28 марта, 2015 пользователем denis77515 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 28 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 марта, 2015 denis77515 в цикле складываем величины баров, за циклом берём среднее:PunktCrlx += H_price - L_price;}PunktCrlx /= BarCount; Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 29 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 марта, 2015 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 mappingSetIndexBuffer(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); } Изменено 29 марта, 2015 пользователем denis77515 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 марта, 2015 denis77515 Вы попробовали не мой вариант, а свой собственный. В моём вариант точно этого не было:PunktCrl = PunktCrlx /= BarCount; :dЧто Вы хотите получить? если просто средний размер бара, то это просто. То что я вижу в коде - это совсем другое. Зачем Вам два буфера? или Вы хотите считать для бычьих и медвежьих отдельно?Если делать индюк, то цикл нужен только по истории, а текущие значения можно рассчитывать используя експоненциальное сглаживание. Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 29 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 марта, 2015 Oll до я хочу сделать идюк, который бы, выводил на экран ценовые метки , хай и лоу за 5 дневных свечей, потом считал пройденое количество пунктов за эти же пять свечей. делил их на 2, и на открытие новой дневной свечи, одну половину пунктов откладывал ближе к хаю от цены открытия дневной свечи, вторую ближе к лоу от цены открытия дневной свечи например на часавом графике.а буфера нужны для того что бы потом,взять значения для советника. или сразу прописать в советнике, но пока хочу опробовать эту идею в ручную. как то так. Изменено 29 марта, 2015 пользователем denis77515 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Гриня Опубликовано 29 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 марта, 2015 Здравствуйте! Помогите пожалуйста разобраться со вторым уроком: код написал как на видео, только у меня в тестере почему то не работает, а на видео все норм. Ошибка в журнале "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 Ожидается параметр типа string4063 Ожидается параметр типа integer4064 Ожидается параметр типа double4065 В качестве параметра ожидается массив4066 Запрошенные исторические данные в состоянии обновления4067 Ошибка при выполнении торговой операции4099 Конец файла4100 Ошибка при работе с файлом4101 Неправильное имя файла4102 Слишком много открытых файлов4103 Невозможно открыть файл4104 Несовместимый режим доступа к файлу4105 Ни один ордер не выбран4106 Неизвестный символ4107 Неправильный параметр цены для торговой функции4108 Неверный номер тикета4109 Торговля не разрешена4110 Длинные позиции не разрешены4111 Короткие позиции не разрешены4200 Объект уже существует4201 Запрошено неизвестное свойство объекта4202 Объект не существует4203 Неизвестный тип объекта4204 Нет имени объекта4205 Ошибка координат объекта4206 Не найдено указанное подокно4207 Ошибка при работе с объектом Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Здравствуйте!Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-? Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Здравствуйте!Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-? Циклов может быть много, проверка значений индикаторов скорее всего идет на каждом тике (можно сделать проверку значений только один раз на открытии нового бара, если конечно логика ТС не подразумевает отслеживание каждого тика)Oll,у меня возникла проблема... раньше не сталкивался с такимВ советнике через iCustom вызвал пользовательский индикатор (тот, который ты по сути писал), я пользуюсь этим шаблоном, все работаетНо вот при тестировании советника в журнале получаю :2015.03.30 14:43:12.223 2012.01.03 17:35 Custom indicator PA_pinbar EURJPY,H1: removed2015.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) //дальше код для открытия ордера Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Даже если тест провожу только по ценам открытия, все равно очень медленно. Проблема и не в циклах, мне кажется... Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Доброго времени всем,помогите разобраться. нужно что бы в индикаторе создавалась правая ценовая метка. по уже посчитанным параметрам вернее даже 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);}*/ Изменено 30 марта, 2015 пользователем denis77515 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Здравствуйте!Друзья, кто знает из-за чего тестируется советник очень долго? Ситуация такая: пишу код советника и по мере его написания делаю тест с визуализацией (для проверки) и тестируется этот код очень долго. А стоит протестировать любой другой готовый советник (который, например уже есть в МТ4), дак летит все без единого тормоза... Из-за чего так :-?Закрытые ордера анализируете? - основная причина. Остальные мелочи тоже могут быть, например на каждом тике пересчитывать ордера сетки и рассчитывать уровень БУ, или использовать рекурсивный индикатор типа ТМА 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ekwelibrium Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 0ll Оффтоп , Вы случайно преподавателем в политехе не работали (не важно в каком городе) , просто не стерпел уже)? Слишком устойчивая у Вас психика , и грамотный ответ на специализированный вопрос :) Изменено 30 марта, 2015 пользователем ekwelibrium 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Спасибо, 0ll !!! А как их нужно анализировать? Закрытие ордера происходит по противоположному сигналу индикатора - с этого момента и начинается тормоз. Изменено 30 марта, 2015 пользователем Sany2912 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 марта, 2015 Sany2912 без кода что-либо подсказать я Вам вряд-ли смогу...ekwelibrium никогда ничего не преподавал (кроме русской речи на стройке).oleguitar не знаю чем помочь. у меня бывало такое - исправлял незаметно, т.е. что-то делал и оно исправлялось, а что конкретно - хз. Изменено 30 марта, 2015 пользователем 0ll 4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 Oll , прошу помочь: как рекомендуется анализировать закрытые ордера, что бы избавится от тормозов при тестировании? Прилагаю код... Тест_3.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 Oll , прошу помочь: как рекомендуется анализировать закрытые ордера, что бы избавится от тормозов при тестировании? Прилагаю код...Вы не анализируете закрытые ордера. Вы на каждом тике рассчитываете значения индикаторов на 0-баре - если это необходимо, то терпите тормоза, если не знаете, то думайте насколько это необходимо. Далее: Вы на каждом тике 4 раза пересчитываете свои ордера - в этом точно нет необходимости. Решений здесь много и зависит от Вашей стратегии, например если в системе каждый тик может быть открыт только один ордер, то можно просто использовать флаг (есть/нет открытые ордера). Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 Oll, А я хоть правильно проверяю буфер индикатора? Больше нуля он должен быть, как я понимаю...Просто странно как-то, я код советника рабочего не менял, только триггер сменил, теперь он представляет собой набор индикаторов на основе того, что я описал ранее.. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 А я хоть правильно проверяю буфер индикатора? Больше нуля он должен быть, как я понимаю...Вы определили 2 буфера://---- 2 индикаторных буффера использованы для счёта SetIndexBuffer(0, buf_1); // 0 SetIndexBuffer(1, buf_2); // 1Вы их и читаете на 1-бареУ Вас явно не стыкуются объявленные и передаваемые индюку параметры - нужно сделать их абс. одинаковыми. У Вас в индюке объявлено 8 внешних параметров, а Вы передаёте через iCustom 7не хватает extern string settings2 = "Pinbar"; - попробуйте исправить. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sany2912 Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 Спасибо, Oll !! буду искать информацию о том, как рассчитывать значения не на каждом тике, а только по закрытию бара. Добавлено: 31-03-2015 14:34:510ll , я сделал функцию, что бы весь расчет параметров шел не на каждом тике, а только на первом тике нового бара! Но все равно тормозит, когда позиция закрывается. Из-за чего еще может так долго работать, посмотрите пожалуйста?Тест_3.mq4 Изменено 31 марта, 2015 пользователем Sany2912 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 31 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2015 Sany2912 пробуй - чуть поправил, изучи внимательно каждую строчку, изменений много мелких и не всегда очевидных, но имхо так лучше. Больше выжать из совы ничего нельзя_Тест_3.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти