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

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


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

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

 

12 часов назад, MikR0ReR сказал:

@VAS35 почему решили что проблема на 3 свече. У вас Выдает ошибку?? так дайте скрин! Я например проверил ошибок нет. И я так понимаю вы дали не весь код, урезанный?? мне нужно конкретика.

Код был без отправки на мэйл. Вот полный код. И скрин.

Спойлер

//+------------------------------------------------------------------+
//|                                                       Figaro.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2     
#property indicator_color1 Blue   
#property indicator_color2 Red    
double Buy[];                   
double Sell[];                  
#define BUY 0
#define SELL 1
input bool EMail = false;
double         buy[];
double         sell[];
bool           AlertsON;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
AlertsON=(EMail && (!IsTesting() || IsVisualMode()) );
SetIndexBuffer (0, Buy);
SetIndexBuffer (1, Sell);  

SetIndexEmptyValue (0, 0);
SetIndexEmptyValue (1, 0);

SetIndexStyle (0, DRAW_ARROW);
SetIndexStyle (1, DRAW_ARROW); 
SetIndexArrow(0, 233);  // Стрелка "вверх" для покупок
SetIndexArrow(1, 234);  // Стрелка "вниз" для продаж

IndicatorDigits (Digits);

IndicatorShortName ("FIGARO");

SetIndexLabel(0, "Покупаем");
SetIndexLabel(1, "Продаём");

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 counted_bars = IndicatorCounted();
int limit, signal;

if (counted_bars>0) 
counted_bars-- ;

limit=Bars-counted_bars;

for(int i = 2; i < limit; i++) 
{
signal = Signal(i-1);
if (signal == BUY)
{ 
Buy[i-1] = low[i-1];
}
else
if (signal == SELL)
{
Sell[i-1] = high[i-1];
}
}
 AlertsFun(buy,sell,time[0],1);
return(rates_total); } 
//+------------------------------------------------------------------+
void AlertsFun(double & aBuy[],double & aSell[],datetime aTime0,int aIndex)
   {
   if(AlertsON)
     {
       string mes="";
       static datetime blt=0;
       static datetime slt=0;   
          
       if(blt==0)
        {
          blt=aTime0;
          slt=aTime0;
        }
      if(blt!=aTime0)
       {   
         if(aBuy[aIndex]!=0 && aBuy[aIndex]!=EMPTY_VALUE)
           {
             blt=aTime0;
             mes=WindowExpertName()+"("+Symbol()+","+(string)(PeriodSeconds()/60)+"): buy";
            
            if(EMail)
             {
               SendMail(mes,mes);
             }
             
            if(IsTesting())
             {
               Comment(TimeToStr(aTime0)+" :: "+mes);
             }
           }   
      }
      if(slt!=aTime0)
       {   
         if(aSell[aIndex]!=0 && aSell[aIndex]!=EMPTY_VALUE)
            {
              slt=aTime0;
              mes=WindowExpertName()+"("+Symbol()+","+(string)(PeriodSeconds()/60)+"): sell";
           
            if(EMail)
              {
                SendMail(mes,mes);
              } 
               
            if(IsTesting())
              {
                Comment(TimeToStr(aTime0)+" :: "+mes);
              }                     
            } 
       }
   }
}
int Signal(int i)
{
     double O_1 = iOpen(Symbol(), 0, 1);
     double O_2 = iOpen(Symbol(), 0, 2);
     double O_3 = iOpen(Symbol(), 0, 3);
     double O_4 = iOpen(Symbol(), 0, 4);
     double C_1 = iClose(Symbol(), 0, 1);
     double C_2 = iClose(Symbol(), 0, 2);
     double C_3 = iClose(Symbol(), 0, 3);
     double C_4 = iClose(Symbol(), 0, 4);
     double H_1 = iHigh(Symbol(), 0, 1);
     double H_2 = iHigh(Symbol(), 0, 2);
     double L_1 = iLow(Symbol(), 0, 1);
     double L_2 = iLow(Symbol(), 0, 2);
     double S_1 = iVolume(Symbol(), 0, 1);
     double S_2 = iVolume(Symbol(), 0, 2);
     double S_3 = iVolume(Symbol(), 0, 3);
     
if ((O_1<C_1 && S_1>=8 && S_2==0 && O_3>C_3 && O_4>C_4 && (H_2-O_2)>=6 && (C_2-L_2)>=6) || (O_1<C_1 && S_1>=10 && O_2>C_2 && S_2>=8 && O_3>C_3 &&
O_4>C_4 && S_3>=8 && O_1<=C_2 && O_1<C_3 && O_2<C_1 && O_3<C_1) || (O_1<C_1 && O_2>C_2 && O_3>C_3 && O_4>C_4 && S_1<=1 && (O_1-L_1)>=5 && (H_1-C_1)<=2) || (O_1<C_1 && S_1>=10 &&
O_2>C_2 && O_3>C_3 && S_2>=10 && S_1>=S_2*0.6 && O_1<C_2 && (H_1-C_1)<=2 && (O_1-L_1)<=2 && (H_2-O_2)<=2 && (C_2-L_2)<=2) || (O_1<C_1 && S_1>=10 && O_2>C_2 &&
S_2>=8 && C_1<=C_2 && (H_1-C_1)<=2 && (O_1-L_1)<=2 && (H_2-O_2)<=2 && (C_2-L_2)<=2))

  
     return (BUY);
     
if ((O_1>C_1 && S_1>=8 && S_2==0 && O_3<C_3 && O_4<C_4 && (H_2-O_2)>=6 && (C_2-L_2)>=6) || (O_1>C_1 && S_1>=10 && O_2<C_2 && O_3<C_3 && O_4<C_4 &&
S_2>=8 && S_3>=8 && O_1>=C_2 && O_1>C_3 && O_2>C_1 && O_3>C_1) || (O_1>C_1 && O_2<C_2 && O_3<C_3 && O_4<C_4 && S_1<=1 && (C_1-L_1)>=5 && (H_1-O_1)<=2) || (O_1>C_1 && S_1>=10 && 
O_2<C_2 && O_3<C_3 && O_4<C_4 && S_2>=10 && S_1>=S_2*0.6 && O_1>C_2 && (H_1-O_1)<=2 && (C_1-L_1)<=2 && (H_2-C_2)<=2 && (O_2-L_2)<=2) || (O_1>C_1 && S_1>=10 && O_2<C_2 &&
O_3<C_3 && O_4<C_4 && S_2>=8 && C_1>=C_2 && (H_1-O_1)<=2 && (C_1-L_1)<=2 && (H_2-C_2)<=2 && (O_2-L_2)<=2))
    
     
     return (SELL);
     
     return(-1);
     
}

 

Спойлер

Фигаро.PNG

 

На скрине видно, что 3 свеча небольшая. Хотя в коде пытался прописать, чтобы размер был от 8.

Отправку на почту ещё до ума не довел. Не проверил.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

@VAS35 Прошу не спамь! Пользуйся кнопочкой изменить, если хочешь что то дописать.

Я хочу помочь! Но на скрине вижу много свечей и стрелку. И как мне понять что ты считаешь 1-ой свечой и что 3-ей?

Потом я обратил внимание что у меня индикатор не работает, не рисует стрелки.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 минут назад, MikR0ReR сказал:

@VAS35 Прошу не спамь! Пользуйся кнопочкой изменить, если хочешь что то дописать.

Я хочу помочь! Но на скрине вижу много свечей и стрелку. И как мне понять что ты считаешь 1-ой свечой и что 3-ей?

Потом я обратил внимание что у меня индикатор не работает, не рисует стрелки.

Прошу прощения. Я только что гонял его в тестере и сделал скрин. Первой считаю ту, на которой стрелка.

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

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

899045991_.PNG.67517837f602d342b157366c92baa880.png.098b520e7babbdd5723a8fd05e86876c.png

  • И что должно произойти по твоему с 3-й свечей? Стрелка в низ? 
  • я протестил, у меня все стрелки рисуются, вверх и вниз.
  • так, еще могут не отсеиваться бары по причине значности брокера. Я говорю о том что может ты упустил что 8 пунктов 4-х значного брокера есть 80 пунктов 5-и значного брокера. Не, не то?
Ссылка на сообщение
Поделиться на другие сайты

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

Разве свечи считаются не справа - налево?  Первая свеча со стрелкой, вторая - предыдущая, и так далее. Да и вначале кода прописано Digits...

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @VAS35 понял про какую свечу ты говоришь. Так теперь что на ней должно быть стрелка в низ?
  • если ты об этом IndicatorDigits(Digits); то это влияет на окно "Окно Данных" в МТ4 с какой точностью там будут отображаться данные. На код и вычисления не влияет.
  • походу придется разбираться с твоим кодом, вникать в идею, что бы понять тебя.
Ссылка на сообщение
Поделиться на другие сайты

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

Не. Смотри. Свечи здесь вообще быть не должно.  Здесь должна была отработать модель поглощения.  Типа бычья свеча поглотила 2 медвежьи, причем объём 2-ой больше 8 и объём третьей тоже больше 8, и обе они медвежьи. А по факту получается, что 2 и 3 свечи медвежьи, но, объём второй больше 8, а третьей - меньше. А насчет знаков после запятой, как прописать тогда?

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

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

Интересно получилось. Только он стал размещать стрелку с запозданием в 1 бар. А объём третьей свечи, к сожалению, не считает. Я тоже грешил на количество свечей. Вывел лимит в принт, чтобы посмотреть, сколько он считает свечей. И пробовал колдовать с ним. Но он стал рисовать разное количество стрелок. Блин, я года три назад писал советник с таким же принципом, только еще с МА, RSI и MACD. Там таких проблем не было. Получилось очень достойно. На старом компе накрылся южный мост. Надо как-то выцарапать данные с диска. Как достану, выложу сюда. Просто были иногда ложные сигналы. А мне всё надо было полную безубыточность.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @VAS35 Так мне дальше смотреть ошибки в коде, по этой 3 свече?
  • Я тут посмотрел, ты говоришь о объеме, если речь идет о long S_3 = iVolume(NULL, 0, q+3); то тут ты не прав. Все считает, минимальный объем около 100, а у тебя стоит 8. Давай подумай 100 > 8, я думаю да. Ну так такое условие стоит и у тебя, вот оно и исполняется.
Изменено пользователем MikR0ReR
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
36 минут назад, MikR0ReR сказал:

@VAS35 Так мне дальше смотреть ошибки в коде, по этой 3 свече?

Если не сложно, давай попробуем разобраться. 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
18 минут назад, lexinson сказал:

Уважаемые программисты, подскажите, почему при появлении стрелочки не появляется алерт? Индикатор не мой, хотел доработать под себя. Заранее благодарю

 

3-MA-Cross-Alert.mq4 9 \u043a\u0411 · 2 загрузки

все чиать лень, ты буферу значание придай,   а алерт отдельно  выведи, как то так не даешь   ему значечения, а алерт отднльно 

1399332651_618798809.jpg

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

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

В блоке int OnCalculate есть "const long &volume[]" и "const int &spread[]". Они в mq4 работают и что в них хранится. Ну по поводу spread я догадываюсь что там должно. Я запамятовал.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
14 минут назад, MikR0ReR сказал:

@Partorius iCustom строку полностью напиши

Спойлер

double buy              = iCustom (Symbol(), 0, "Индикатор уровней", 1000, "---Таймфреймы---", False, True, True, True, True, True, False, "---Уровни Мюррея---", True, True, True, False, True, False, False, False, True, False, True, True, True, False, "---Зоны стохастика---", 70, 30, "---фильтр форекс (паттерны)---", True, True, True, True, True, True, "---фильтр бинарных опционов---", False, False, False, "---Стили---", Blue, Orange, 10, 1, 15, While, While, "---Сигналы---", True, False, False, "---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
47 минут назад, MikR0ReR сказал:

@Partorius Много входных данных! Не влезаю в ограниченную область 6 последних параметров.

И что с этим делать?

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

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

@Partorius

  1. если есть доступ к исходнику индикатора
//сейчас так
"---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

//мы знаем что не влезают последние 6 параметров как от нас хочет iCustom и по его мнению должно быть вот так
"---Тренд---", True, 20, 20, False, True, True, True, True, 1, 1);

//в исходнике в блоке "---Тренд---" меняем местами переменные, Chartreuse, Red поднимаем выше.
//Примерно получится так если передовать все параметры на iCustom. Опять же всю строку iCustom приводить не буду, только последний кусок.
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, True, True, False, False, True, True, 1, 1);

//и опять мы знаем что не влезают последние 6 параметров. обрезаем и должно получится так
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, 1, 1);

те параметры которые мы не указали, что не влезли, "True, True, False, False, True, True" возьмутся из исходника, но к ним, как мы знаем не будет доступа для изменения.

 

  1. если у нас нет доступа к исходнику индикатора
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
22 минуты назад, MikR0ReR сказал:

@Partorius

  1. если есть доступ к исходнику индикатора

//сейчас так
"---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

//мы знаем что не влезают последние 6 параметров как от нас хочет iCustom и по его мнению должно быть вот так
"---Тренд---", True, 20, 20, False, True, True, True, True, 1, 1);

//в исходнике в блоке "---Тренд---" меняем местами переменные, Chartreuse, Red поднимаем выше.
//Примерно получится так если передовать все параметры на iCustom. Опять же всю строку iCustom приводить не буду, только последний кусок.
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, True, True, False, False, True, True, 1, 1);

//и опять мы знаем что не влезают последние 6 параметров. обрезаем и должно получится так
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, 1, 1);

те параметры которые мы не указали, что не влезли, "True, True, False, False, True, True" возьмутся из исходника, но к ним, как мы знаем не будет доступа для изменения.

 

  1. если у нас нет доступа к исходнику индикатора

Естественно исходника нет, попробую второй вариант

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

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

@Partorius добавлю, iCustom может принять до 64 параметров (не проверял), у Вас 65, так что можно попробовать влезть...

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

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

@0ll проверено методом тыка, не влезают 6 параметров, итог 49 параметров влезает вiCustom (проверено)

 

Да верно 59, опечатка.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
28 минут назад, MikR0ReR сказал:

не влезают 6 параметров, итог 49 параметров влезает вiCustom (проверено)

отлично! но я насчитал 65 и -6 = 59?

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

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

Всем привет! Имеются 2 функции, в которых содержатся массивы ордеров, а точнее их профиты. Первый будет массив который собрал профиты в реальном времени, а второй взял профиты ордеров с истории. Идея такова, т.к. торговля происходит в двух направлениях, то при возникновении ситуации с просадкой какой-то сетки, мы закрываем убыточные ордера неубыточными, взятыми с истории. Ну так вот коды 2-х функций которые создают массивы: 

 
Спойлер

//+---------------------Профит уже закрытых ордеров на продажу----------------------+
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[i-1]=OrderProfit();
            counter++;
           }
        }
     }
   ArrayResize(cSellProfitClose,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[i-1]=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cBuyProfitOpen,counter);
   return;
  }

 

Теперь что я делаю, я хочу закрыть к примеру покупки, т.е. сетку которая находится в просадке по buy:

 
Спойлер

                  //закрытие покупок
                  OrderProfitSellClose(cSellProfitClose);// Профит уже закрытых ордеров на продажу

                  double SellProfitClose = 0.0; // создаю переменную в которую будет сливаться весь перечисленный профит ордеров

                  for(int b=0; b < ArraySize(cSellProfitClose); b++) //перебираю массив
                    {
                     cSellProfitClose=+SellProfitClose; // суммирую профит закрытых ордеров по продажам, которые взяты с истории по функции
                    }

                  OrderProfitBuy(cBuyProfitOpen);        // Профит еще не закрытых ордеров на покупку

                  double BuyProfitOpen = 0.0; // так же создаю переменную куда будет скапливаться вся сумма по профиту на buy, те самые просадочные ордера в минусе

                  for(int t=0; t < ArraySize(cBuyProfitOpen); t++) // перебираю массив на buy 
                    {
                     cBuyProfitOpen[t]=+BuyProfitOpen; // суммирую все минусовые просадки по профиту
                     if(MathAbs(BuyProfitOpen) <= SellProfitClose) // здесь сравниваю две переменные с их суммами, уравнивая знак ''-'' на ''+''
                       {
                        if(OrderType() == OP_BUY)
                           bool close_profit_buy = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage); // здесь закрываю ордера ровно или приблезительно на тот профит который стоит по условию закрытия
                       }
                    }
                 }

 

И, не работает))) Что сделал не так? Прошу помогите.

По коду конечно это пример того как хочется чтоб работало, мне придется еще добавлять условия по закрытию, но пока я остановился на этом и непонятно почему не закрывает. Хотелось бы посмотреть для начала как это работает.

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

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

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

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

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

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

Войти

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

Войти

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


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

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