Как вызвать пользовательские индикоторы при написании советника?
Пример для ЗЗ:
//+----------------------------------------------------------------------------+ //| Возвращает экстремум ЗигЗага по его номеру. | //| Параметры: | //| sy - наименование инструмента (NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| ne - номер экстремума ( 0 - последний) | //| dp - ExtDepth | //| dv - ExtDeviation | //| bs - ExtBackstep | //+----------------------------------------------------------------------------+ double GetExtremumZZPrice(string sy="0", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) { if (sy=="" || sy=="0") sy=Symbol(); double zz; int i, k=iBars(sy, tf), ke=0; for (i=1; i<k; i++) { zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i); if (zz!=0) { ke++; if (ke>ne) return(zz); } } Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден"); return(0); }
Пример для ЗЗ:
//+----------------------------------------------------------------------------+ //| Возвращает экстремум ЗигЗага по его номеру. | //| Параметры: | //| sy - наименование инструмента (NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| ne - номер экстремума ( 0 - последний) | //| dp - ExtDepth | //| dv - ExtDeviation | //| bs - ExtBackstep | //+----------------------------------------------------------------------------+ double GetExtremumZZPrice(string sy="0", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) { if (sy=="" || sy=="0") sy=Symbol(); double zz; int i, k=iBars(sy, tf), ke=0; for (i=1; i<k; i++) { zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i); if (zz!=0) { ke++; if (ke>ne) return(zz); } } Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден"); return(0); }
dp - ExtDepth | //| dv - ExtDeviation | //| bs - ExtBackstep
extern double Lots = 0.1; extern double TrailingStop = 40; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double zz1, zz2; int cnt, ticket, total; if(Bars<100) { Print("bars less than 100"); return(0); }zz1=iCustom(0, 0, "ZigZag", dp, dv, bs, 0, 1);zz2=iCustom(0, 0, "ZigZag", dp, dv, bs, 0, 2);
total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржи
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUY
if(zz1>zz2)
Как при написаниии советника, вызвать пользовательские индикоторы ZigZag и Heiken Ashi?
При использовании "обычного" индикатора значения устанавливаюся ma=iMA(NULL...). Как быть здесь? Пожалуйста покажите на примере с небольшим кодом!
Заранее спасибо!
Посмотрите параграф Учебник по MQL4 - Простые программы на MQL4 - Совместное использование программ . (блок 5-6 в советнике shared.mq4). При необходимости можно вернуться и просмотреть роль буферов в пользовательских индикаторах в паранрафе Создание пользовательских индикаторов.
int start()
{
double HA_3_1, HA_4_1, HA_3_2, HA_4_2;
int cnt, ticket, total;
HA_3_1=iCustom(0,0,"Heiken Ashi",3,1);
HA_4_1=iCustom(0,0,"Heiken Ashi",4,1);
HA_3_2=iCustom(0,0,"Heiken Ashi",3,2);
HA_4_2=iCustom(0,0,"Heiken Ashi",4,2);
total=OrdersTotal();
if(total<1)
{
// Условие открытие позиции BUY
if(!HA_3_1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// Условие открытие позиции SELL
if(!HA_4_1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
// условие закрытие длинной позиции
if(!HA_4_1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
else
{
// условие закрытия короткой позиции
if(!HA_3_1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}
iCustom(0,0,"Heiken Ashi",3,1)является неправильным, так как у индикатора имеется четыре входных параметра - color1, color2, color3 и color4.Поэтому правильным будет такой вызов:
iCustom(0,0, "Heiken Ashi", Red, White, Red, White, 3, 1)это для четвертого буфера предыдущего бара.
Дело в том, что при использовании iCustom необходимо передавать входные параметры индикатора в том порядке, в котором они объявлены в самом индикаторе. В данном случае лично я вижу такой подбор входных параметров в Heiken Ashi:
extern color color1 = Red; extern color color2 = White; extern color color3 = Red; extern color color4 = White;Версия индикатора, на которую я ссылаюсь, прикрепил.
Поэкспериментировал - оказывается и болшее количество параметров можно передавать
если есть значение Буфера 3 (понижающаяся гистограмма), то тогда нет значения Буфера 4 (повышающаяся гистограмма). Как их сравнивать? Позиция на покупку открывается когда появляется растущая гистограмма - буффек 4. Короткая позиция открывается при понижающейся гистограмме - буффер 3. Пытался сравнить так : HA_3_2<HA_4_1 (длинная позиция), HA_4_2>HA_3_1 (короткая позиция). Ничего не получилось.
Если вы используете стандартный Heiken Ashi, поставляемый с MT4, то вызов
является неправильным, так как у индикатора имеется четыре входных параметра - color1, color2, color3 и color4.Поэтому правильным будет такой вызов:
это для четвертого буфера предыдущего бара.
Дело в том, что при использовании iCustom необходимо передавать входные параметры индикатора в том порядке, в котором они объявлены в самом индикаторе. В данном случае лично я вижу такой подбор входных параметров в Heiken Ashi:
Версия индикатора, на которую я ссылаюсь, прикрепил.
А почему именно 3-й индекс указываете? Значения какой тогда линии будут вызываться? Объясните пожалуйста, меня тоже интересует этот вопрос, но я не совсем понимаю. Мне нужны значения те, которые показываются в окне данных в терминале. И там всего одно значение к каждому бару, несмотря на то что 4 буфера и линии!!!
При использовании "обычного" индикатора значения устанавливаюся ma=iMA(NULL...). Как быть здесь? Пожалуйста покажите на примере с небольшим кодом!
Заранее спасибо!