//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
aMA_Init();
int hma = aMA_set(Per, Mode, AP);
int ic = IndicatorCounted();
int lim = Bars - ic - 1;
for(int i = lim; i > 0; i--){
L = iMA_getLevel(hma, i, Level);
if(iMA_isPinAbove(hma, i, Level)){
PA = Low;
}
Точка входа определяется из условия, что цена закрытия бара с индексом 1 должна быть между ценой быстрой и медленной средней.
Ордер байстоп выставляется, если быстрая выше медленно средней.
Ордер селлстоп выставляется, если наоборот.
Для корректной работы понадобятся библиотеки:
sysOther.mqh
sysStructure.mqh
sysNormalize.mqh
Версия: 0.0.0.9
от: 2013.07.25
Изменения коснулись основных функций. Обратная совместимость не поддерживается :(
Зато появилась возможность получать значения с разных таймфреймов.
Глобальные переменные и определения
#define ST_MODE_AVG Средняя линия индикатора. Рассчитывается как (Главная+Сигнальная)/2.
Можно использовать в функции iSth_get
string aStSets[]; Массив настроек стохастиков.
Каждый элемент содержит настройку для вызова одного индикатора.
Процедуры и функции
void aSth_Init Очищает стринговый массив. Использовать при инициализации советника или индикатора.
int aSth_set Сохраняет настройку стохастика в массив настроек. Возвращает индекс настройки в массиве.
double iSth_get Возвращает цену заданной линии стохастика по заданному индексу в массиве настроек и индексу бара.
int iSth_getArray Возвращает массив линии индикатора из 3-х элементов.
Работа с пересечениями
Определения #define ST_CRNONE 0 //Нет пересечения
#define ST_CRUP 1 //Быстрая пересекла медленную снизу вверх
#define ST_CRDW 2 //Быстрая пересекла медленную сверху вних
int iSth_Cross Определяем, было ли на баре с заданным индексом пересечение значений быстрого и медленного массива
Возвращает статус пересечения. (0: нет пересечения, 1: пересечение снизу вверх, 2: пересечение сверху вниз)
int iSth_CrossMainSignal Проверяет, если на баре с заданным индексом было пересечение главной и сигнальной линий
Библиотека находится в стадии разработки. При обновлении библиотеки, нужно перезакачать заголовочный файл из этого поста.
Версию и дату библиотеки можно найти в начале файла.
Индикатор ZigZag построенный на хай/лоу баров, где было пересечение главной линии с сигнальной.
А так же показано пересечение главной линии и уровня 80%.
[code=php]
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 LightGreen
#property indicator_color2 LightGreen
#property indicator_color3 Blue
#property indicator_color4 Blue
Возвращает цену заданной линии стохастика по заданному индексу в массиве настроек и индексу бара.
Синхронизация смещения происходит по времени бара с заданным индексом на текущем фрейме.
см. пример индикатора мультитаймфреймового стохастика
[code=php]
double iSth_get(int handle=0, int line=MODE_MAIN, int shift=-1, int dgt=0, bool useSinhro = true /** использовать синхронизацию таймфреймов. */){
/**
\version 0.0.0.5
\date 2013.07.25
\author Morochin Artiom
\details Возвращает цену заданной линии стохастика по заданному индексу в массиве настроек и индексу бара.
Синхронизация смещения происходит по времени бара с заданным индексом на текущем фрейме.
\internal
>Hist:
@0.0.0.5@2013.07.25@artamir [*] синхронизация с тф отличными от текущуго.
@0.0.0.4@2013.07.25@artamir [*] Изменения связанные с ST_MODE_AVG
@0.0.0.3@2013.07.25@artamir [*] Добавлено получение tf.
>Rev:0
*/
int k = Struc_KeyValue_int(aStSets[handle] , "@k");
int d = Struc_KeyValue_int(aStSets[handle] , "@d");
int sl = Struc_KeyValue_int(aStSets[handle] , "@sl");
double pr = Struc_KeyValue_double(aStSets[handle] , "@pr");
int me = Struc_KeyValue_int(aStSets[handle] , "@me");
string sy = Struc_KeyValue_string(aStSets[handle] , "@sy");
int tf = Struc_KeyValue_int(aStSets[handle] , "@tf");
int sh = shift;
if(sh<=-1){
sh = Struc_KeyValue_int(aStSets[handle], "@sh");
}
Определяем, было ли на баре с заданным индексом пересечение значений быстрого и медленного массива
Возвращает статус пересечения. (0: нет пересечения, 1: пересечение снизу вверх, 2: пересечение сверху вниз)
[code=php]
int iSth_Cross( double &f[] /** быстрый массив */
, double &s[] /** медленный массив */
, int shift=2 /** индекс бара для проверки пересечения */){
/**
\version 0.0.0.2
\date 2013.07.25
\author Morochin Artiom
\details Определяем, было ли на баре с заданным индексом пересечение значений быстрого и медленного массива
Возвращает статус пересечения. (0: нет пересечения, 1: пересечение снизу вверх, 2: пересечение сверху вниз)
\internal
>Hist:
@0.0.0.2@2013.07.25@artamir [] изменились определения.
@0.0.0.1@2013.07.17@artamir [] iSth_Cross
>Rev:0
*/
Проверяет, если на баре с заданным индексом было пересечение главной и сигнальной линий
[code=php]
int iSth_CrossMainSignal(int h, int shift = 1){
/**
\version 0.0.0.1
\date 2013.07.17
\author Morochin Artiom
\details Проверяет, если на баре с заданным индексом было пересечение главной и сигнальной линий
\internal
>Hist:
@0.0.0.1@2013.07.17@artamir [] iSth_CrossMainSignal
>Rev:0
*/
double f[];
double s[];
int ROWS_f = iSth_getArray(h, f, MODE_MAIN, shift);
int ROWS_s = iSth_getArray(h, s, MODE_SIGNAL, shift);
return(iSth_Cross(f,s,1));
}
[code=php]
int iSth_CrossMainLevel(int h, int l=80 /** exemple 80*/, int shift=1){
/**
\version 0.0.0.0
\date 2013.07.17
\author Morochin Artiom
\details Пересечение основной линии с заданным уровнем
\internal
>Hist:
>Rev:0
*/
double f[];
double s[];
int ROWS_f = iSth_getArray(h, f, MODE_MAIN, shift);
int ROWS_s = iSth_getArray(h, s, 0, 0, l);
return(iSth_Cross(f,s,1));