Ваши вопросы по языку MQL4

4budab1

Новичок форума
Подскажите как элементарную вещь сделать, сейчас такой код

Код:
int isOrderInProfit()
{
      int OrderInProfit=0;
      {
         OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
         if (OrderProfit()>ProfitForOpenAnother)
         {OrderInProfit=1;}
      } 
   return OrderInProfit;
}

Нужно найти последнюю

открытую позицию в ЛОНГ
и проверить является ли последняя открытая позиция профитной на данный момент

открытую позицию в ШОРТ
и проверить является ли последняя открытая позиция профитной на данный момент
 

guide

Новичок форума
В чем ошибка в этой функции?
 

Вложения

  • guide.mq4
    12,7 КБ · Просмотры: 18

AlexeNP

Гуру форума
Но он не появляется и пишет мне
ну, ошибки в этом индикаторе начинаются с самого начала... к примеру, в свойствах определяется 6 индикаторных буферов
#property indicator_buffers 6
а в функции init сделана не самая удачная попытка сделать 5 буферов
IndicatorBuffeintrs(5);
 

guide

Новичок форума
ну, ошибки в этом индикаторе начинаются с самого начала... к примеру, в свойствах определяется 6 индикаторных буферов
#property indicator_buffers 6
а в функции init сделана не самая удачная попытка сделать 5 буферов
IndicatorBuffeintrs(5);
Я думаю, что это работает на пятизначной платформе

WhatsApp Image 2020-05-30 at 09.42.48.jpeg
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
ну, ошибки в этом индикаторе начинаются с самого начала... к примеру, в свойствах определяется 6 индикаторных буферов
#property indicator_buffers 6
а в функции init сделана не самая удачная попытка сделать 5 буферов
IndicatorBuffeintrs(5);
А вот это, выделенное, что такое?
 

AlexeNP

Гуру форума
Подскажите как элементарную вещь сделать, сейчас такой код

Код:
int isOrderInProfit()
{
      int OrderInProfit=0;
      {
         OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
         if (OrderProfit()>ProfitForOpenAnother)
         {OrderInProfit=1;}
      }
   return OrderInProfit;
}

Нужно найти последнюю

открытую позицию в ЛОНГ
и проверить является ли последняя открытая позиция профитной на данный момент

открытую позицию в ШОРТ
и проверить является ли последняя открытая позиция профитной на данный момент
ну как-то так наверное
Код:
datetime time_buy=0,time_sell=0;
double profit_buy=0,profit_sell=0;
for(int i=OrdersTotal()-1; i>=0; i--)
  {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
      datetime time_order=OrderOpenTime();
      double profit_order=OrderProfit()-OrderCommission()+OrderSwap();
      if(OrderType()==OP_BUY && time_buy<time_order)
        {
         time_buy=time_order;
         profit_buy=profit_order;
        }
      if(OrderType()==OP_SELL && time_sell<time_order)
        {
         time_sell=time_order;
         profit_sell=profit_order;
        }
     }
  }
 

AlexeNP

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

ivansss

Новичок форума
Добрый день подскажите, как решить проблему:

При оптимизации выскакивает ошибка:

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) tested with error "critical runtime error 503 in OnTick function (zero divide, module Experts\e1.ex5, file e1.mq5, line 826, col 73)" in 0:00:00.153
double Mix1 = NormalizeDouble((MathAbs(ZExtLevel[0] - ZExtLevel[1])), 2);
double Mix2 = NormalizeDouble((MathAbs(ZExtLevel[1] - ZExtLevel[2])), 2);
double Mix = NormalizeDouble((Mix1/Mix2),2);
Что делал:
1) умножал Mix1 и Mix2, чтобы уменьшить кол-во знаков после запятой;
2) менял кол-во знаков при нормализации;
3) Все ZExtLevel проверял, чтобы в них не было 0.

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

AlexeNP

Гуру форума
Добрый день подскажите, как решить проблему:

При оптимизации выскакивает ошибка:

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) tested with error "critical runtime error 503 in OnTick function (zero divide, module Experts\e1.ex5, file e1.mq5, line 826, col 73)" in 0:00:00.153
double Mix1 = NormalizeDouble((MathAbs(ZExtLevel[0] - ZExtLevel[1])), 2);
double Mix2 = NormalizeDouble((MathAbs(ZExtLevel[1] - ZExtLevel[2])), 2);
double Mix = NormalizeDouble((Mix1/Mix2),2);
Что делал:
1) умножал Mix1 и Mix2, чтобы уменьшить кол-во знаков после запятой;
2) менял кол-во знаков при нормализации;
3) Все ZExtLevel проверял, чтобы в них не было 0.
ну, общее правило - округления проводить только ПОСЛЕ окончания всех расчетов...
и это правило в данном случае могло сыграть роль... пример до нормализации Mix2 = 0.003, после нормализации он становится равным 0...
то есть, делаем примерно так:
double Mix;
if(ZExtLevel[1] != ZExtLevel[2])
{
Mix = NormalizeDouble(MathAbs((ZExtLevel[0] - ZExtLevel[1])/(ZExtLevel[1] - ZExtLevel[2])),2);
}
 

ivansss

Новичок форума
ну, общее правило - округления проводить только ПОСЛЕ окончания всех расчетов...
Да, заработало. Огромное спасибо, а то уже голову сломал.

Возник еще один вопрос:
if (OpenTradeCount_buy() == false ||
MaxSpreadFilter() == true ||
MaxPotentiondrive() == true ||
isTradeTimeInt(Hour_open,Minute_open,Hour_close,Minute_close) == false){return;}

В таких конструкциях return сработает после проверки всех функций или после нахождения 1 несоответствия. Интерес с точки оптимизации скорости работы.
 

AlexeNP

Гуру форума
Да, заработало. Огромное спасибо, а то уже голову сломал.

Возник еще один вопрос:
if (OpenTradeCount_buy() == false ||
MaxSpreadFilter() == true ||
MaxPotentiondrive() == true ||
isTradeTimeInt(Hour_open,Minute_open,Hour_close,Minute_close) == false){return;}

В таких конструкциях return сработает после проверки всех функций или после нахождения 1 несоответствия. Интерес с точки оптимизации скорости работы.
вычисления логических условий происходит по короткому сценарию...
к примеру A && B - если A == false, то В уже не проверяется (все равно ответ уже известен)
или возьмем A || B если A == true, то В также не проверяется
поэтому при логическом И вперед ставим самое маловероятное условие, а при ИЛИ вперед - самое вероятное
 
Верх