- Вилы Эндрюса - Каналы - Объекты - Чарты - MetaTrader 5 для Android
- Вилы Эндрюса - Каналы - Объекты - Чарт - MetaTrader 5 для iPhone
- Вилы Эндрюса - Каналы - Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ
Конкретизирую задачу.
Ниже приведён тестовый индикатор на котором я отрабатываю создание / отображение массива бинарных данных и динамическое отображение информации в обьекте OBJ_LABEL на основе этого массива.
Компилятор ошибок не выдаёт, но массивы не формируются, и OBJ_LABEL не отображается даже на этапе инициализации
//+------------------------------------------------------------------+ //| Clous Open Divergence | #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Gray #property indicator_color2 Blue #property indicator_color3 Red #property indicator_color4 Black //---- input parameters extern int CODPeriod=5; extern int iMAw0period=3; extern int smoothing_0=3; extern int smoothing_1=3; //--- переменые коэфициентов сглаживания double k_0, k_1; //--- буфферы double COD[], max[], min[], sm_0[100000], sm_1[100000]; int id_market[], id_buy[], id_sell[]; //--- функция инициализации int init() { string short_name; //---задаем аттрибуты отображения индикатора SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,COD); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,id_buy); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,id_sell); SetIndexStyle(3,DRAW_LINE); SetIndexBuffer(3,id_market); //---- задаем название индикатора short_name="COD_ObjectCreate("+CODPeriod+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); //Создаём идентификатор текущего состояния рынка ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора ObjectSet("id_market", OBJPROP_CORNER, 1); //Привязываем к правому верхниму углу ObjectSet("id_market", OBJPROP_XDISTANCE, 5); //координата Х ObjectSet("id_market", OBJPROP_YDISTANCE, 10); //Координата Y //--- подсчитываем индексы K для экспоненциального сглаживания k_0 = 2.0 / (smoothing_0 + 1); k_1 = 2.0 / (smoothing_1 + 1); //--- обнуляем начальные значения массива сглаженых данных sm_0[Bars]=0; sm_1[Bars]=0; //--- обнуляем основной массив ArrayInitialize(COD, 0.0); ArrayInitialize(id_buy, 0.0); ArrayInitialize(id_sell, 0.0); ArrayInitialize(id_market, 0.0); return(0); } //--- основная функция int start() { //--- определяем сколько баров надопросчитать (уже просчитаные бары не считаем) int counted_bars=IndicatorCounted(); int limit=Bars-counted_bars-1, pos; pos=limit; if(counted_bars>0) pos++; // предпоследний бар пересчитываем //--- задаем переменные в которые ложим значения мувингов и само значение индикатора double CODnotsmoothing, iMAclous, iMAopen; //--- основной цикл while(pos>=0) { //--- в переменные ложим значения индикаторов iMAclous = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_CLOSE,pos); iMAopen = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_OPEN,pos); //--- просчитываем значение индикатора CODnotsmoothing=iMAclous - iMAopen; sm_0[pos]=sm_0[pos+1] + k_0*(CODnotsmoothing - sm_0[pos+1]); sm_1[pos]=sm_1[pos+1] + k_1*(sm_0[pos] - sm_1[pos+1]); //--- кладём сглаженое значение в основной буффер для отображения индикатора COD COD[pos]=sm_1[pos]/Point; //Создаём массив идентификаторов if(COD[pos]>0) id_buy[pos]=1; else id_buy[pos]=0; if(COD[pos]<0) id_sell[pos]=-1; else id_sell[pos]=0; id_market[pos]= id_buy[pos]+id_sell[pos]; //Записываем данные в текстовую метку if(id_market[0]!=id_market[1]) { if(id_market[0]==1) {ObjectSetText("id_market","BUY",20,"Arial",Blue);} if(id_market[0]==-1) {ObjectSetText("id_market","SELL",20,"Arial",Red);} else{ObjectSetText("id_market","square",20,"Arial",Black);} } pos--; } return(0); }
.
Такой новаторский метод, и откуда уверенность что он должен
работать?!
Достачно заменить массивы для буферов на double.
Такой новаторский метод, и откуда уверенность что он должен
работать?!
Достачно заменить массивы для буферов на double.
Уверенности нету, Есть только вероятность, а если серьёзно то
предоставленный код несёт исключительно демонстрационную
функцию.
СПАСИБО за совет бинарные массивы сформировались и отобразились,
только непонятно почему так принципиально важно объявить из
значения как double.
Остался только один вопрос почему OBJ_LABEL не отображается.
а функции ObjectSet сообщают свойства уже имеющемуся объекту.
Наверное потому, что для создания объекта необходимо использовать
ObjectCreate(), а функции ObjectSet сообщают свойства уже имеющемуся объекту. |
Пожалуйста поясните, в коде уже имеется функция ObjectCreate().
//Создаём идентификатор текущего состояния рынка ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора ObjectSet("id_market", OBJPROP_CORNER, 1); //Привязываем к правому верхниму углу ObjectSet("id_market", OBJPROP_XDISTANCE, 5); //координата Х ObjectSet("id_market", OBJPROP_YDISTANCE, 10); //Координата Y
Наверное потому, что для создания объекта необходимо использовать
ObjectCreate(), а функции ObjectSet сообщают свойства уже имеющемуся объекту. |
Пожалуйста поясните, в коде уже имеется функция ObjectCreate().
//Создаём идентификатор текущего состояния рынка ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора ObjectSet("id_market", OBJPROP_CORNER, 1); //Привязываем к правому верхниму углу ObjectSet("id_market", OBJPROP_XDISTANCE, 5); //координата Х ObjectSet("id_market", OBJPROP_YDISTANCE, 10); //Координата Y
Да, действительно, прошу прощения. Я просто посмотрел в нижнюю часть кода, там нет.
Думаю, что это как-то связано с коротким именем.
1. Я бы не использовал в названии скобки.
2. Попробуйте в ф-ию WindowFind() поставить имя индикатора в том виде, как назван файл индикатора (без расширения, только имя).
Большое спасибо всем кто принимает участие в разработке этой
темы, когда подведу итог своим изысканиям по этой теме обязательно
отпишусь, а сейчас следующий вопрос.
Почему нижеприведённый код
if(RSI_MACD[cnt]>0)// && RSImax[cnt]>=20 && iMA_h1[cnt]>=0) h1id_sell[cnt]=-1; else h1id_sell[cnt]=0; Print("h1id_sell=", h1id_sell[0]); if(RSI_MACD[cnt]<0)// && RSImax[cnt]<=20 && iMA_h1[cnt]<=0) h1id_buy[cnt]=1; else h1id_buy[cnt]=0; Print("h1id_buy=",h1id_buy[0]);
Выдаёт в журнал следующую информацию
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования