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

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


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

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

@agimat81 Вот точно не будет такого мануала! Нужно экстраполировать знания GET POST запросов с C# на MQL. Я посмотрел MQL, GET POST запросы можно организовать. А вот парсинг придется выводить в DLL на C# или кто на чем любит. Можно конечно парсинг организовать и в MQL, но штатными средствами это займет кучу времени и нервов, может работать не стабильно, вообщем гарантий не даю, не предназначен он для парсинга.

 

Если я конечно правильно понял, что нужно работать с сайтом бинарником, то что написал выше верно.

 

Словом парсить я имел в виду извлечение нужных нам Cookie и ответов из множества.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Подскажите пожалуйста, при написании индюка,

как можно перенести значения цены закрытия бара любого другого инструмента на текущий для необходимых вычислении? 

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

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

Доброго времени суток.

Запутался чуток.

 Подскажите, как правильно записать последний массив?  При тесте в журнале выдает array out of range.

Спойлер

extern int     Period = 20;

double Close1;
double Close2;
double Max1;
double Min1;
double Dif[ ];
double idx[ ];

{

 for(int a =0 ; a<Bars-1; a++)        
   {
     Close1 = iClose(NULL, 0, a);
     Close2 = iClose("HO", 0, a);
     Dif[ a ] = NormalizeDouble(Close1 /Close2, 3);
   }
   for (int i =0; i<Bars-1 - Period; i++)
   {
     Max1 = Dif[ArrayMaximum(Dif,Period,i)];
     Min1 = Dif[ArrayMinimum(Dif,Period,i)];
     idx [ i ]= NormalizeDouble(100*(Dif[ i ]-Min1)/(Max1-Min1),2); // как обычную переменую типа double в журнал принт выводит, а в массив не                                                                                                                     //  влезает
   }

return(rates_total);

}


 

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

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

@Норковый слон  Чтоб индексы отображались используйте в спойлере тег "</>" или ставьте пробелы вокруг "i"

Чтоб Вам что-то подсказать покажите определение массива, т.е. строчку типа: double Dif[...]; или подобное.

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

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

И снова здравствуйте!

Есть функция:

 for(int i=period_1_ent; i>=1; i--)
     {
          if(iClose(NULL,tf_bs_1_ent,i)>iOpen(NULL,tf_bs_1_ent,i))
               res+=iClose(NULL,tf_bs_1_ent,i)-iOpen(NULL,tf_bs_1_ent,i);
}
 Если коротко: на периоде period_1_ent идет перебор свечей и если  свеча белая, то размер тела свечи складывается в  res.

Но возникло затруднение: как дописать функцию, чтобы, например, в Comment() или для дальнейшей работы? можно было использовать не только сам res на первом баре, но и res на любом из предыдущих баров. Если угодно, как получить функцию res(i).

Прошу, если кто может, помогите, Пожалуйста!!!        

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

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

@Владимир Стариков Вот сам себе ответил! Использовать массив res[].

Спасибо!Если можно, то по подробнее, что Вы имели в виду.

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

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

@Владимир Стариков 

for(q=Bars()-1-period_1_ent;q>=1;q--)
{
for(int i=q+period_1_ent; i>=q; i--)
     {
          if(iClose(NULL,tf_bs_1_ent,i)>iOpen(NULL,tf_bs_1_ent,i))
               res+=iClose(NULL,tf_bs_1_ent,i)-iOpen(NULL,tf_bs_1_ent,i);
}
ress[q]=res;
}

вот и получишь свой res(i) в виде массива ress, там будут данные для каждого бара. И учти что пример из массива с таймсерией.

 

Если я правильно понял, иначе разверните свой вопрос.

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

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

@Владимир Стариков 


for(q=Bars()-1-period_1_ent;q>=1;q--)
{
for(int i=q+period_1_ent; i>=q; i--)
     {
          if(iClose(NULL,tf_bs_1_ent,i)>iOpen(NULL,tf_bs_1_ent,i))
               res+=iClose(NULL,tf_bs_1_ent,i)-iOpen(NULL,tf_bs_1_ent,i);
}
ress[q]=res;
}

вот и получишь свой res(i) в виде массива ress, там будут данные для каждого бара. И учти что пример из массива с таймсерией.

 

Если я правильно понял, иначе разверните свой вопрос.

Еще раз благодарю. Как Вы поняли я не очень разбираюсь, но хотел бы продолжать развитие... В качестве консультации прошу пояснить следующее:

1. Bars() - количество баров на текущем графике. Т.е. получается, например на графике 5000 баров, period_1_ent=49, значит перебор свечей пойдет от 5000-1-49=4950 и до первого бара? Что-то странновато...Я просто не понимаю, может здесь и нет ошибки.

2. Вместо Bars()  можно ли использовать iBars()? В чем их отличия?

Буду признателен за ответы!

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @Владимир Стариков Будет странно если ты веришь что программистами рождаются. Учатся всему, водить машину, писать, читать, ходить человек тоже учится. Я тоже этому учился. Помогли мне уроки по MQL. Они есть на этом сайте. И множество в сети. Синтаксис MQL4 очень похож на синтаксис языка Си. И на сколько я знаю родителем стал язык C++.
  • Ну блин! iBars - Возвращает количество баров в истории по запрашиваемому символу и периоду. Ну например, у тебя программа работает по нескольким валютным парам и тебе нужно знать сколько баров на другой валютной паре. Bars - Количество баров на текущем графике. Если тебе не нужны данные другой валютной пары, есть путь короче, это Bars. Выполняется быстрее, пишется быстрее и т.д.
  • period_1_ent мы потом прибавляем к int i=q+period_1_ent Это что бы не выйти за рамки массива. Поэтому в ress[q] будут данные только за 4950 баров. А res будет считаться 4999 бара.
Ссылка на сообщение
Поделиться на другие сайты

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

Господа, приветствую, столкнулся с проблемой которую не могу решить уже несколько дней:

Есть такой индикатор, вот код:

Спойлер

#property copyright "TO"
#property link      "http://www.forex-tradexperts-to.narod.ru"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 OrangeRed
#property indicator_level1  -0.9
#property indicator_level2   0
#property indicator_level3   0.9
#property indicator_minimum -1.05
#property indicator_maximum  1.05
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2

extern int  Nbars=89;
extern int  MA_Period =9;
int  MA_Method =3;

double Value[];
double MA[];
double iFish[];
double Buy[];
double Sell[];

int init() 
{ 
   IndicatorBuffers(5);
   SetIndexBuffer(0, iFish); 
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1, Buy); 
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2, Sell); 
   SetIndexStyle(2,DRAW_LINE);
   
   SetIndexBuffer(3, Value);
   SetIndexBuffer(4, MA);
   
   IndicatorShortName("TREND FILTER ("+Nbars+","+MA_Period+")" );
   
   return(0); 
}  
int deinit() { return(0); } 

int start() 
{ 
   int counted_bars = IndicatorCounted(), i; 
   if (counted_bars < 0) return(-1); 
   if (counted_bars > 0) counted_bars--;  
   int limit=Bars - counted_bars+2*Nbars;
   double up,dn,osc;
   
   for(i = limit; i >= 0; i--) 
   {      
      up = High[iHighest(NULL,0,MODE_HIGH,Nbars,i)];
      dn = Low[iLowest(NULL,0,MODE_LOW,Nbars,i)]; 
      
      if (up>dn)osc = 100*(Close[i]-dn)/(up-dn);
      else osc = 0;
      if (osc < 0) osc = 0.1;
      if (osc > 100) osc = 99.9;
      Value[i]=0.1*(osc-50.0);      
   }   
   for(i = limit; i >= 0; i--)    
   {
      MA[i]=iMAOnArray(Value,0,MA_Period,0,MA_Method,i);
      iFish[i]=(MathExp(2.0*MA[i])-1.0)/(MathExp(2.0*MA[i])+1.0);
      if (iFish[i]> 0.9) {Buy[i] =iFish[i]; Buy[i+1] =iFish[i+1];}
      if (iFish[i]<-0.9) {Sell[i]=iFish[i]; Sell[i+1]=iFish[i+1];}
   } 
   return(0); 
} 

 

Сам по себе он отлично работает.

Обращаюсь к нему через iCustom,  допустим к первому буферу -  Trend =iCustom(_Symbol,tf,"TrendFilter",Nbars,MA_Period,1,i);

В ответ всегда получаю 0.0, причем не важно к какому буферу и номеру элемента обращаться, везде одинаково получаю 0.

В чем причина не пойму.

TrendFilter.mq4

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

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

@djnet Написано правильно! Смотри логи. Ищи проблему в другом месте. Дай файл своей проблемы.

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

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

@djnet Написано правильно! Смотри логи. Ищи проблему в другом месте. Дай файл своей проблемы.

В логах пусто, нет ошибок.

Суть идеи такая - один раз в сутки на открытии новой дневной свечи, сова опрашивает индикатор по часовым свечам за предыдущий день, если все данные лежат в одном диапазоне (для buy значения больше 0,9, для sell меньше -0,9)  то считаем что тренд buy или sell соответсвенно, если значения индикатора разные, считаем что тренда нет. 

Спойлер

int TrendFilter()
{
 int i=1;
 int trend=0; // 1 - buy, 2 - sell
 double Trend[25];
 ArrayFill(Trend,0,25,0);
//int currday=TimeDayOfYear(iTime(_Symbol,tf,0));
 int previusday=TimeDayOfYear(iTime(_Symbol,tf,1));
 int dayofyear=TimeDayOfYear(iTime(_Symbol,tf,1));
 while(dayofyear==previusday)
   {
    Trend[i] =iCustom(_Symbol,tf,"Trend Filter",Nbars,MA_Period,0,i);
    i++;
    dayofyear=TimeDayOfYear(iTime(_Symbol,tf,i));
    Print ("Trend[i] ", Trend[i]);
   }
   //int Tr_min=ArrayMinimum(Trend,WHOLE_ARRAY,0);
   //int Tr_max=ArrayMaximum(Trend,WHOLE_ARRAY,0);
   //if(Trend[Tr_max]<-0.9) trend=2;
   //if(Trend[Tr_min]>0.9) trend=1;
 return(trend);
}

 

tf=60;

Nbars=89;

MA_Period=9;

Функция в данном варианте в журнал шлет нули.

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

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

@djnet может tf=60; не нравится ему. iCustom написан правильно. Проверяй что передаешь в iCustom. И ЕСЛИ НУЖНА ПОМОЩЬ НЕ НАДО СЛАТЬ ОГРЫЗКИ КОДА.

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

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

@djnet может tf=60; не нравится ему. iCustom написан правильно. Проверяй что передаешь в iCustom. И ЕСЛИ НУЖНА ПОМОЩЬ НЕ НАДО СЛАТЬ ОГРЫЗКИ КОДА.

вся сова достаточно объемная, к тому же не до конца дописана и с кучей моего мусора, могу прислать :)), поставил вместо tf=60 -  PERIOD_H1. Заработало. Спасибо. Вообще не понятно почему так, вроде кучу индюков опрашивал одним и тем же способом, только этот выпендривается, буду знать на будущее - передаем таймфрейм только через ENUM.

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

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

Всем привет! Ребята, подскажите, можно ли этот индикатор прикрутить к советнику, чтобы ордера открывались при пересечении пунктирных линий или после формирования прямоугольника? Я пытался через iCustom, но не знаю как в нём найти индексы для линий или прямоугольников соответственно. Надеюсь, это вообще возможно в этом индюке..

2020-03-16_17-39-51.jpg

FX Blue - Renko Bars.ex4

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

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

Всем привет! Ребята, подскажите, можно ли этот индикатор прикрутить к советнику, чтобы ордера открывались при пересечении пунктирных линий или после формирования прямоугольника? Я пытался через iCustom, но не знаю как в нём найти индексы для линий или прямоугольников соответственно. Надеюсь, это вообще возможно в этом индюке..

2020-03-16_17-39-51.jpg

FX Blue - Renko Bars.ex4 40 \u043a\u0411 · 0 загрузок

А есть открытый код? Ведь индексы линий надо в нем смотреть..

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

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

@Владимир Стариков Код не нужен чтоб посмотреть индексы.

@Svob Прикрутить можно все, ну почти все. Этот индикатор не использует индексы , так что iCustom тебе не поможет. Он рисует объекты на графике, вот к ним привязаться можно.

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

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

@Владимир Стариков Код не нужен чтоб посмотреть индексы.

@Svob Прикрутить можно все, ну почти все. Этот индикатор не использует индексы , так что iCustom тебе не поможет. Он рисует объекты на графике, вот к ним привязаться можно.

А это с помощью ObjectGet? Или как-то по другому?

Какой-нибудь советник можешь посоветовать как пример?

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

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

@Svob Можно и ObjectGetDouble() вообщем все из группы "Графические объекты". Кода для примера нет. Поверь в свои силы и увидишь, что от иКастома не намного отличается привязка, ну просто больше кода придется написать.

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

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

@Svob Можно и ObjectGetDouble() вообщем все из группы "Графические объекты". Кода для примера нет. Поверь в свои силы и увидишь, что от иКастома не намного отличается привязка, ну просто больше кода придется написать.

Попробую.. Спасибо за мотивацию :D..

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

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

@Svob Можно и ObjectGetDouble() вообщем все из группы "Графические объекты". Кода для примера нет. Поверь в свои силы и увидишь, что от иКастома не намного отличается привязка, ну просто больше кода придется написать.

Вроде что-то получилось :).. Индикатор добавляю вручную. На тестере работает отлично. 

 

Спойлер

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
extern double Lots            = 0.1;
extern int    Magic           = 373737;
extern int    Slippage        = 3;
//+------------------------------------------------------------------+
double PriceHigh, PriceLow;
int ticket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
      Slippage   *= 10;
   }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}

void OnTick()
{
   PriceHigh = ObjectGetDouble(0,"RenkoIndUpTarget",OBJPROP_PRICE,0);
   PriceLow  = ObjectGetDouble(0,"RenkoIndDownTarget",OBJPROP_PRICE,0);
   
   
   if (Bid >= PriceHigh && CountSell() > 0)
   {
      for(int i = OrdersTotal() -1; i>=0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS))
         {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
               if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
                  Print("Error on close sell order");
         }
      }
   }

   if (Bid <= PriceLow && CountBuy() > 0)
   {
      for(int i = OrdersTotal() -1; i>=0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS))
         {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
               if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
                  Print("Error on close buy order");
         }
      }
   }
 
 
   if (CountBuy() == 0 && Bid >= PriceHigh)
   {
      ticket = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, "RomRenko", Magic, 0, Blue);
      if (ticket > 0)
      {
         Print("Buy order opened succesfully"); 
      } else Print("Error on open buy order");
   }
         
   if (CountSell() == 0 && Bid <= PriceLow)
   {
      ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "RomRenko", Magic, 0, Red);
      if (ticket > 0)
      {
         Print("Sell order opened succesfully");            
      } else Print("Error on open sell order");
   }
   
}


//+------------------------------------------------------------------+
int CountBuy()
{  
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
         count++;
      }
   }
   return(count);
}


//+------------------------------------------------------------------+
int CountSell()
{  
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
         count++;
      }
   }
   return(count);
}  
  
 

 

Но есть проблема: на демо-счёте работает не так, как надо. Открыл бай, не закрыл.. Не открыл селл соответственно.. (скрин прицепил). На других парах вообще ордера не открывает.

 

Может быть причина в том, что индикатор удаляет линии сразу после сработки и советник не успевает их отработать?

А можно, как вариант, привязаться не к линиям, а к последнему прямоугольнику, к его цвету?

 

 

2020-03-18_08-45-51.jpg

FX Blue - Renko Bars.ex4

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

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

@Svob Можно! Это все делается тоже через объекты. Прошлых сообщения я говорил не только о линиях и об прямоугольниках тоже.

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

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

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

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

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

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

Войти

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

Войти

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


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

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