iCustom функция

 
Добрый день!

Сегодня решил попробовать использовать iCustom для определения торговых условий в тестовом советнике (открывает и закрывает позицию при пересечении средней). Недавно сам сделал индикатор, который выдаёт сигналы 1 и -1 (пересечение средней). К сожалению при отсутствии ошибок советник не желает воспринимать iCustom. Хотя сам индикатор, открытый в отдельном окне в инструменте, продолжает показывать сигналы.

Если кто-то имел дело с iCustom, пожалуйста, подскажите - в чём моя ошибка? Заранее благодарен за помощь. (EMA_I - то, что я указываю в качестве сигнала индикатора)

#property copyright "Andrew Young"

// External variables
extern double LotSize=0.1;
extern double StopLoss=15;
extern double TakeProfit=30;
extern int MagicNumber=123;

// Global variables
int BuyTicket;
int SellTicket;
// Start function
int start()
{
// Trade conditions
double EMA_I = iCustom(NULL,0,"MA_1.mq4",0,0);
// Buy order
if (EMA_I == 1 && BuyTicket == 0)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);
// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;
bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,0,Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if (StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * Point);
if (TakeProfit >0) double BuyTakeProfit = OpenPrice + (TakeProfit * Point);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,0,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
SellTicket = 0;
}
// Sell order
if (EMA_I == -1 && SellTicket == 0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;
Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,0,Red);
}
OpenPrice = Bid;
if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * Point);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * Point);
SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,0,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
BuyTicket = 0;
}

return(0);
}
 
concord99:
Добрый день!

Сегодня решил попробовать использовать iCustom для определения торговых условий в тестовом советнике (открывает и закрывает позицию при пересечении средней). Недавно сам сделал индикатор, который выдаёт сигналы 1 и -1 (пересечение средней). К сожалению при отсутствии ошибок советник не желает воспринимать iCustom. Хотя сам индикатор, открытый в отдельном окне в инструменте, продолжает показывать сигналы.

Если кто-то имел дело с iCustom, пожалуйста, подскажите - в чём моя ошибка? Заранее благодарен за помощь. (EMA_I - то, что я указываю в качестве сигнала индикатора)

#property copyright "Andrew Young"

// External variables
extern double LotSize=0.1;
extern double StopLoss=15;
extern double TakeProfit=30;
extern int MagicNumber=123;

// Global variables
int BuyTicket;
int SellTicket;
// Start function
int start()
{
// Trade conditions
double EMA_I = iCustom(NULL,0,"MA_1.mq4",0,0);
// Buy order
if (EMA_I == 1 && BuyTicket == 0)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);
// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;
bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,0,Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if (StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * Point);
if (TakeProfit >0) double BuyTakeProfit = OpenPrice + (TakeProfit * Point);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,0,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
SellTicket = 0;
}
// Sell order
if (EMA_I == -1 && SellTicket == 0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;
Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,0,Red);
}
OpenPrice = Bid;
if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * Point);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * Point);
SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,0,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
BuyTicket = 0;
}

return(0);
}
Попробуйте так...double EMA_I = iCustom(NULL,0,"MA_1",0,0);
 
Synax:
Попробуйте так...double EMA_I = iCustom(NULL,0,"MA_1",0,0);

... сейчас попробую.... спасибо)
 

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators. 
Параметры:symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Пример:
  double val=iCustom(NULL, 0, "SampleInd",13,1,0);

 

double EMA_I = iCustom(NULL,0,"MA_1.mq4",0,0); - не введены параметры пользовательского индикатора (у машки, как правило, даже в пользовательском  в индюке внешний параметр - период сглаживания)

ну и название будет  "MA_1"

хотя зачем так сложно? double EMA_I=iMA(...);  - смотрите документацию MQL4 (в левом верхнем углу найдете ссылку)

 
PPC:

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Пример:
double val=iCustom(NULL, 0, "SampleInd",13,1,0);

double EMA_I = iCustom(NULL,0,"MA_1.mq4",0,0); - не введены параметры пользовательского индикатора (у машки, как правило, даже в пользовательском в индюке внешний параметр - период сглаживания)

ну и название будет "MA_1"

хотя зачем так сложно? double EMA_I=iMA(...); - смотрите документацию MQL4 (в левом верхнем углу найдете ссылку)


Все варианты перепробовал. Последний : double EMA_I = iCustom(NULL,0,"MA_1",24,0,0) Всё равно не работает - не открывает позицию. Значение EMA_I всегда равно 0.
 
PPC:

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)


хотя зачем так сложно? double EMA_I=iMA(...); - смотрите документацию MQL4 (в левом верхнем углу найдете ссылку)


Вот код самого индикатора:

//+------------------------------------------------------------------+

//| MA_1.mq4 |

//| Copyright © 2010, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2010, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net"


#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Blue

extern int Per=24;

int History=5000;

double MA_1[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

SetIndexBuffer(0,MA_1);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,Blue);

return;

}


//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

int i,Counted_bars;

double My_24EMA;

Counted_bars=IndicatorCounted();

i=Bars-Counted_bars-1;

if (i>History-1)

i=History-1;

while (i>=0)

{

MA_1[i+1]=0;

My_24EMA=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+1);

if (Close[i+1]>My_24EMA && Close[i+2]<My_24EMA)

{

MA_1[i+1]=1;

}

if (Close[i+1]<My_24EMA && Close[i+2]>My_24EMA)

{

MA_1[i+1]=-1;

}

i--;

}

return;

}

//+------------------------------------------------------------------+

я понимаю, что проще double EMA_I=iMA(...); но, я просто тестирую сам принцип использования iCustom ...ведь индикатор может быть другим и посложней

 
concord99, последний вариант, а именно
double EMA_I = iCustom(NULL,0,"MA_1",24,0,0);
Это верный вариант, а значение всегда нулевое, потому что написанный вами индикатор никогда не рисует нулевой бар.
 

Нулевой Бар всегда равен нулю

 
ага, ибо [i+1] - ежу ясно.
 
Techno:

Нулевой Бар всегда равен нулю


я поставил

Print("EMA_I рано",EMA_I);

.... EMA_I выдаёт одно и тоже 10-значное число!

ddouble EMA_I = iCustom(NULL,0,"MA_1.mq4",24,0,0);

Print("Значение индикатора = ",EMA_I);ouble EMA_I = iCustom(NULL,0,"MA_1.mq4",24,0,0);
Print("Значение индикатора = ",EMA_I);

 
concord99:


я поставил

Print("EMA_I рано",EMA_I);

.... EMA_I выдаёт одно и тоже 10-значное число!

ddouble EMA_I = iCustom(NULL,0,"MA_1.mq4",24,0,0);

Print("Значение индикатора = ",EMA_I);ouble EMA_I = iCustom(NULL,0,"MA_1.mq4",24,0,0);
Print("Значение индикатора = ",EMA_I);

Блин, нулевой бар не рассчитывается! поэтому 10 значное число, то есть максимум возможного, индикатор поправь
Причина обращения: