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

От xbms, 13 апреля, 2013 в Уголок Программиста

#5901

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

 

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

 

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

Изменено 28 февраля, 2020 пользователем MikR0ReR

#5902

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

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

#5904

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

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

 Подскажите, как правильно записать последний массив?  При тесте в журнале выдает 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);

}


 

Изменено 10 марта, 2020 пользователем Норковый слон

#5905

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

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

#5907

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

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

 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).

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

#5908

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

#5909
9 минут назад, MikR0ReR сказал:

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

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

#5910

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

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, там будут данные для каждого бара. И учти что пример из массива с таймсерией.

 

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

Изменено 12 марта, 2020 пользователем MikR0ReR

#5911
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()? В чем их отличия?

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

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

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

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

Спойлер

#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.mq43 скач.

#5914

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

Изменено 14 марта, 2020 пользователем MikR0ReR

#5915
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;

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

#5916

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

Изменено 14 марта, 2020 пользователем MikR0ReR

#5917
3 минуты назад, MikR0ReR сказал:

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

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

#5918

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

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

FX Blue - Renko Bars.ex46 скач.

#5919
35 минут назад, Svob сказал:

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

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

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

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

#5920

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

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

#5921
1 час назад, MikR0ReR сказал:

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

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

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

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

#5922

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

#5923
1 час назад, MikR0ReR сказал:

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

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

#5924
В 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.ex42 скач.

Изменено 18 марта, 2020 пользователем Svob

#5925

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025