MikR0ReR Опубликовано 13 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 ноября, 2019 @Владимир Стариков Как вылечить эту ошибку? это проблема при модификации или при закрытии ордера. Что то начудили в коде, ручками лезть и справлять. Насколько она критична? на столько, как не пить и не есть. Может ли быть так, что она есть в тестере, а в торговле ее не будет? на 99% она повторится и в торговле. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Владимир Стариков Опубликовано 14 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2019 8 часов назад, MikR0ReR сказал: @Владимир Стариков Как вылечить эту ошибку? это проблема при модификации или при закрытии ордера. Что то начудили в коде, ручками лезть и справлять. Насколько она критична? на столько, как не пить и не есть. Может ли быть так, что она есть в тестере, а в торговле ее не будет? на 99% она повторится и в торговле. Спасибо за ответы. Просто напрягает, что при незначительном изменении входных параметров тех.индикаторов ошибок нет. Такое возможно? Разве функция закрытия ордеров зависит от тех.индикаторов? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2019 1 час назад, Владимир Стариков сказал: Разве функция закрытия ордеров зависит от тех.индикаторов? Индикаторы не могут закрывать ордера, но они могут работать с тикетами - без кода не поймём. Ссылка на сообщение Поделиться на другие сайты More sharing options...
diodio Опубликовано 25 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 ноября, 2019 Всем привет! Продолжаю разбираться в массивах и хочу проверить свою теорию, советник сеточник работает в две стороны по простому индикатору машке. Строятся две сетки одновременно. Идея такова, когда идет просадка одной сетки но параллельно другая сетка зарабатывает профит, то вот именно эта сетка которая зарабатывает профит должна помогать отключать просадочные ордера (не все!) другой сетки приблизительно на тот профит на который ушла в минус просадочная сеть. На этом основании я попытался создать массивы из тикетов и ордеров по профитам. Далее эти массивы должны хранить последние данные которые были заложены в них и с них же уже продолжать работу со следующей ситуацией по просадке которая возникнет снова. Я вроде все написал как я думаю грамотно, но это чисто мое мнение, конечно же есть ошибки, я пока их не вижу. Прошу помощи разобраться. Выкладываю все необходимые фрагменты кода, чтоб не копаться в целом советнике (потому что остальной код проверен и рабочий), в которых считаю где-то мой недочет. Спойлер { //закрытие покупок LastTicketBuy = FindLastTicketBuy(); OrderProfitSellClose(cSellProfitClose);// Профит уже закрытых ордеров на продажу OrderTicketSellClose(cTicketSellClose); // Тикеты ордеров на продажу из истории OrderTicketBuy(cTicketBuy); // тикеты ордеров в рынке на покупку for(int z=0; z < ArraySize(cTicketSellClose); z++) { if(cTicketSellClose[z] > LastTicketBuy) for(int b=0; b < ArraySize(cSellProfitClose); b++) { cSellProfitClose=+SellProfitClose; OrderProfitBuy(cBuyProfitOpen); // Профит еще не закрытых ордеров на покупку for(int t=0; t < ArraySize(cBuyProfitOpen); t++) { cBuyProfitOpen[t]=+BuyProfitOpen; if(MathAbs(BuyProfitOpen) <= SellProfitClose) { if(OrderType() == OP_BUY) bool close_profit_buy = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage); for(int n=0; n < b; n++) { cSellProfitClose[n] = 0; //вот здесь я включаю цикл и обнуляю те значения в массиве которые уже учавствовали в отключении просадочных ордеров, чтоб их значения в дальнейшем не учитывались } ArrayCopy(cSellProfitClose,cSellProfitClose,0,WHOLE_ARRAY); // здесь копирую массив в массив уже как я думаю с новыми значениями, которые обнулил ArrayResize(cSellProfitClose, ArraySize(cSellProfitClose)); // а здесь я его переписываю заново с новыми значениями, т.е. нулями } }// второй for } } } //первый for-----------------------функции---------------------------------------------------------------- //+---------------------Функция находит последний тикет ордера который выставился на покупку но еще сетка не закрыта--------------------+int FindLastTicketBuy() { int oticket,ticketnumber_buy=0; for(int m=0; m<OrdersTotal(); m++) { if(OrderSelect(m,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_buy) { oticket=OrderTicket(); if(oticket>ticketnumber_buy) { ticketnumber_buy=oticket; } } } } return(ticketnumber_buy); }//+---------------------Профит уже закрытых ордеров на продажу----------------------+void OrderProfitSellClose(double &cSellProfitClose[]) { int counter=0,size=OrdersHistoryTotal(); ArrayResize(cSellProfitClose,size); for(int i=0; i<OrdersHistoryTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderType()==OP_SELL) { cSellProfitClose=OrderProfit()+OrderCommission()+OrderSwap(); counter++; } } } ArrayResize(cSellProfitClose,counter); return; }//+---------------------Тикеты ордеров на продажу из истории----------------------+void OrderTicketSellClose(int &cTicketSellClose[]) { int counter=0,size=OrdersHistoryTotal(); ArrayResize(cTicketSellClose,size); for(int i=0; i<OrdersHistoryTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderType()==OP_SELL) { cTicketSellClose=OrderTicket(); counter++; } } } ArrayResize(cTicketSellClose,counter); return; }//+---------------------Тикеты ордеров на покупку----------------------+void OrderTicketBuy(int &cTicketBuy[]) { int counter=0,size=OrdersTotal(); ArrayResize(cTicketBuy,size); for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY) { cTicketBuy=OrderTicket(); counter++; } } } ArrayResize(cTicketBuy,counter); return; }//+---------------------Профит еще не закрытых ордеров на покупку----------------------+void OrderProfitBuy(double &cBuyProfitOpen[]) { int counter=0,size=OrdersTotal(); ArrayResize(cBuyProfitOpen,size); for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY) { cBuyProfitOpen=OrderProfit()+OrderCommission()+OrderSwap(); counter++; } } } ArrayResize(cBuyProfitOpen,counter); return; } Единственное, а может быть и нет, я не могу понять как вернуть новые значения массива, в которых уже нули с добавлением новых значений, снова в цикл при новом переборе, когда пойдет снова просадка, чтоб он именно эти значения брал в расчет, потому что уже существует функция по заполнению массива по профиту, а теперь как она будет брать в расчет новые значения? Или где-то надо поставить условие что если уже существует массив и в нем есть какие-то значения, то нужно дозаполнить массив. Пока не работает(, если кто подскажет буду благодарен. Спасибо. Изменено 25 ноября, 2019 пользователем diodio Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 25 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 ноября, 2019 @diodio Вам ехать или с массивами бороться? опишу рабочий алгоритм: - просадка достигла порога. - есть прибыль у встречной сетки выше доли просадки - фиксируем сумму прибыли и начинаем закрывать просевшую сетку начиная с меньшего ордера если его убыток менее суммы прибыли - корректируем сумму прибыли на убыток закрытого ордера и переходим к следующему, продолжаем пока сумма больше 0 - ждём следующих пороговых значений. Механизм работал как часы, но облегчения не принёс... Ссылка на сообщение Поделиться на другие сайты More sharing options...
diodio Опубликовано 29 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 ноября, 2019 Всем привет! Есть ли какой-нибудь тестер кода который отображает значения при первом прогоне, втором и т.д. чтоб прям он в коде показывал что происходит если мы нажмем клавишу первого прогона и наведем курсор на нужное нам место? Я такой видел но вот название не запомнилось. Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 29 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 ноября, 2019 Все есть уже в MetaEditore. Называется отладка. Спойлер Даю видео для Visual Studio. Но принцип работы тот же в MetaEditore. Кроме, не реализованы такие вещи как, навести мышкой на переменную для вывода значения и еще создание отдельного окна для переменной. https://www.youtube.com/watch?v=_ZairtpcXTs Для MetaEditore https://www.youtube.com/watch?v=x25h3CyBX1E Изменено 29 ноября, 2019 пользователем MikR0ReR 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
quotestock Опубликовано 30 ноября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 ноября, 2019 Здравствуйте уважаемые программисты. Прошу помочь в решении такого вопроса - есть индикатор ZZ, в нем есть три массива Массив для отрисовки ZigZag double zz[]; // Массив минимумов ZigZag double zzL[]; // Массив максимумов ZigZag double zzH[]; Как получить значения максимумов цены в точках а (скан графика) и минимумов в точках b, чтобы эти данные можно было использовать далее для расчетов. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 декабря, 2019 21 час назад, quotestock сказал: Как получить значения максимумов цены в точках а (скан графика) и минимумов в точках b, чтобы эти данные можно было использовать далее для расчетов. В массивах экстремумов обычно пишется пустое значение или цена экстремума, нужно сделать массив по барам от 1 до той глубины истории, которая Вам нужна и переписать полученные цены в свой массив для анализа, если будете использовать внешний индикатор, то исследуйте соответствующий индикаторный буфер. Если в Зиг-Заге нет специальных буферов, то их можно достать из основного буфера, только придётся анализировать верхний/нижний, что тоже не сложно. Ссылка на сообщение Поделиться на другие сайты More sharing options...
quotestock Опубликовано 1 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 декабря, 2019 2 часа назад, 0ll сказал: В массивах экстремумов обычно пишется пустое значение или цена экстремума, нужно сделать массив по барам от 1 до той глубины истории, которая Вам нужна и переписать полученные цены в свой массив для анализа, если будете использовать внешний индикатор, то исследуйте соответствующий индикаторный буфер. Если в Зиг-Заге нет специальных буферов, то их можно достать из основного буфера, только придётся анализировать верхний/нижний, что тоже не сложно. Огромное спасибо за ответ, я не так давно изучаю язык MQL, и с массивами еще не совсем дружу. Я так понимаю, что есть два решения этого вопроса - сделать массив по барам (мне нужно 6 баров) и доставать из основного буфера, анализируя мин/макс. Не могли бы Вы расписать более подробно? Хочется сделать самому, но не совсем понимаю еще как. Может у Вас есть какие-либо индикаторы с таким решением, чтобы посмотреть? Заранее спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 декабря, 2019 @quotestock Вы собирались анализировать вершины ZZ и пишите про 6 баров - тут не понятно, в 6 барах может вообще не быть вершин. У ZZ не сложный код, его можно перенести в советник и даже обойтись без массивов, всё зависит от алгоритма анализа. С кодом поможем, этот вопрос про ZZ и его вершины поднимался уже не раз, только скажите в каком виде хотите получить данные? Ссылка на сообщение Поделиться на другие сайты More sharing options...
quotestock Опубликовано 1 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 декабря, 2019 13 минут назад, 0ll сказал: @quotestock Вы собирались анализировать вершины ZZ и пишите про 6 баров - тут не понятно, в 6 барах может вообще не быть вершин. У ZZ не сложный код, его можно перенести в советник и даже обойтись без массивов, всё зависит от алгоритма анализа. С кодом поможем, этот вопрос про ZZ и его вершины поднимался уже не раз, только скажите в каком виде хотите получить данные? мне и нужно анализировать именно вершины и впадины, По 6 последних (и вершин и впадин) достаточно. Мне нужно получить цены в этих вершинах и впадинах. Дальше я буду работать с этими ценами Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 декабря, 2019 @quotestock посмотрите здесь, там есть примеры и готовые решения Ссылка на сообщение Поделиться на другие сайты More sharing options...
quotestock Опубликовано 4 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 декабря, 2019 В 01.12.2019 в 17:59, 0ll сказал: @quotestock посмотрите здесь, там есть примеры и готовые решения Здравствуйте уважаемые программисты, нашел код функции GetZZExtrUPByNum, она возвращает цену заданного номера вершины. Пробую ее встроить в ZZ и компилятор выдает ошибки 'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined. Как это исправить. При этом у меня в ZZ два параметра extern int minBars= 12; и extern int minSize= 50;. Я так понимаю, что в функции GetZZExtrUPByNum нужно убрать dp, dv, dc и заменить их своими параметрами? Подскажите правильное решение. Заранее спасибо Спойлер //Возвращает цену заданного номера вершины GetZZExtrUPByNum // ============================================================================================================================== /* VARS: num = номер вершины sy = Наименование инструмента tf = таймфейм в минутах dp = Depth dv = Deviation bc = Backstep shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров Return: Возвращает цену заданного номера вершины */ // =========================================================================== double GetZZExtrUPByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0) { if(sy == "") { sy = Symbol(); } //--- double thisExtr = 0; int thisExtrNum = 0; int thisUPNum = 0; while(thisUPNum <= num) { if(IsZZExtrUP(thisExtrNum, sy, tf, dp, dv, bc, shift)) { thisUPNum++; thisExtr = GetZZExtrByNum(thisExtrNum, sy, tf, dp, dv, bc, shift); } thisExtrNum++; } return(thisExtr); } //============================================================================= Изменено 6 декабря, 2019 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 5 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 декабря, 2019 11 часов назад, quotestock сказал: Пробую ее встроить в ZZ и компилятор выдает ошибки 'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined. Как это исправить. У Вас нет функций, которые упоминаются в коде. 11 часов назад, quotestock сказал: ошибки 'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined Гугл переводчик: "IsZZExtrUP '- функция не определена и' GetZZExtrByNum '- функция не определена" Ссылка на сообщение Поделиться на другие сайты More sharing options...
quotestock Опубликовано 5 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 декабря, 2019 2 часа назад, usver73 сказал: У Вас нет функций, которые упоминаются в коде. Гугл переводчик: "IsZZExtrUP '- функция не определена и' GetZZExtrByNum '- функция не определена" Спасибо за ответ, можете подсказать как подправить данный код? или исправит возникающую ошибку? Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 5 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 декабря, 2019 В 05.12.2019 в 07:34, quotestock сказал: Спасибо за ответ, можете подсказать как подправить данный код? или исправит возникающую ошибку? та же, где нашли функцию GetZZExtrUPByNum, должны лежать недостающие IsZZExtrUP и GetZZExtrByNum 0ll: найдите эти функции и добавьте в свой советник. Изменено 6 декабря, 2019 пользователем 0ll 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 23 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 декабря, 2019 Есть ли возможность вытащить цифры из советника, советник мой, спрятал там пароль от проги, в тестере не работает, нужна связь с терминалом. начинается на 901.......504 (по памяти) всего 15 цифр? ParolUpdate.ex4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 23 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 декабря, 2019 @vitek01 Если твой советник, то найди файл .mq4 (ParolUpdate.mq4). Это единственный способ. Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 23 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 декабря, 2019 это было бы совсем просто, mq4 хранится в этой проге. мжет есть вариант другой... Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 23 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 декабря, 2019 Это единственный способ! 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 26 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 декабря, 2019 В 23.12.2019 в 16:29, vitek01 сказал: мжет есть вариант другой... Никсера проси, вспомни как проверял правильность пароля и что происходит при не правильном вводе (кусок кода) - Никсер может найти функцию проверки и переменную - образец. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 26 декабря, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 декабря, 2019 3 часа назад, 0ll сказал: Никсера проси, вспомни как проверял правильность пароля и что происходит при не правильном вводе (кусок кода) - Никсер может найти функцию проверки и переменную - образец. Спасибо. не критично нужно. Пароль сам покажется когда наступит нужный день, 1 марта следующего года., просто ждать долго. А так я сам себя как бы контролирую с помощью пароля. Программа не даст слабину, пароля не выдаст, а людям нет веры, сколько раз уже убеждался. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Владимир Стариков Опубликовано 3 января, 2020 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 января, 2020 Здравствуйте! Тут сочинил функцию: Спойлер //+---------------------------------------------------------------------------+ //|Функция процент медвежьих баров по цвету свечи для CheckTrend() | //+---------------------------------------------------------------------------+ double PercentsBearBars(int Q_bar_,ENUM_TIMEFRAMES tf,bar_color_style bar_color_) { double f=0; double kf=0; double p=1; for(int i=1; i< Q_bar_+1; i++) { if(bar_color_==full) { if(iClose(NULL,tf,i)<iOpen(NULL,tf,i)&& (ha(tf,3,i)<ha(tf,2,i))) kf++; } if(bar_color_==Jap) { if(Close <Open) kf++; } if(bar_color_==Ha) { if(ha(tf,3,i)<ha(tf,2,i))//белая kf++; } if(bar_color_==Elder) { if(MA(i)<MA(i+1)&&(BB_lines(MODE_MAIN,i)<BB_lines(MODE_MAIN,i+1))) kf++; } if(bar_color_==superfull) { if(iClose(NULL,tf,i)<iOpen(NULL,tf,i)&&ha(tf,3,i)<ha(tf,2,i)&& MA(i)<MA(i+1)&&(BB_lines(MODE_MAIN,i)<BB_lines(MODE_MAIN,i+1))) kf++; } } p = (kf / Q_bar_)*100; return(p); } Но вот беда. Данная функция тормозит советник в тестировании. Может подскажет кто как можно ее переписать более оптимально, чтобы скорость тестирования не снижалась. Изменено 3 января, 2020 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 3 января, 2020 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 января, 2020 3 часа назад, Владимир Стариков сказал: Но вот беда. Данная функция тормозит советник в тестировании. 1. Надеюсь запускаете по закрытию бара, а не на каждом тике. 2. Зачем пересчитывать уже закрытые бары в цикле многократно? они уже цвет не поменяют! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти