Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 196

 
Alexey Viktorov:

Ну что-ж, попробую ещё вставить свою лепту в твоё образование.

На вы буду обращаться когда буду посылать. У меня есть снимок указателя...

Скажи пожалуйста, не кажется-ли неправильным вызывать одну функцию 5 раз на одном тике? Но это ещё пол-беды. Эта функция перебирает все ордера. И всё это 5 раз за один тик... А таких функций, я насчитал 4. Это не напрягая мозги как-бы в один цикл пристроить ещё 3 функции с циклом перебора всех ордеров.

Вот две из них.

Это

на трейлинг не похоже даже близко.

Чтобы это понять надо чётко понять определение что такое трейлинг. Дословно не помню, а примерно так "Перемещение уровня StopLoss вслед за ценой с целью уменьшения возможного убытка, или увеличения "гарантированной" прибыли."

А вот это

как выглядит при запуске советника? Наверное четыре строки... они нужны?

И последнее на сегодня: Библиотеку в голове иметь не надо. Достаточно иметь документацию и уметь ей пользоваться. Я до сих пор не могу на память записать все параметры iMA(_Symbol, _Period, ,,,,,) и дальше пишу только посмотрев документацию. И так почти все функции. Но к счастью не так давно сделали всплывающие подсказки которые не сильно спасают. Я не пытаюсь запомнить как пишутся те или иные энумы. Так-что в документацию приходится лезть каждый раз.


Алексей, спасибо за информацию. Да, я признаю что код не оптимальный, просто я не программист и не знаю ещё тонкостей о которых вы рассказали. Мне такие ньюансы просто непонятны - непонятно как это всё оптимизировать - может когда -то попозже допетрю, если дальше продвигаться буду. Сейчас точно знаю что если начну оптимизировать, то только сломаю всё. Ну вот такие издержки для МТ4 для от кодеров-новичков, хотя я видел тут на сайте коды других советников - там вообще столько всего! - хотя конечно если профи кодил может его код меньше загружает терминал чем мой, да наверняка, но пока не могу ваши замечания учесть ибо решительно не понимаю этих тонкостей оптимизации программирования. А если убрать часть обращений в коде к функциям - там наверняка у советника хаос начнётся и начнёт открывать ордера когда не надо. Я же там кодил, тестировал - ничего не шло или шло но не так, исправлял, в итоге оконечный код вот таким получился, мне уже не до оптимизации было как вы понимаете с моим то багажом знаний.

Про трейлинг - самое главное что профиты трейлит, на данном этапе развития меня это устраивает))) И ведь старый и новый код трейлинга трейлят одинаково и количество сделок одинаковое  -  естественно я сделал вывод что трейлинг получился, а как его правильно делать в том окружении в котором трейлинг должен работать всё равно никто не говорит, а у меня мыслей тоже нет на этот счёт - весь мой код это конструктор ЛЕГО - то есть я скомпонавал его из материалов видеоуроков. Ну конечно есть немного  моего - это собственно сам алгоритм советника, а весь код и функции это не моё изобретение, а из видеоуроков с TradeLikeaPro, причём я код "редактировал" именно по аналогии и под свои нужды - под свой алгоритм. В итоге получилось что получилось.

 
geratdc:  весь мой код это конструктор ЛЕГО - то есть я скомпонавал его из материалов видеоуроков с TradeLikeaPro, причём я код "редактировал" именно по аналогии и под свои нужды - под свой алгоритм. В итоге получилось что получилось. 

Посмотрел на график депозита - заинтересовался и скачал первый вариант. Скопировал в MetaEdit. Два предупреждения. Первое устранил заменой  int timeprev=0;  на  datetime timeprev=0; Ведь в этой переменной дата. Второе указывает на

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

Удалил последние три строки. Транслируется чисто. Пошли далее...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

переделал (для пояснения прикрепил скрипт - запустите, он объяснит) так

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
     Вот результат


Эту функцию удалил - вызовы ее отсутствуют да и тело ее пустое

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Попытался запустить и увидел:

     Было

за счет внесения изменений  - ну просто комментарии добавил и удалил extern у Magic - меняем его лишь при запуске советника на двух графиках с одним и тем же инструментом  и Slippage - этот параметр менять зачем? Потом подумал, и увеличил параметры в 10 раз. А функцию OnInit удалил. Ведь пользуюсь лишь пятизнаком. Почему? да на четырехзнаке спред 3 пункта, это получается 30. А на пятизнаке всего 12

     так стало понятнее

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 50;    // Ограничение прибыли Take Profit
extern int     Step           = 20;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 30;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

Урезал вверху шапку. Вот что оставил:

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

вот эту строчку

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

перенес пониже к месту востребования. Получилось так

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Потом выбросил в самом начале описание переменной op и заменил вот так

   if (CalculateProfit()>=tp) CloseAll();

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

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

Далее вычисляется МА. Тут надо изучить подробнее. Для этого составил скрипт и вывел результат

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Видно, что четвертый параметр MaShift  и  последний параметры суммируются, т.е. номер бара = их сумме. Берется МА от бара 2, третьего от конца.

Буду смотреть дальше. Интересует?

 
STARIJ:
...

Буду смотреть дальше. Интересует?

Вы тему постоянно поднимаете?

Хватит уже - люди следят за темой кому интересно, а её поднимают впустую.

Если хотите, чтобы вам человек ответил, вызовите его в тему. Вот так: @STARIJ. Но тему не нужно постоянно поднимать редактированием своего последнего поста.


 
Victor Nikolaev:

Значит кому-то не повезло. Еще раз. Это скрипт, а не советник или индикатор

 Разобрался - видимо терминалу не хватало памяти - закрыл пару чартов и заработало.

Спасибо - действительно, вычисления происходят.

А если переменные не int типа, а bool , то как быть?

 

Здравствуйте, подскажите пожалуйста:

1 - регистрация производится только как физ лицу или можно как юр лицо тоже и есть ли какие-то ограничения и условия

2 - есть ли какая-то синхронизация с соц сетями, чтобы иметь один аккаунт (логин и пароль)

3 - ещё увидел функцию "поставь виджет на свою страницу, поделись сигналом" - речь идёт о сайте или о чём-то другом


 
 Здравствуйте. Mql4 начал изучать совсем недавно. Если я обратился не туда с вопросом, то направьте пожалуйста в нужную тему. А вопрос такой, подскажите как работать с индикаторами, которые строят различные зоны, прямоугольники и т.д. С iCustom немного знаком могу запрограммировать пересечение линий или цена выше ниже, допустим МА ) Индикатор я внизу прикрепил, буфера всего четыре, а разновидностей зон восемь. И вот я собственно вообще не могу сообразить, как вообще закодить, отбой или пробой этих зон. 
Файлы:
 
STARIJ:

Посмотрел на график депозита - заинтересовался и скачал первый вариант. Скопировал в MetaEdit. Два предупреждения. Первое устранил заменой  int timeprev=0;  на  datetime timeprev=0; Ведь в этой переменной дата. Второе указывает на

*

Ответ

Возможно это связано с тем что в видеоуроке тейкпрофит был типа int а я его переиначил в double поэтому прежнее написание кода int timeprev осталось как есть. Хорошо, это я исправлю,  а вообще как это влияет на работу советника? На самом деле эти бары и время актуальны были для функции TrailingStop из видеоурока, но поскольку я эту функцию заменил своей - это просто осталось как реликт исходного кода и в действительности на время бара трейлинг мой не опирается.


Удалил последние три строки. Транслируется чисто. Пошли далее...

переделал (для пояснения прикрепил скрипт - запустите, он объяснит) так

Вот результат

*Ответ

А куда же там делся вот этот кусочек кода?

   return(INIT_SUCCEEDED);
  }

Может вот так всё-таки должно быть?


void OnInit()

{

   if(Digits == 3 || Digits == 5)

   {

      Step           *= 10;

      TrailingStep   *= 10;

      TrailingStop   *= 10;

      Slippage       *= 10;

   }

   return(INIT_SUCCEEDED);

  }

Только почему вы TakeProfit сделали типом int  это значит профит будет в пунктах, а функция CalculateProfit() типа double, поэтому я и TakeProfit таким же типом сделал чтобы они согласованы были.


Эту функцию удалил - вызовы ее отсутствуют да и тело ее пустое

*

Ответ

Там в коде есть такая функция void CloseAll() Я думал что она связана как-то с этой функцией

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Ответ

Ну хорошо, удалим.


Попытался запустить и увидел:

     Было

за счет внесения изменений  - ну просто комментарии добавил и удалил extern у Magic

*

Ответ 

Да, может extern лишнее так как я его вообще никогда не изменял как и Slippage  - это всё с исходного кода видеоурока было

- меняем его лишь при запуске советника на двух графиках с одним и тем же инструментом  и Slippage - этот параметр менять зачем? Потом подумал, и увеличил параметры в 10 раз. А функцию OnInit удалил. Ведь пользуюсь лишь пятизнаком. Почему? да на четырехзнаке спред 3 пункта, это получается 30. А на пятизнаке всего 12

*

Ответ

Так по умолчанию считалось что советник на всех валютах чтобы работал. Я Oninit () оставлю у себя.

     так стало понятнее

Урезал вверху шапку. Вот что оставил:

*

Ответ

Эта шапка редактором по умолчанию сделана. У себя её оставлю как было, а то вдруг там что-нибудь не проскочит у брокера или в терминале из-за отсутствия этих строчек.

вот эту строчку

перенес пониже к месту востребования. Получилось так

Потом выбросил в самом начале описание переменной op и заменил вот так

*

Ответ

Впринципе логично.



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

Далее вычисляется МА. Тут надо изучить подробнее. Для этого составил скрипт и вывел результат


Видно, что четвертый параметр MaShift  и  последний параметры суммируются, т.е. номер бара = их сумме. Берется МА от бара 2, третьего от конца.

*

Ответ

В связи с тем что у меня трейлинг изменён -  дататайм Moving Average думаю не актуальна. Это реликт исходного кода, я раньше пытался тралить по последнему из 3 (трёх) открытых ордеров. Дело в том что у меня советник открывает ордер, потом если рынок пошёл не в том направлении на величину STep - советник открывает контр ордер, затем если рынок продолжает идти в контр направлении добавляется третий ордер с типом ордера второй позиции, или наоборот если цена вернула направление тогда третий ордер будет открыт с типом первого ордера (buy или sell) Там трейлинг идёт по трём ордерам, через функцию CalculateProfit() правда если первый ордер открылся успешно и цена движется как надо то в такой ситуации трейлить по бару через datetime было бы так как и делали на видеоуроке - у меня же повторю даже по 1 ордеру тралим по функции calculateprofit()

Буду смотреть дальше. Интересует?

*

Ответ

Да, вот у меня с тралом вопросы. Вроде тралит но что-то вникать неохота никому в то что я там накрутил с ним. Трал в отрыве от баров и datetime работает - это функций Trailing()

Там про период МА - вы его 200 указали, но суть в том что это настраиваемое значение у меня. И кажется упущен ключевой параметр Value - там смысл в описании файла README я разъяснял.



Спасибо что заморочились этим всем. Советник на самом деле так себе - механический я бы сказал. Но в принципе если настроить и контролировать изредка его работу может и вполне ничего. Время покажет. Наверное заработать он что-то может, но и сольётся глазом не моргнёт и даже смску не отправит - не стал я этим заморачиваться - хотя в идеи было смс отправка если просадка больше на 30% от депозита случилась - это значит что уже открыто 3 ордера и пошло контр движение рынка, в такой ситуации дело пахнет керосином. Все остальные советник разруливает, если он настроен на историю поведения графика инструмента торговли.


Я  внёс рекомендованные ( но не все) изменения в код пока в Блокноте. Посмотрите пожалуйста,  правильно я скорректировал код?

Я за оптимизацию, ну только моменты не учитывал когда вы oninit удалили - мне она нужна чтобы на всех валютах можно было тестить и работать))) 

Файлы:
 
Aleksandr Verkhozin:
 Здравствуйте. Mql4 начал изучать совсем недавно. Если я обратился не туда с вопросом, то направьте пожалуйста в нужную тему. А вопрос такой, подскажите как работать с индикаторами, которые строят различные зоны, прямоугольники и т.д. С iCustom немного знаком могу запрограммировать пересечение линий или цена выше ниже, допустим МА ) Индикатор я внизу прикрепил, буфера всего четыре, а разновидностей зон восемь. И вот я собственно вообще не могу сообразить, как вообще закодить, отбой или пробой этих зон. 

наберите в Яндексе скачать торрент видеоуроки программирование mql4 там на рутрекере уроки от TradeLikeApro. Без общих примеров программирования сложно понять что к чему - я как раз видеоуроки прошёл но как был балбесом так и остался в этом деле))) Может у вас прогресс будет.
 

geratdc:

...
Да, вот у меня с тралом вопросы. Вроде тралит но что-то вникать неохота никому в то что я там накрутил с ним.

...

Знаете, а ведь прямо в этой ветке я выкладывал шаблон для трала, который в своих расчётах использует переданное в него значение индикатора. Поищите, не ленитесь.
 
geratdc:

наберите в Яндексе скачать торрент видеоуроки программирование mql4 там на рутрекере уроки от TradeLikeApro. Без общих примеров программирования сложно понять что к чему - я как раз видеоуроки прошёл но как был балбесом так и остался в этом деле))) Может у вас прогресс будет.


 Посмотрел видео по работе с внешним индикатором, написал небольшой код посмотреть значения буферов в тестере:

void OnTick()

{

  double Buf1=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",0,1);

  double Buf2=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",1,1);

  double Buf3=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",2,1);

  double Buf4=iCustom(NULL,0,"Shved-Supply-and-Demand-e600",3,1);

  

  Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}  

Зоны в режиме визуализации появляются и исчезают. А значение буферов все равно, всегда ноль. Неужели никак нельзя формализовать эти зоны в коде? 

Может есть какая-то функция , кроме iCustom, которая подходит для таких индикаторов? Может кто-то сам писал сов с подобными индикаторами?

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