Начал с того что попытался понять каждое действие и расшифровать его.
если что подправьте пожалуйста.
//+------------------------------------------------------------------+ //| super-signals_v2.mq4 | //| Copyright © 2006, Nick Bilak, beluck[AT]gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Nick Bilak" #property copyright "alterations by Mark Tomlinson" #property link "https://www.forex-tsd.com/" #property indicator_chart_window // Свойства программ Выводить индикатор в окно графика #property indicator_buffers 2 // Свойства программ Количество буферов для расчета индикатора 2 Тип int #property indicator_color1 Red // Свойства программ Цвет для вывода линии1 красный #property indicator_color2 Yellow // Свойства программ Цвет для вывода линии2 желтый #property indicator_width1 5 // Свойства программ Толщина линии в графической серии 1 #property indicator_width2 5 // Свойства программ Толщина линии в графической серии 2 // input properties Вводные свойства extern int dist2 = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом. extern int dist1 = 59;// was 14 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом extern bool alertsOn = true; //переменные оповещенеи включено extern bool alertsOnCurrent = true; //переменные возвращает текущий элемент массива extern bool alertsMessage = true; //переменные текстовое сообщение в окошке extern bool alertsSound = true; //переменные звук extern bool alertsEmail = false; //переменные не отправлять сообщение на почтовый ящик double alertBar; //дробная часть оповещения бара extern int SignalGap = 3; //переменная разрыв цены в потоке котировок double b1[]; double b2[]; int init() //для инициализации переменных которые предопределены, для проверок. { //настройка параметров отрисовки SetIndexBuffer(0,b1); //буфер для первой линии SetIndexBuffer(1,b2); //буфер для второй линии SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора return(0); // } int start() { int counted_bars=IndicatorCounted(); // последний посчитанный бар будет пересчитан // проверка на возможные ошибки int i,limit,hhb1,llb1; if(counted_bars<0) return(-1); // последний посчитанный бар будет пересчитан if(counted_bars>0) counted_bars--; // Притворяемся, что посчитано на один бар меньше, чтобы пересчитать последний бар. На самом деле, это перестраховка, т.к. функция IndicatorCounted( ) и так возвращает число на 1 меньше limit=Bars-counted_bars; // основной цикл limit=MathMax(limit,dist1); // Функция возвращает максимальное из двух числовых значений. limit=MathMax(limit,dist2); // Функция возвращает максимальное из двух числовых значений for (i=limit;i>=0;i--) { hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i-dist2/2); // Устаревшие функция Highest собираются значения максимальной цены llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i-dist2/2); // Возвращает индекс наименьшего найденного значения (смещение относительно текущего бара) соответствующего графика b1[i] = EMPTY_VALUE; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) b2[i] = EMPTY_VALUE; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) double tr = iATR(NULL,0,5,i); if (i==hhb1) b1[i]=High[hhb1] + tr/2; if (i==llb1) b2[i]=Low[llb1] -tr/2; if(i == 0 && b1[i]!=0 && b2[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal Вверх Alert " + Symbol() + " on the " + Period() + " minute chart ");alertBar = Bars;} if(i == 0 && b2[i]!=0 && b1[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal ВНИЗ Alert " + Symbol() + " on the " + Period() + " minute chart ");alertBar = Bars;} } return(0); }
Малость добавлю
hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i-dist2/2); // Попытка заглянуть в будущее llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i-dist2/2); // Попытка заглянуть в будущее
ка то так получилось у меня
double tr = iATR(NULL,0,5,i); // дробное tr равняется Возвращает значение технического индикатора Average True Range тоже не понятно зачем присваивать NULL,0,5,i if (i==hhb1) b1[i]=High[hhb1] + tr/2; //Истина, если i равно hhb1 b1[i]равно Массив-таймсерии, содержащий максимальные цены каждого бара текущего графика hhb1 плюс tr деленное на 2 if (i==llb1) b2[i]=Low[llb1] -tr/2; //Истина, если i равно llb1 b2[i]равно Массив-таймсерия, содержащий минимальные цены каждого бара текущего графика llb1 минус tr деленное на 2 if(i == 0 && b1[i]!=0 && b2[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal Вверх Alert " + Symbol() + " on the " + Period() + " minute chart ");alertBar = Bars;} // если i равно 0 и b1[i] не равно 0 и b2[i] не равно 2147483647 и текущие бары больше прошедших сигнальных баров то срабатывает оповещение аллерт вверх, сигнальный бар равняется текущим баром if(i == 0 && b2[i]!=0 && b1[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal ВНИЗ Alert " + Symbol() + " on the " + Period() + " minute chart ");alertBar = Bars;} // здесь так же только вниз, сигнальный бар равняется текущим баром
Сразу появляется вопрос
время c 00:00 по 00:30 нужно назначать вначале а потом прилагать его к действию старт
какой торговой функцией лучше назначать торговую операцию для бинарных опционов.
приходится заглядывать в другие советники и смотреть как там это реализовано. не в 1, а в 3-5 разные, почти по каждому вопросу.
Вроде так лучше будет
//+------------------------------------------------------------------+ //| super-signals_v2.mq4 | //| Copyright © 2006, Nick Bilak, beluck[AT]gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Nick Bilak" #property copyright "alterations by Mark Tomlinson" #property link "https://www.forex-tsd.com/" #property indicator_chart_window // Свойства программ Выводить индикатор в окно графика #property indicator_buffers 2 // Свойства программ Количество буферов для расчета индикатора 2 Тип int #property indicator_color1 Red // Свойства программ Цвет для вывода линии1 красный #property indicator_color2 Yellow // Свойства программ Цвет для вывода линии2 желтый #property indicator_width1 5 // Свойства программ Толщина линии в графической серии 1 #property indicator_width2 5 // Свойства программ Толщина линии в графической серии 2 // input properties Вводные свойства extern int dist2 = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом. extern int dist1 = 59;// was 14 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом double b1[]; double b2[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() //для инициализации переменных которые предопределены, для проверок. { //настройка параметров отрисовки SetIndexBuffer(0,b1); //буфер для первой линии SetIndexBuffer(1,b2); //буфер для второй линии SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора SetIndexEmptyValue(0,0); SetIndexEmptyValue(1,0); return(0); // } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); // последний посчитанный бар будет пересчитан // проверка на возможные ошибки int i,limit,hhb1,llb1; if(Bars<MathMax(dist1,dist2)) return(-1); // Недостаточно баров для расчета limit=Bars-counted_bars; // основной цикл if(limit>1) { limit=Bars-MathMax(dist1,dist2)-1; } for(i=limit;i>=0;i--) { b1[i] = 0; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) b2[i] = 0; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i); // Поиск свечи с максимальной ценой llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i); // Поиск свечи с минимальной ценой double tr=iATR(NULL,0,5,i)*0.5; if(i==hhb1) b1[i]=High[hhb1] + tr; if(i==llb1) b2[i]=Low[llb1] -tr; } return(0); } //+------------------------------------------------------------------+
Проверил конечно на графике, то что не перерисовывает и оставляет старые сигналы думаю это дело вкуса
Не знаю лучше так или легче так.
вроде нашел нужную функцию
EventSetTimer
Здравствуйте друзья! Зря вы отказываетесь помочь. почему? Ваша не уверенность в том что именно эта стратегия не к чему хорошему вас не приведет или ну взял ну попробовал ошибся он(я), а кто-то время потратил репутацию не заработал. Лучше продать свое и подороже.
Да да знаю что не грааль, и сливает при определенных условиях, условия два(я вижу два).
Может кто ссылкой полезной поделится, хотя не дурак поисковом пользоваться умею. Главное правильно сформулировать вопросы и забить куда надо.
Подскажите как лучше добавить-написать на программном языке MQL4
Открытие одного ордера, если цена выше или ниже по закрытию сигнальной свечи(бара). (hhb1,llb1;)
И если ордер не прошел то следующий один ордер открылся на том же баре если он сигнальный, если не сигнальный бар то ждем следующего закрытия сигнального бара.
Если что то новое появится допишу здесь. Пользуйтесь, улучшайте бесплатно если увидите перспективу или полезный опыт для себя своих возможностей.
Скайп: xeon5923
for (int i=OrdersTotal()-1; i!=0; i--)
Проверка открытого ордера истина =(равно) 0; != (не больше) 0 (ПО замыслу должен быть максимум 1 открытый ордер)
То
OrderSend
(Открытие ордера)
ЕСЛИ
ticket==0(количество ордеров рано 0) И значения hhb1>(больше) llb1
ТО ордер открывается OP_BUY(покупка) по PRICE_CLOSE (цена закрытия бара);
ИНАЧЕ
ЕСЛИ
ticket==0(количество ордеров рано 0) И если значение hhb1<(меньше) llb1
ТО ордер открывается OP_SELL(продажа) по PRICE_CLOSE (цена закрытия бара);
ЕСЛИ цена OP_BUY(покупка) закрылась hhb1<(меньше) llb1 по PRICE_CLOSE (цена закрытия бара) То возвращаем OrderSend+lot*1,5 (первоначальные открытие ордера увеличенное в полтора раза);
ИЛИ цена OP_SELL(продажа) закрылась hhb1>(больше) llb1 по PRICE_CLOSE (цена закрытия бара) То возвращаем OrderSend+lot*1,5 (первоначальные открытие ордера увеличенное в полтора раза);
return(0);
Наверное примерно так должна быть периодичность со скобками () и операторами if, OrderSelect, true, false, И где и как лучше обозначить что OrderSend+lot*1,5 не должно превышать 4-5 раз.
double tr = iATR(NULL,0,5,i); // технический индикатор
С компилировалось нормально. Мартина нет.
На график не добавляется. Что-то не так сделал пока не могу понять что.
часть взял от сюда https://www.mql5.com/ru/forum/149243
//+------------------------------------------------------------------+ //| super-signals_v2.mq4 | //| Copyright © 2006, Nick Bilak, beluck[AT]gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Nick Bilak" #property copyright "alterations by Mark Tomlinson" #property link "https://www.forex-tsd.com/" #property indicator_chart_window // Свойства программ Выводить индикатор в окно графика #property indicator_buffers 2 // Свойства программ Количество буферов для расчета индикатора 2 Тип int #property indicator_color1 Red // Свойства программ Цвет для вывода линии 1 красный #property indicator_color2 Yellow // Свойства программ Цвет для вывода линии 2 желтый #property indicator_width1 5 // Свойства программ Толщина линии в графической серии 1 #property indicator_width2 5 // Свойства программ Толщина линии в графической серии 2 // input properties Вводные свойства extern int dist2 = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом. extern int dist1 = 59;// was 14 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом double alertBar; //дробная часть оповещения бара extern int SignalGap = 3; //переменная разрыв цены в потоке котировок extern double Lots = 1.0; //----цена лота совершается ставка в валюте депозита (не в лотах) OrderProfit(). MarketInfo()- MODE_TICKVALUE extern int Slippage = 6; extern int MagicNumber = 321; double b1[]; double b2[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() //для инициализации переменных которые предопределены, для проверок. { //настройка параметров отрисовки SetIndexBuffer(0,b1); //буфер для первой линии SetIndexBuffer(1,b2); //буфер для второй линии SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора SetIndexEmptyValue(0,0); SetIndexEmptyValue(1,0); if (Digits == 5 || Digits == 6) return(0); // } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); // последний посчитанный бар будет пересчитан // проверка на возможные ошибки int i,limit,hhb1,llb1,ticket; if(Bars<MathMax(dist1,dist2)) return(-1); // Недостаточно баров для расчета limit=Bars-counted_bars; // основной цикл if(limit>1) { limit=Bars-MathMax(dist1,dist2)-1; } for(i=limit;i>=0;i--) b1[i] = 0; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) b2[i] = 0; //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF) hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i); // Поиск свечи с максимальной ценой llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i); // Поиск свечи с минимальной ценой if (CountTrades() == 0) //--- подсчет количества ордеров открытых советником { double tr=iATR(NULL,0,5,i)*0.5; if(i==hhb1) b1[i]=High[hhb1] + tr; if(i==llb1) b2[i]=Low[llb1] -tr; if(CountTrades() == 0 && Ask < tr) // открытие ордеров бай { ticket = OrderSend(Symbol(),OP_BUY, Lots, PRICE_CLOSE, Slippage, 0, 0, "Buy", MagicNumber, 0, Blue); if (ticket>0) { OrderModify(ticket, OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit()+tr*Point,0,Blue); // установка тейкпрофита } } else if(CountTrades() == 0 && Bid > tr) // открытие ордеров селл { ticket = OrderSend(Symbol(),OP_SELL, Lots, PRICE_CLOSE, Slippage, 0, 0, "Sell", MagicNumber, 0, Red); if (ticket>0) { OrderModify(ticket, OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit()-tr*Point,0,Blue); // установка тейкпрофита } } } return(0); } //+------------------------------------------------------------------+ int CountTrades() // подсчет количества ордеров открытых советником { int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) count++; } } return(count);
С компилировалось нормально. Марина нет.
На график не добавляется. Что-то не так сделал пока не могу понять что.
часть взял от сюда https://www.mql5.com/ru/forum/149243
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Описание технического задания:
Надо что бы торговая операция открывалась один раз по закрытию бара(5м или не важно если не критично) когда сработал сигнал в период времени 00:00-00:30; 00:30-01:00;.....23:30-00:00;
сделка-5 25.5