Никогда не изучал программирование. но хочу написать советник - страница 8

 

ну так шо, товарищи программисты?
я автор темы и продолжаю спрашивать совет.


значит в шапке объявил структуру

и вот самое интересное, ЧТО ЭТО?
в онТИК определил условие, если нет открытых ордеров
то:
если быстрая машка больше медленной машки,
то: открываем ордер



вопрос. почему открывается ордер на каждом тике?

 
Sergey Lobzankin:

ну так шо, товарищи программисты?
я автор темы и продолжаю спрашивать совет.


значит в шапке объявил структуру

и вот самое интересное, ЧТО ЭТО?
в онТИК определил условие, если нет открытых ордеров
то:
если быстрая машка больше медленной машки,
то: открываем ордер



вопрос. почему открывается ордер на каждом тике?

Значит на каждом тике выполнено условие.

Если в условии должно быть пересечение МА, то на первом баре было < меньше, а на нулевом стало > больше. А в вашем условии на нулевом > больше и на первом > больше.

 

https://code.org/

https://scratch.mit.edu/

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

пройдитесь по ссылкам - там всё просто, на уровне школы (даже местами начальной), но хоть какое-то введение в алгоритмы и их запись. Иначе вы каждом чихе будете обращаться в форум и ожидать ответа, а это потеря времени, а время-деньги.

PS/ да и всем советую ознакомиться, scratch изнутри вообще шедевр - дедушка современно программирования

Code.org: Любой может научиться
Code.org: Любой может научиться
  • code.org
Каждый студент в каждой школе заслуживает возможность изучения компьютерных наук.
 
Sergey Lobzankin:

ну так шо, товарищи программисты?
я автор темы и продолжаю спрашивать совет.


значит в шапке объявил структуру

и вот самое интересное, ЧТО ЭТО?
в онТИК определил условие, если нет открытых ордеров
то:
если быстрая машка больше медленной машки,
то: открываем ордер



вопрос. почему открывается ордер на каждом тике?

Ну так шо, товарищ автор темы?

Вот Вам ещё месяц назад подсказывали, а Вы даже внимание не обращаете:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Никогда не изучал программирование. но хочу написать советник

Alexey Volchanskiy, 2018.04.10 17:47

Есть такая кнопочка "Код", слева от кнопки с буквами Aa. Вы ей оформите, так как вставлять код картинкой- это ужас ужасный )


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Никогда не изучал программирование. но хочу написать советник

Konstantin Nikitin, 2018.04.10 21:18

Ну что-то сверх естественного у вас там нет. Так что лучший вариант. Выложить его тут, но только через

Кто-то да подскажет что путного.


И до сих пор вставляете код картинкой.

 
Здравствуйте, столкнулся с такой проблемой. Эксперту нужны данные скользящей средней на нулевом и первом баре для анализа ситуации и для дальнейших расчётов.
Функция он OnCalculate впринципе придумана для написания индюка. А в советнике я вынес эту функцию отдельно но не могу дать ума как обратиться к ней из OnTick
 
Sergey Lobzankin:
Здравствуйте, столкнулся с такой проблемой. Эксперту нужны данные скользящей средней на нулевом и первом баре для анализа ситуации и для дальнейших расчётов.
Функция он OnCalculate впринципе придумана для написания индюка. А в советнике я вынес эту функцию отдельно но не могу дать ума как обратиться к ней из OnTick

Не нужно даже пытаться вынести OnCalculate из индикатора в советник! Просто в советнике необходимо обратится к индикатору (используя хенд индикатора) и получить данные.

Пример работы с iMA и с iStdDev в коде iMA iStdDev - выдержка кода из OnTick, получение данных с индикаторов iMA

   double ma_fast[],ma_normal[],stddev[];
   MqlRates rates[];
   ArraySetAsSeries(ma_fast,true);
   ArraySetAsSeries(ma_normal,true);
   ArraySetAsSeries(stddev,true);
   ArraySetAsSeries(rates,true);
   int buffer=0,start_pos=0,count=3;
   if(!iGetArray(handle_iMA_Fast,buffer,start_pos,count,ma_fast) || 
      !iGetArray(handle_iMA_Normal,buffer,start_pos,count,ma_normal) || 
      !iGetArray(handle_iStdDev,buffer,start_pos,count,stddev) || 
      CopyRates(m_symbol.Name(),Period(),start_pos,count,rates)!=count)
     {
      PrevBars=0;
      return;
     }
//---
   if(ma_fast[0]>ma_normal[0])
      if(rates[1].close>rates[1].open)
         if(rates[1].close>ma_normal[0])
            if(stddev[0]>stddev[1])
               m_need_open_buy=true;
   if(ma_fast[0]<ma_normal[0])
      if(rates[1].close<rates[1].open)
         if(rates[1].close<ma_normal[0])
            if(stddev[0]>stddev[1])
               m_need_open_sell=true;
 
Vladimir Karputov:

Не нужно даже пытаться вынести OnCalculate из индикатора в советник! Просто в советнике необходимо обратится к индикатору (используя хенд индикатора) и получить данные.

Пример работы с iMA и с iStdDev в коде iMA iStdDev - выдержка кода из OnTick, получение данных с индикаторов iMA

подозреваю что вы чертовски правы))))
сейчас попробую поиграю с массивами через  ...Array...

 

а вот ещё...
я получил хендлы сразу в шапке експерта

extern int    zazor      = 0;
extern double Lots       = 0.1;
extern int    TrailingStop = 15;
extern int    TrailingStep = 2;
extern int    Magic      = 123;
extern int    Slippage   = 5;
int Digits;

int timeprev=0;

int    ticket;
double price,TP,SL,lastlot;
string;

int ima1_handle          = iMA (Symbol(),0,14,0,MODE_EMA,PRICE_CLOSE);               //хендл
int ima2_handle          = iMA (Symbol(),0,64,0,MODE_EMA,PRICE_CLOSE);               //хендл
int Stoch_handle         = iStochastic (Symbol(),0,20,15,15,MODE_EMA,STO_CLOSECLOSE);//хендл
int ATR_handle           = iATR        (Symbol(),0,21);                              //хендл
double ima1_massiv [2];                                                              //статический массив для быстрой машки 

а на форумах кто как это делают,... все по разному? ктото в онИнит, ктото в ОнТик,
просто дело в том что при моём раскладе в ОнТик я копирую данные в массив и получаю же количество копируемых элементов

void OnTick()
  { 
    int ima_count1 = CopyBuffer(ima1_handle,0,1,2,ima1_massiv);    //скопировал данные из 2х буферов быстрой машки
    string str_ima1 = IntegerToString(ima_count1);                 //отладочная
    printf("мой первый хендл = "  + str_ima1);                     //отладочная
   }
P.S. кстати, тестер увидел все индикаторы, хендлы которых получены в шапке эксперта и отрисовал всё на графике визуализатора
 

вот здесь есть статья, которая понятно объясняет как реализовать доступ к данным индикатора
https://www.mql5.com/ru/articles/43

но, ребята,  данные скопированы в массив, не спорю, но мне же нужно получить конкретные цифры, то есть если машка на последнем тике текущего бара равна 1,32456, то я должен получить эту цифру в журнал (чтоб убедиться что цифра получена на самом деле),  мне нужно ВЫТАЩИТЬ ЭТУ КОНКРЕТНУЮ  ИНФОРМАЦИЮ в тип double, 

 для того чтоб вычислить количество пунктов типа int  между двумя разными машками. как получить ЭТО значение?


Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • www.mql5.com
В MQL5 существует несколько вариантов вызова индикаторов, и осуществляются они в основном при помощи функций IndicatorCreate() и iCustom(). Причем эти функции лишь возвращают хендл индикатора, и дальнейшая работа с индикаторами ведется именно через него. Так что же такое хендл? Как работать с функциями IndicatorCreate() и iCustom()? И как...
 
Sergey Lobzankin:

вот здесь есть статья, которая понятно объясняет как реализовать доступ к данным индикатора
https://www.mql5.com/ru/articles/43

но, ребята,  данные скопированы в массив, не спорю, но мне же нужно получить конкретные цифры, то есть если машка на последнем тике текущего бара равна 1,32456, то я должен получить эту цифру в журнал (чтоб убедиться что цифра получена на самом деле),  мне нужно ВЫТАЩИТЬ ЭТУ КОНКРЕТНУЮ  ИНФОРМАЦИЮ в тип double, 

 для того чтоб вычислить количество пунктов типа int  между двумя разными машками. как получить ЭТО значение?


Вы вообще смотрите и читаете то, что Вам говорят? Я же привёл пример в посте . Как раз идёт получение данных с двух iMA:

   double ma_fast[],ma_normal[],stddev[];
   MqlRates rates[];
   ArraySetAsSeries(ma_fast,true);
   ArraySetAsSeries(ma_normal,true);
   ArraySetAsSeries(stddev,true);
   ArraySetAsSeries(rates,true);
   int buffer=0,start_pos=0,count=3;
   if(!iGetArray(handle_iMA_Fast,buffer,start_pos,count,ma_fast) || 
      !iGetArray(handle_iMA_Normal,buffer,start_pos,count,ma_normal) || 
      !iGetArray(handle_iStdDev,buffer,start_pos,count,stddev) || 
      CopyRates(m_symbol.Name(),Period(),start_pos,count,rates)!=count)
     {
      PrevBars=0;
      return;
     }
//---
   if(ma_fast[0]>ma_normal[0])
      if(rates[1].close>rates[1].open)
         if(rates[1].close>ma_normal[0])
            if(stddev[0]>stddev[1])
               m_need_open_buy=true;
   if(ma_fast[0]<ma_normal[0])
      if(rates[1].close<rates[1].open)
         if(rates[1].close<ma_normal[0])
            if(stddev[0]>stddev[1])
               m_need_open_sell=true;

Здесь два индикатора iMA - "Fast" и "Normal". Данные с этих двух индикаторов получаем в массивы ma_fast и ma_normal соответственно. Запрашиваем от бара #start_pos в количестве count.

А дальше уже обращаемся к полученным данным (в этом примере обращаемся к данным на баре #0 )

Причина обращения: