Ошибки, баги, вопросы - страница 3306

 

Здравствуйте .Подскажите пожайлуйста,почему не работает часть кода скрипта.Скрипт брал с этого портала.

if (!OrderMagicNumber() != Magic ) Ведь условия выполнены,а он перестает вообще закрывать все ордера.

Задача чтоб он не трогал советник с  MagicNumber,а все остальные ордера он закрывал,не зависимо как и кем они были открыты.

#property link     

#include <stdlib.mqh>

double Price[2];
int    giSlippage;
bool   CloseOrdersWithMinusProfit = true;

void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOrdersWithMinusProfit) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderProfit() <= 0))

{

         if (!OrderMagicNumber() != Magic )

{
        if((OrderType()<=OP_SELL) && GetMarketInfo())

{
          if(!OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
         }
       }
     }
   }
 }

}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
 
Evgenii70rus #:

Здравствуйте .Подскажите пожайлуйста,почему не работает часть кода скрипта.Скрипт брал с этого портала.

if (!OrderMagicNumber() != Magic ) Ведь условия выполнены,а он перестает вообще закрывать все ордера.



1. обратите внимание на предупреждения компилятора. 

2. уберите одно лишнее отрицание. Что вы хотели сказать этим условием ? видимо "если MagicNumber ордера не равен константе Magic, то {....} "  вот так и напишите

 
Maxim Kuznetsov #:

1. обратите внимание на предупреждения компилятора. 

2. уберите одно лишнее отрицание. Что вы хотели сказать этим условием ? видимо "если MagicNumber ордера не равен константе Magic, то {....} "  вот так и напишитеВ 

В том то и дело что компилятор не выдает ошибок,ни предупреждений, пробовал по разному.Просто перестает работать скрипт.!.....==,......!=,!.......!= и так и так и местами менял.А когда убираю эту часть кода то все работает.

 

Для чего нужен модификатор final?

Его можно использовать только для виртуальных методов. Но если я не хочу, что бы метод был переопределен, то я объявлю ее без virtual (и без final). В чем смысл virtual + final?

 
Vladislav Boyko #:

Для чего нужен модификатор final?

Его можно использовать только для виртуальных методов. Но если я не хочу, что бы метод был переопределен, то я объявлю ее без virtual (и без final). В чем смысл virtual + final?

Что будете делать, если ваш класс был порождён от класса, в котором функция, которую больше не должны переопределять, была объявлена виртуальной

 
Ilyas #:

Что будете делать, если ваш класс был порождён от класса, в котором функция, которую больше не должны переопределять, была объявлена виртуальной

Да, до меня как раз дошло, что отсутствие virtual не отменяет виртуальность:

class CParrent
  {
public:
   virtual string method(void) { return("parrent"); }
  };

class CChild : public CParrent
  {
public:
   string method(void) override { return("child"); }
  };

class CGrandson : public CChild
  {
public:
   string method(void) override { return("grandson"); }
  };

Спасибо большое. Простите за глупые вопросы - я только учусь этому.

 

Сделайте пожалуйста еще небольшую подсказку:

Является ли корректной конструкция "override final"?

class CParrent
  {
public:
   virtual string method(void) { return("parrent"); }
  };

class CChild : public CParrent
  {
public:
   string method(void) override final { return("child"); }
  };

Судя по реакциям компилятора, оба ключевых слова работают. Но смущает, что никто это не использует:


 

Доброго времени суток.

Сегодня ставил разного рода эксперименты, обнаружил такой баг(?)

Согласно документации к SymbolInfoDouble : https://www.mql5.com/en/docs/constants/environment_state/marketinfoconstants


ENUM с названием SYMBOL_PRICE_VOLATILITY должен что-то вернуть.

double percent_change = SymbolInfoDouble(symbol_name,SYMBOL_PRICE_VOLATILITY);

Но в переменной оказывается 0. Далее пруф.



Спасибо за внимание, всем всего хорошего.

Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Symbol Properties
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Symbol Properties
  • www.mql5.com
Symbol Properties - Environment State - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Vladislav Boyko #:

Сделайте пожалуйста еще небольшую подсказку:

Является ли корректной конструкция "override final"?

Судя по реакциям компилятора, оба ключевых слова работают. Но смущает, что никто это не использует:

Отвечаю сам себе (как я это понял), раз уж спросил.

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

А override final - когда можно наследоваться от класса дальше, но нельзя переопределять конкретный метод - такая необходимость возникает, мягко говоря, не часто.


P.S. Возможно стоит перенести 5 постов, связанных с моими вопросами по final в более подходящую ветку типа "вопросы от начинающих". Если модераторы сочтут уместным, то я только за.

 

А разве функции экономического календаря на тестере не работают ?

Результат запуска примера из справочника.


2023.03.31 10:16:28.544 Core 1 EURUSD,H1: testing of Experts\CALENDAR.ex5 from 2023.01.01 00:00 to 2023.03.31 00:00 started

2023.03.31 10:16:28.544 Core 1 2023.01.01 00:00:00   ==================================================

2023.03.31 10:16:28.544 Core 1 2023.01.01 00:00:00   Не удалось получить события для кода страны US, ошибка 4014 

ERR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова


2023.03.31 10:16:28.544 Core 1 EURUSD,H1: 4680738 ticks, 1512 bars generated. Test passed in 0:00:00.526.

2023.03.31 10:16:28.544 Core 1 318 Mb memory used including 0.47 Mb of history data, 128 Mb of tick data

2023.03.31 10:16:28.544 Core 1 log file "C:\Users\User\AppData\Roaming\MetaQuotes\Tester\CF55F1108BF762299BD3BCB2BFB06D82\Agent-127.0.0.1-3000\logs\20230331.log" written

2023.03.31 10:16:28.549 Core 1 connection closed