Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@diodio а почему бай сетку не в цикле закрываете? ордер-же не один.

Хотел помочь с алгоритмом, но пока не могу - сама идея не ясна. Если просадка по бай небольшая она всегда меньше закрытых (за какой период?) селл, НО зачем закрывать сетку с малой просадкой? если просадка большая, то и сравнивать с закрытыми селл ордерами зачем? - Вы же депозит спасаете, какая разница был ранее профит или нет? или депозит-неудачник в продажах подлежит сливу? )))

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
22 часа назад, 0ll сказал:

@diodio а почему бай сетку не в цикле закрываете? ордер-же не один.

Хотел помочь с алгоритмом, но пока не могу - сама идея не ясна. Если просадка по бай небольшая она всегда меньше закрытых (за какой период?) селл, НО зачем закрывать сетку с малой просадкой? если просадка большая, то и сравнивать с закрытыми селл ордерами зачем? - Вы же депозит спасаете, какая разница был ранее профит или нет? или депозит-неудачник в продажах подлежит сливу? )))

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@diodio давай реально посмотрим: сетка бай растёт с увеличением лота, сетки селл короткие 1-2 ордера - лот практически начальный. Следовательно прибыль селл сеток в сумме будет не больше чем просадка 1-го и максимум 2-го ордера бай сетки. Далее: закрыли 1 ордер бай сетки за счёт почти всей прибыли селл сеток, нужно уменьшить сумму прибыли и смотреть возможность закрытия 2 ордера. Далее прибыли не хватило (кончилась), что делать? стоило-ли огород городить?

Есть другой алгоритм: периодически суммируются PL всех ордеров (открытых и закрытых) с момента старта зависшей сетки сетки. Сначала 1 ордер закрывают за счёт прибыли встречных сеток, затем на откатах выходят в прибыль старшие ордера и за счёт этой прибыли закрываются другие ордера зависшей сетки, начиная с младших. Затем цена опять идёт против зависшей сетки и нужно открывать только-что закрытое колено только уже пересчитанной лотностью.

Короче: всё это "суета и томленье духа", Старик показал, что любое частичное закрытие ордеров сетки - ненужная Ненормативная лексика, нужно точнее просчитать саму сетку и включать проскальзывание открытия колен от рыночных условий.

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 09.10.2019 в 22:05, 0ll сказал:

давай реально посмотрим: сетка бай растёт с увеличением лота,

лот стабилен и не увеличивается что на бай и что на селл

 

В 09.10.2019 в 22:05, 0ll сказал:

Далее: закрыли 1 ордер бай сетки за счёт почти всей прибыли селл сеток,

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @diodio в блоке где ты подсчитываешь профит закрытых ордеров на продажу есть строка "cSellProfitClose[i - 1] = OrderProfit();". Это не правильное выражение "i - 1". При первом цикле "i" будет равно "0", и получается что будем обращаться в первом цикле к "-1" элементу массива, так как "0 - 1 = -1". Такого нет. Полюбасу когда кидаешь этот советник на график у тя лог кричит "Алё, у тя не правильное обращение к массиву". И там к стати говоря, лог говорит нам в каком месте ошибка, прям тычет пальцем. Вывод, нужно смотреть логи.
  • Такая же байда и здесь "cBuyProfitOpen[i - 1] = OrderProfit() + OrderCommission() + OrderSwap();"

 

14 часов назад, diodio сказал:

Все настолько просто я написал и это я думаю должно работать, тестер ошибок не выдал, журнал единственное написал что массив вне диапазона (array out of range), ну вообщем сижу 2 недели непонимая где ошибка.

  • fcplm Ну ты!... fcplm ВООБЩЕ!... fcplm Почему это критичная ошибка! И действительно, все настолько просто. Вот представь инкассацию банка, положим ее в массив "inkassacija[]", едет три машины. Посчитали профит первой машины и надо куда то это положить. В первом цикле, так получается что обращаемся к элементу -1 в массиве, потому что 0 - 1 = -1, но такого нет. Счетные машинки не виноваты что они такие, они всего лишь строго выполняют алгоритм. Поэтому первая машина идет ... ! С второй машиной все совсем другое дело, второй цикл и обращение идет элементу 0, так как 1 - 1 = 0. Подсчитали и третью машину 2 -1 = 1. Теперь два банка сверяют приход расход,  тут выясняется ... !
  • Аналогично "cSellProfitClose[b-1]=+SellProfitClose; //суммируем профит" на первом цикле обращение к -1 элементу.
  • Здесь те же ..., только в профиль. "cBuyProfitOpen[t-1]=+BuyProfitOpen; // так-же суммируем профит" на последней итерации обращение в пустоту.

Вывод:

  • смотреть логи!
  • в личке и на форме код разный, выложи актуальный.
  • Мания величия магии выражения "-1" переоценена.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Вах, вот это я дал :)), вообще грубая ошибка!!! При первой же итерации идет подстановка нуля, как я это пропустил не понимаю, машинально наверное, конечно там ничего считаться не будет. Так же и при переборе того же массива cSellProfitClose[b-1]=+SellProfitClose, думалось что сначала должен быть ноль а не еденица. Все верно MikR0ReR, спасибо. Выкладываю последнюю версию кода если кому надо: 

Спойлер

{
                  //закрытие покупок
                  OrderProfitSellClose(cSellProfitClose);// Профит уже закрытых ордеров на продажу
                  for(int b=0; b < ArraySize(cSellProfitClose); b++)
                    {
                     cSellProfitClose=+SellProfitClose;
                    }

                  OrderProfitBuy(cBuyProfitOpen);        // Профит еще не закрытых ордеров на покупку 
                  for(int t=ArraySize(cBuyProfitOpen)-1; t>=0; t--)
                    {
                     cBuyProfitOpen[t]=+BuyProfitOpen;
                     if(MathAbs(BuyProfitOpen) <= SellProfitClose)
                       {
                        if(OrderType() == OP_BUY) bool close_profit_buy = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
                       }
                    }
                 }

 

//+---------------------Профит уже закрытых ордеров на продажу----------------------+
void OrderProfitSellClose(double &cSellProfitClose[])
  {
   int counter=0,size=OrdersHistoryTotal();
   ArrayResize(cSellProfitClose,size);
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()==OP_SELL)
           {
            cSellProfitClose=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cSellProfitClose,counter);
   return;
  }

 

//+---------------------Профит еще не закрытых ордеров на покупку----------------------+
void OrderProfitBuy(double &cBuyProfitOpen[])
  {
   int counter=0,size=OrdersTotal();
   ArrayResize(cBuyProfitOpen,size);
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==OP_BUY)
           {
            cBuyProfitOpen=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cBuyProfitOpen,counter);
   return;
  }

Теперь работает, не все условия по закрытию проверял, но хотя бы уже закрывает.

Изменено пользователем diodio
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день!

Речь про статью на блоге Павла "MQL4: Пишем советник по индикатору открытых позиций трейдеров"

http://tlap.com/mql4-ea-po-indiky-otkryt-pozitsij/

Автор: Silentspec  Но почему то ему в личку писать нельзя ) А ссылка на обсуждение темы ведет в эту ветку форума...

Есть 2 вопроса (вопросы как бы к Silentspec, но если кто то за него в курсе, и он не может или не хочет отвечать, то просьба ответить):

1. Есть ли файлик с приличным накоплением данных. Для анализа так сказать...

3. В статье про написание GimmeYaMoneyMan сделки проводяться не против, а ПО данным толпы. Это задумка такая? ;) или так получилось? :)

Мне кажется тема перспективная для изучения... Но поскольку стандартно на истории не проверишь... то надо придумать приблуду и наложить данные за период на график, для наглядности.

Eсли нет в планах, чего то подобного - отметки на графике участков, где  например > 80%, сам наверное смогу накрапать... а вот данные за приличный период долго копить... Так что если вдруг пишется в файлик фоном... а ты в статье писал: "начну собирать статистику для того, чтобы позже продолжить анализ" был бы рад если презентуешь )) Формат txt как пишет GimmeYaMoneyMan вполне устроит.

Извини если чего лишнего попросил, что дорого как память... ))

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @molot_1 если выбрали OP_SELLSTOP приказ то цена должна быть ниже текущей текущей. А у вас по Ask+Distance*Point она выше.
  • цену price тоже нужно нормализовать "NormalizeDouble()".

Вывод:

  • Проверьте ваши знания, что такое STOP и LIMIT ордера
  • по каким ценам открываются бай и сел ордера и закрываются тоже
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@molot_1 Но там и цену брали без обработок, напрямую bid ask. Вы к ней прибавляете профит. Можно конечно и без нормалайза, только где гарантии что такая цена понравится брокеру и не будет у вас ошибки? Вообщем смотрите логи терминала, они полезны при типичных, распространенных ошибках.

Изменено пользователем MikR0ReR
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 17.10.2019 в 19:44, MikR0ReR сказал:

Но там и цену брали без обработок, напрямую bid ask. Вы к ней прибавляете профит. Можно конечно и без нормалайза, только где гарантии что такая цена понравится брокеру и не будет у вас ошибки? Вообщем смотрите логи терминала, они полезны при типичных, распространенных ошибках.

 вопрос по индикаторам
BufferC инди рисует по ценам закрытия каждой свечи.как сделать 
считалку по BarLine1 = 3;(по BarLine1 по доступным барам )                                     {
     for (int i=0; i<=Bars; i++)//цикл по доступным барам от 0
    {
      BufferC= Close;   //extern int BarLine1 = 3;
      BufferOC=NormalizeDouble (((Open+ Close)/2),5) ;//NormalizeDouble(((Open+ Close)/2
    }
   return(rates_total);
  }//OnCalculate

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Александр 1939

input int BarLine1 = 3;//сколько баров принимают в расчете индикатора

double BufferC[],//буфер индикатора
       summ;//сумма цен по рассчитываемым барам
int bar;//сколько баров рассчитывать для отрисовки индикатора

//считаем сколько баров нужно обработать
//если кол-во всех баров совпадает с обработанными, пересчитываем только текущий бар
   if(prev_calculated == rates_total)
      bar = 0;
   else
      //если кол-во обработанных баров больше 0 и не равно общему кол-во баров, пересчитываем все не отрисовываем бары
      if(prev_calculated != rates_total && prev_calculated > 0)
         bar = prev_calculated;
      else
         //если кол-во обработанных баров равно 0, это первый запуск и нам надо пересчитать все бары
         //и корректируем с учетом BarLine1 и то, что нумерация начинается с 0, для того чтобы не выйти за рамки массива
         if(prev_calculated == 0)
            bar = rates_total - 1 - BarLine1;
//считаем среднюю для каждого бара
   for(int i = bar; i >= 0; i--)
     {
      summ = 0;
      //суммируем цены за нужное кол-во баров
      for(int q = i; i + BarLine1 < q; q++)
        {
        //то самое суммирование цен за нужное кол-во баров
         summ += Close[q];
        }
      //считаем среднюю и передаем ее индикатору, т.е в массив индикатора
      BufferC[i] = summ / BarLine1;
     }

 

Изменено пользователем MikR0ReR
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо!Но не получается график остаётся чистым.Загрузил инди посмотрите может получится.Спасибо 

ItestOC.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Александр 1939 Вот то что у Вас не получилось, вот этот код мне нужен. Увидеть как Вы старались.

Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет. Ребята, подскажите. Знаю, как сделать, чтоб сова начинала и заканчивала работу в определенные часы

 if(TimeHour(TimeCurrent())>=HourStart  && TimeHour(TimeCurrent())<= HourStop )

А вот как сделать, чтоб еще и в определенные минуты? Начало в 0.30 и конец в 23.30. 

Изменено пользователем batmanuyga
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
14 часов назад, MikR0ReR сказал:

TimeMinute()

Спасибо, очень исчерпывающе...

Это я первым делом и хотел написать :

 if(TimeHour(TimeCurrent())>=HourStart && TimeMinute(TimeCurrent() )>=MinuteStart  && TimeHour(TimeCurrent())<= HourStop && TimeMinute(TimeCurrent() )<=MinuteStop)

Ерунда тогда какая то получается. Он тогда каждый час только после 30 минуты начнет работать.

Изменено пользователем batmanuyga
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, batmanuyga сказал:

Спасибо, очень исчерпывающе...

Ок, можно так:

double tTime = TimeHour(TimeCurrent()) + TimeMinute(TimeCurrent() ) / 100;  // получится текущее время = 23 + 0.30 = 23.30

теперь сравниваем с tTime > TimeStart && tTime < TimeEnd

Только TimeStart нужно задавать double, типа 0,30

Изменено пользователем 0ll
дописал
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@batmanuyga Я вас понял! Разбираем!

  1. Точнее, по просчетам в моей голове, если поставить одинаковые минуты то вообще не будет работать. Допустим торгуем с 12.30 до 18.30, что поучится.
  • рассмотрим время 13.20

13 часов больше или ровно 12 часам разрешенного торгового времени? Да!

20 минут больше или ровно 30 минутам разрешенного торгового времени? Нет!

13 часов меньше или ровно 18 часам разрешенного торгового времени? Да!

20 минут меньше или ровно 30 минутам разрешенного торгового времени? Да!

  • рассмотрим время 13.40

13 часов больше или ровно 12 часам разрешенного торгового времени? Да!

40 минут больше или ровно 30 минутам разрешенного торгового времени? Да!

13 часов меньше или ровно 18 часам разрешенного торгового времени? Да!

40 минут меньше или ровно 30 минутам разрешенного торгового времени? Нет!

 

По расчетам мы видим что оба условия не выполняются. Торговли не будет.

Поправка в моих расчетах составляет лишь тот факт что будет торговля всего 1 минуту, это в 30 минут каждого часа. При условиях, что в выражении будет стоять знак равно (=) например (>=) или (<=) и одинаковые минуты.

  1. Теперь, если поставить разные минуты, то выпадет торговля за их пределами. Допустим торгуем с 12.15 до 18.45, что поучится.
  • рассмотрим время 13.10

13 часов больше или ровно 12 часам разрешенного торгового времени? Да!

10 минут больше или ровно 15 минутам разрешенного торгового времени? Нет!

13 часов меньше или ровно 18 часам разрешенного торгового времени? Да!

10 минут меньше или ровно 45 минутам разрешенного торгового времени? Да!

  • рассмотрим время 13.50

13 часов больше или ровно 12 часам разрешенного торгового времени? Да!

50 минут больше или ровно 15 минутам разрешенного торгового времени? Да!

13 часов меньше или ровно 18 часам разрешенного торгового времени? Да!

50 минут меньше или ровно 45 минутам разрешенного торгового времени? Нет!

 

По расчетам мы видим что оба условия не выполняются. Торговля будет только с 15 до 45 минут каждого часа. С 45 до 15 нет торговли.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Ок, можно так:

double tTime = TimeHour(TimeCurrent()) + TimeMinute(TimeCurrent() ) / 100;  // получится текущее время = 23 + 0.30 = 23.30

 

Гениально ! Спасибо.. Вот ведь, и так и этак пробовал, всю голову изломал.

Изменено пользователем batmanuyga
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

При тестировании возникает ошибка 4108.

Вопросы:

1. Как вылечить эту ошибку?

2. Насколько она критична?

3. Может ли быть так, что она есть в тестере, а в торговле ее не будет?

 

Спасибо за ответы.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Владимир Стариков сказал:

При тестировании возникает ошибка 4108.

Ошибка 4108 - неверный номер тикета. т.е. Вы пытаетесь что-то сделать с ордером при этом указываете другой тикет - наверное...

Я-б сказал, что очень критическая ошибка...

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...