Изучаем язык программирования MQL4

gravity

Местный знаток
Думаю нет слова return
Там шапки вообще нет.
Этот работает. Но так ли как надо) я не уверен.
Открытие ордеров по двум машкам, просто чтоб проверить как работает. Но лучше к человеку по грамотнее обратиться.
 

Вложения

  • Like
Реакции: Ugar

MrGreen86

Гуру форума
Перебирать с конца надо только если закрываем и удаляем все ордера, не важно в каком порядке. В остальных случаях, порядок зависит от ситуации, как выгоднее.
прямой порядок можно использовать только при условии что на счете работает один советник.
 

MrGreen86

Гуру форума
А эту функцию уже исправили? Когда то столкнулся с проблемой что через несколько вызовов функция просто переставала менять размер. И глючила только если задан резерв. Убрал резерв и всё стало стабильно работать. С этим сталкивался давно, но как показывает практика, исправлений можно ждать годами и не дождаться.
не сталкивался, видимо исправили.
 

Ugar

Гуру форума
Там шапки вообще нет.
Этот работает. Но так ли как надо) я не уверен.
Открытие ордеров по двум машкам, просто чтоб проверить как работает. Но лучше к человеку по грамотнее обратиться.
Я вижу в советнике пользовательские функции. Здесь вроде не описывали как их писать. С ними удобнее однозначно, чем писать всё по порядку.
 

gravity

Местный знаток
Я вижу в советнике пользовательские функции. Здесь вроде не описывали как их писать. С ними удобнее однозначно, чем писать всё по порядку.
По видеоурокам, которые в первом посте темы, года 2 назад, пытался учиться. Делал там задания и эти функции остались в mql примерах.
 

Ugar

Гуру форума
Неясно как встроить в int start
Пользовательские функции не надо встраивать в функцию работающую по событиям start(), OnStart(), Init(), OnInit(), OnTick(),... Они размещаются на глобальном уровне. А в этих функциях вызывают функцию. В этой ветке разбиралось как вызывать функции.
 

Ugar

Гуру форума
Пользовательская функция может находиться вообще в другом файле, другой программе или библиотеке функций. В этом случае придётся импортировать функцию. Например вот так выглядит импорт функции из стандартной библиотеки, возвращающей расшифровку ошибки.
Код:
#import "stdlib.ex4"
   string ErrorDescription(int a0);
#import

А так выглядит импорт функции из DLL, которая в составе винды. Она может запустить другую программу в компьютере, даже вирус.
Код:
#import "Shell32.dll"
int ShellExecuteW(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd);
#import
После такого импорта, можно вызывать функцию как обычно.
 
Последнее редактирование:

ZIKILO

Элитный участник
Доброго времени суток. Господа, а как создать индикатор или скрипт, который подсчитывает количество зигзагов разной длины за определенный период времени? к примеру по паре евродолл за год сколько ЗигЗ до 30пп, сколько ЗигЗ от 30до 60пп, сколько ЗигЗ от 60 до 90пп и сколько ЗигЗ более 90пп
 

Ugar

Гуру форума
Доброго времени суток. Господа, а как создать индикатор или скрипт, который подсчитывает количество зигзагов разной длины за определенный период времени? к примеру по паре евродолл за год сколько ЗигЗ до 30пп, сколько ЗигЗ от 30до 60пп, сколько ЗигЗ от 60 до 90пп и сколько ЗигЗ более 90пп
У зигзага есть только экстремуму (переломы). Только в этих точках есть значения буферов.
По заданной дате найти номер бара.
В цикле перебирать бары от найденного до текущего. При этом вызывать индикатор для обнаружения экстремумов. Ну а если есть значения экстремумов, дальше уже голая арифметика. Можно загнать их в массив и уже потом из него считать, а можно сразу сравнивать прошлый экстремум с текущим и считать.
 

MrGreen86

Гуру форума
Это правильно, но как это закодить?
C++:
#property strict
#property show_inputs

input int      size_step      = 150;            // шаг размера зиг зага
input datetime start_date     = D'2019.01.01';  // стартовая дата
input int      InpDepth       = 12;             // Depth
input int      InpDeviation   = 5;              // Deviation
input int      InpBackstep    = 3;              // Backstep

//+------------------------------------------------------------------+
void OnStart() {
   int i;
   int zz_num_max=0;
   int zz_num[1];  zz_num[0] = 0;
 
   double zz_last = 0;
   for(i = 1;i<Bars;i++) {
      // дошли до заданной даты, дальше не считаем
      if(Time[i]<start_date) break;
      // получим значение ZZ
      double zz_value = iCustom(NULL,0,"ZigZag",InpDepth,InpDeviation,InpBackstep,0,i);
      // значение пустое - нет вершинки
      if(zz_value <= 0.0) continue;
      // расчитаем текущий зиг заг, если уже была вершина
      if(zz_last!=0) {
         // размер волны
         int zz_size = (int)(MathAbs(zz_value - zz_last) / _Point);
         // к какому шагу она относится
         int zz_step = zz_size / size_step ;
         // запишем какая максимальная волная была, для отображения.
         // тут же изменим размер массива
         if(zz_step>zz_num_max) {
            zz_num_max = zz_step;
            ArrayResize(zz_num,zz_step+1,100);
         }
         // посчитаем количество волн
         zz_num[ zz_step ] ++;
      }
      // запишем вершину зиг зага как прошлую
      zz_last = zz_value;
   }
 
   // отобразим информацию на экране
   string cm="";
   for(i=0;i<=zz_num_max;i++)
      cm = cm+StringConcatenate("от ",(string)(size_step*i)," до ",(string)(size_step*(i+1)-1)," - ",(string)zz_num[i],"\n");
   Comment(cm);
}
//+------------------------------------------------------------------+
 

Вложения

Последнее редактирование:

BorisSedov

Активный участник
Следующая задача.
Напишите скрипт подсчитывающий количество непрерывных серий из свеч – закрытых выше открытия (серия вверх), а также закрытых ниже открытия (серия вниз). В скрипт задается параметр – количество свеч в серии. Пример – задано во входных параметрах 6 свеч, скрипт должен вывести количество непрерывных серий из 6 свеч в одну сторону идущих подряд, отдельное значение для серий вверх и вниз. Подсчет ведется на всю глубину графика. Скрипт должен вывести количество таких непрерывных серий.
 

Ugar

Гуру форума
Я думаю я не один такой..... желающий разобраться в основах и тонкостях языка.
Основы в этой ветке уже есть. Без них никак. А вот если основы уже освоены, надо дерзать, пробовать запрограммировать то что нужно самостоятельно, вооружившись справочником. Не просить готовый код, а самостоятельно писать свой. Если что то не получается, и не получается понять почему, можно спросить. Хотел что бы работало так..., написал код..., помогите понять что неправильно.
 

Басмач

Прохожий
Милейшие, давайте рассмотрим как простым способом поменять в советнике стоп лосс на отложенный ордер
 

Ugar

Гуру форума
Милейшие, давайте рассмотрим как простым способом поменять в советнике стоп лосс на отложенный ордер
А как это сделать вручную? Так же и в советнике. Советник работает с ордерами так же как и вручную.
Что бы сделки открывались без стоп лосса, его уровень надо задать =0. Либо ордер открывается со стоп лосс функцией OrderSend(), либо стоп лосс добавляется к ордеру функцией OrderModify().
Ну а потом после открытия сделки, установить отложенный ордер функцией OrderSend(). Соответственно, если отложка вместо стоп лосс, то в качестве цены открытия уровень стоп лосс, а лот равен лоту сделки.
Это если вопрос по MQL4. В MQL5 всё делается функцией OrderSend(). Там, кроме переменных и массивов, обязательно надо освоить структуры. Можно освоить и классы, тогда можно использовать стандартные, например CTrade. Классы не обязательно, можно обойтись и без них, но без структур никак.
 

gravity

Местный знаток
Следующая задача.
Напишите скрипт подсчитывающий количество непрерывных серий из свеч – закрытых выше открытия (серия вверх), а также закрытых ниже открытия (серия вниз). В скрипт задается параметр – количество свеч в серии. Пример – задано во входных параметрах 6 свеч, скрипт должен вывести количество непрерывных серий из 6 свеч в одну сторону идущих подряд, отдельное значение для серий вверх и вниз. Подсчет ведется на всю глубину графика. Скрипт должен вывести количество таких непрерывных серий.
Пытался, пытался. Но ничего толкогого не вышло.
А пытался сделать через обычный цикл перебора баров. Потом была задумка, чтобы узнать идут ли бары подряд, вычитать из предыдущего бара последующий и если эта разница == 1, то бары идут подряд и считаем их количество. При условии,что счетчик == количеству указанных баров идущих подряд, то начинаем подсчет баров заново.
Вот как-то так, но до ума не довел).
Короче - не смог. Наверно тут че-то с массивами надо.
 
Последнее редактирование модератором:

Ugar

Гуру форума
Пытался, пытался. Но ничего толкогого не вышло.
А пытался сделать через обычный цикл перебора баров.
Пытайтесь дальше. Если долго мучиться, обязательно получится. Небольшая подсказка, может быть проще использовать 2 цикла.
 

gravity

Местный знаток
Не получается, товарищи. И даже это подсмотрел в интернете.
C++:
#property strict

//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+

//input int       N = 6;    // Количество свечей в серии

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

void OnStart()
// Следующая задача.
// Напишите скрипт подсчитывающий количество непрерывных серий из свеч –
// закрытых выше открытия (серия вверх), а также закрытых ниже открытия (серия вниз).
// В скрипт задается параметр – количество свеч в серии.
// Пример – задано во входных параметрах 6 свеч, скрипт должен вывести количество
// непрерывных серий из 6 свеч в одну сторону идущих подряд, отдельное значение для серий вверх и вниз.
// Подсчет ведется на всю глубину графика. Скрипт должен вывести количество таких непрерывных серий.

{
int i,down=0,up=0;

   for(i=Bars-1; i>0; i--)             // перебираем все бары в истории
   {
      if(Close[i]  >Open[i]   &&
         Close[i-1]>Open[i-1] &&
         Close[i-2]>Open[i-2] &&
         Close[i-3]>Open[i-3] &&
         Close[i-4]>Open[i-4]) //
      {
         up++;
      }
      
      if(Close[i]  <Open[i]   &&
         Close[i-1]<Open[i-1] &&
         Close[i-2]<Open[i-2] &&
         Close[i-3]<Open[i-3] &&
         Close[i-4]<Open[i-4]) //
      {
         down++;
      }

   }
         Print(up," серий  - ",/*N,*/"подряд 5 свечей вверх");  //при соблюдении условия выводим Up
         Print(down," серий  - ",/*N,*/"подряд 5 свечей вниз");  //при соблюдении условия выводим Down



}
//+------------------------------------------------------------------+
Не могу понять, как вообще узнать что бары идут подряд. Думал, что типа сохраняем текущий бар и отнимаем от него бар последующий, и если разница ==1,то бары идут подряд.
Но как это реализовать?
 
Последнее редактирование:
Верх