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

 
barabashkakvn:

Поиск обновлений срабатывает при подключению к серверу MetaQuotes-Demo. Это возможно в таких случаях:

  1. Переключение торгового счета с какого-то на торговый счет открытый на MetaQuotes-Demo;
  2. При перезагрузке терминала.
Спасибо.
 
joo:

:O

Нет. ошибка больше не появляется.

Шрёдингер ходил по комнате в поисках нагадившего котёнка, а тот сидел в коробке ни жив ни мертв. )))

 
tol64:

Шрёдингер ходил по комнате в поисках нагадившего котёнка, а тот сидел в коробке ни жив ни мертв. )))

Очень странно на самом деле. Что перестанет работать на следующий раз?
 
joo:
Очень странно на самом деле. Что перестанет работать на следующий раз?
Неизвестно. Придётся ставить проверку. )
 
joo:

Раставил принты - ошибка пропала...

Эфект наблюдателя в квантовой механике какой то..

Мы воспроизвели вашу ситуацию только когда подсунули NaN в выражение.
 
Renat:
Мы воспроизвели вашу ситуацию только когда подсунули NaN в выражение.

так fabs правильно работает или нет?

 
joo:

так fabs правильно работает или нет?

Правильно.
 

Добрый день! Прошу помощи в реализации простой, на мой взгляд, схемы.

Есть советник, который нормально работает на одном инструменте. Я хочу "допилить" его, чтоб он работал одновременно по нескльким инструментам. Для этого мне нужно правильно создать массив данных, к членам которых могли иметь доступ все экземпляры советника, прикрепленные к нескольким разным символам. Т.е. массив данных один, а экземпляров советников - несколько. Каждый экземпляр советника может читать и изменять члены массива.

Как я понимаю, необходимо создать массив со статичными членами (static).

Простейший пример: подсчитать общее число тиков на всех графиках, где прикреплены советники. Присоединим советника к 2 графикам и по событию OnTick() будем увеличивать счетчик на 1. Для простоты я попробовал использовать не массив, а одну статичную переменную counter. Но к сожалению, каждый советник работает только со своим счетчиком, счетчик не "общий". Результат:

символ1, тик1 : счетчик = 0;

символ1, тик2 : счетчик = 1;

символ2, тик1 : счетчик = 0; - вот здесь ожидалось счетчик = 2

Для примера я создал простой класс со счетчиком:

//+------------------------------------------------------------------+
//|                                                   TestStatic.mqh |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class TestStatic
  {
private:
static int counter;
public:
                     TestStatic();
                    ~TestStatic();

static void IncreaseCounter();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
TestStatic::TestStatic()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
TestStatic::~TestStatic()
  {
  }
//+------------------------------------------------------------------+
int TestStatic::counter=0;
TestStatic::IncreaseCounter()
  {
   Print("Symbol: "+_Symbol +", counter: "+ TestStatic::counter);
   TestStatic::counter++;
  };

Вот код советника:

//+------------------------------------------------------------------+
//|                                                Exp_testMulti.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#include <TestStatic.mqh>

static string tickCounter[2][2];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   TestStatic::IncreaseCounter();
    
  }
//+------------------------------------------------------------------+

Помогите плз разобраться, заранее большое спасибо!

 
VangoghFX:

Добрый день! Прошу помощи в реализации простой, на мой взгляд, схемы.

Есть советник, который нормально работает на одном инструменте. Я хочу "допилить" его, чтоб он работал одновременно по нескльким инструментам. Для этого мне нужно правильно создать массив данных, к членам которых могли иметь доступ все экземпляры советника, прикрепленные к нескольким разным символам. Т.е. массив данных один, а экземпляров советников - несколько. Каждый экземпляр советника может читать и изменять члены массива.

Как я понимаю, необходимо создать массив со статичными членами (static).

Простейший пример: подсчитать общее число тиков на всех графиках, где прикреплены советники. Присоединим советника к 2 графикам и по событию OnTick() будем увеличивать счетчик на 1. Для простоты я попробовал использовать не массив, а одну статичную переменную counter. Но к сожалению, каждый советник работает только со своим счетчиком, счетчик не "общий". Результат:

символ1, тик1 : счетчик = 0;

символ1, тик2 : счетчик = 1;

символ2, тик1 : счетчик = 0; - вот здесь ожидалось счетчик = 2

Для примера я создал простой класс со счетчиком:

Вот код советника:

Помогите плз разобраться, заранее большое спасибо!

Добрый день. Конкретно для реализации Вашего примера с тиками подойдут глобальные переменные терминала (недавно была опубликована статья на эту тему). Насчет такого массива... не уверен, надо пробовать. Но могу предложить другой вариант. В один советник прописать необходимые для работы символы и сделать, как Вы и сказали, статический/глобальный массив необходимых данных. И пусть советник в цикле переберет все нужные символы.
 
Tapochun:
Добрый день. Конкретно для реализации Вашего примера с тиками подойдут глобальные переменные терминала (недавно была опубликована статья на эту тему). Насчет такого массива... не уверен, надо пробовать. Но могу предложить другой вариант. В один советник прописать необходимые для работы символы и сделать, как Вы и сказали, статический/глобальный массив необходимых данных. И пусть советник в цикле переберет все нужные символы.

Спасибо большое за ответ.

Я использовал пример с тиками как самый простой и наглядный для описания общей идеи. В советнике же используются более сложные алгоритмы.

Вариант, когда в один советник прописываются N символов мне не нравится за своей громозкостью и не универсальностью. НА портале есть несколько статей на эту тему, я их видел: но мне не нравятся большие циклы, массивы, копирование данных, куча пачек переменных под каждый символ и т.д. Я хочу использовать более простой и эффективный , на мой взгляд, подход: один код советника под любой символ (символ определяется по графику, к которому привязан советник) - и каждая копия советника работает параллельно от других. Но при этом советники "шарят" друг с другом общую аналитическую информацию, которая нужна для принятия решений.

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

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