Прошу помощи в решении алгоритма

 

Я написал функцию отправки писем советником при благоприятном условии торговли.

Работаю по 20 валютным парам, на разных таймфреймах.

Так вот иногда получается так, что советник ловит несколько/множество вариантов торговли и пытается отправить письмо.

Я со своей стороны сохраняю последнюю пару игры по которой отправлено письмо (не работает, потому как потом идет игра к примеру по другой паре и переменная меняется потом снова по предыдущей паре, короче в результате отправляется куча писем).

Хотелось бы сделать некий массив в который помещать все пары по которым были отправлены сообщения, а потом проверять при попытке отправить письмо есть ли данная пара в массиве, если есть письмо не отправляется.

Помоги пожалуйста с данным алгоритмом или посоветуйте как его реализовать?

Спасибо большое!

 
rabanik:

Хотелось бы сделать некий массив в который помещать все пары по которым были отправлены сообщения, а потом проверять при попытке отправить письмо есть ли данная пара в массиве, если есть письмо не отправляется.

Алгоритм который Вы описали правильный. Что именно у Вас не получается ?

 
Sergey Kolemanov:

Алгоритм который Вы описали правильный. Что именно у Вас не получается ?

Общая мысль алгоритма правильная, только нужен ещё критерий исключения инструмента из массива.
Требуется ведь когда-то и разрешить отправку сообщения по паре, которая есть в массиве (а они там будут в конечном итоге все, если не исключать).
Так вот критерий исключения в описанном алгоритме отсутствует.

 
Andrei Fandeev:

Общая мысль алгоритма правильная, только нужен ещё критерий исключения инструмента из массива.
Требуется ведь когда-то и разрешить отправку сообщения по паре, которая есть в массиве (а они там будут в конечном итоге все, если не исключать).
Так вот критерий исключения в описанном алгоритме отсутствует.

По поводу исключения - можно просто каждый день, или каждый 4 час очищать массив.

 
Sergey Kolemanov:

Алгоритм который Вы описали правильный. Что именно у Вас не получается ?

Сергей, дело в том, что запускаю один советник, который обрабатывает 20 валютных пар.

Так вот, ситуация к примеру есть игра по "паре 1" письмо ушло и записывается в переменную "пара 1". Далее игра по "паре 2", значение переменной "пара 1" меняется на "пара 2".

Далее советник продолжает работать, каждый тик и снова показывает игру по "паре 1", опять уходит письмо, далее снова игра по "паре 2" и снова письмо и т.д. (((((((((((((((((((((( 

 
rabanik: к примеру есть игра по "паре 1"

Что такое "игра" ?
Если торговая операция, то включите Пуш-уведомления в терминале на смартфон. Все проблемы решены.
Если имеется ввиду получение сигналов от индикаторов на разных инструментах - тогда ключевое слово "массив" (Вы его сами ведь назвали), а не одна переменная для хранения информации. Даже 2 массива. В одном строковом имена инструментов, в другом время бара на котором было отправлено последнее сообщение по соответствующему инструменту. Индексы совпадают соответственно. И если во втором массиве дата текущего бара, то уже не отправлять сообщение.
Вариантов очень много.

 
Andrei Fandeev:

Что такое "игра" ?
Если торговая операция, то включите Пуш-уведомления в терминале на смартфон. Все проблемы решены.
Если имеется ввиду получение сигналов от индикаторов на разных инструментах - тогда ключевое слово "массив" (Вы его сами ведь назвали), а не одна переменная для хранения информации. Даже 2 массива. В одном строковом имена инструментов, в другом время бара на котором было отправлено последнее сообщение по соответствующему инструменту. Индексы совпадают соответственно. И если во втором массиве дата текущего бара, то уже не отправлять сообщение.
Вариантов очень много.

Андрей, я вот не знаю как, при переборе пар, при отправке письма, помещать в массив данные и как потом их прочитать из массива?

Разбирался так и не понял(

 
rabanik:

Андрей, я вот не знаю как, при переборе пар, при отправке письма, помещать в массив данные и как потом их прочитать из массива?

Разбирался так и не понял(

Накидал на скорую руку

struct checkSymbol
{
     string   symbol;
     datetime timeBar;
};

bool checkMessage(const string symbol)
{
     static checkSymbol ArrayMessage[];
     
     int n = ArraySize(ArrayMessage);
     bool res = false,
          resSymbol = false;
     for(int i=0; i<n; i++)
          if( ArrayMessage[i].symbol == symbol )
          {
               if( ArrayMessage[i].timeBar != Time[0] )
               {
                    ArrayMessage[i].timeBar = Time[0];
                    res = true;
               }
               resSymbol = true;
               break;
          }
     if(!resSymbol)
          if( ArrayResize(ArrayMessage, n+1) == n+1)
          {
               ArrayMessage[n].symbol = symbol;
               ArrayMessage[n].timeBar = Time[0];
               res = true;
          }
     
     return res;
}

Т.к. не знаю какую вы сохраняете информацию при отправке сообщения. Написал проверку времени открытия бара. Чтоб отправлялось не чаще чем 1 раз за бар.

 
rabanik:

Сергей, дело в том, что запускаю один советник, который обрабатывает 20 валютных пар.

Так вот, ситуация к примеру есть игра по "паре 1" письмо ушло и записывается в переменную "пара 1". Далее игра по "паре 2", значение переменной "пара 1" меняется на "пара 2".

Далее советник продолжает работать, каждый тик и снова показывает игру по "паре 1", опять уходит письмо, далее снова игра по "паре 2" и снова письмо и т.д. (((((((((((((((((((((( 

Вот ещё вариант с массивом:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict




string arr_data[][2]; // массив в который записываем имя символа([i][0]) и время отправки([i][1]) сообщения
int period_hour = 1; // пауза в часах на отправку сообщения по каждому символу
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if(Ваше условие для отправки сообщения)
   {
      if(Array_Check("EURUSD", arr_data, period_hour))
      {
// сюда вставляем Ваш код(функцию) для отправки сообщения

         Array_Write("EURUSD", arr_data);
      }
   }
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Array_Check(string symbol, string &arr[][2], int period)
{
   int s = ArrayRange(arr, 0);
   
   for(int i = 0; i < s; i++)
   {
      if(arr[i][0] == symbol)
      {
         if(StringToTime(arr[i][1]) + (period * 3600) < TimeCurrent()) 
         {
            arr[i][0] = "";
            arr[i][1] = "";
            return(true); 
         }
         else return(false);
      }
   }
   return(true);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Array_Write(string symbol, string &arr[][2])
{
   int s = ArrayRange(arr, 0);
   
   for(int i = 0; i < s; i++)
   {
      if(arr[i][0] == "" && arr[i][1] == "")
      {
         arr[i][0] = symbol;
         arr[i][1] = TimeToString(TimeCurrent());
         return;
      }
   }
   ArrayResize(arr, s + 1);
   arr[s][0] = symbol;
   arr[s][1] = TimeToString(TimeCurrent());
}
//+------------------------------------------------------------------+

Условие для отправки сообщения Вы не предоставили, пропишите его сами. Вместо "EURUSD" необходимо передать символ по которому отправляется письмо.

p.s. Да и желательно здесь:

      if(Array_Check("EURUSD", arr_data, period_hour))
      {
// сюда вставляем Ваш код(функцию) для отправки сообщения

         Array_Write("EURUSD", arr_data);
      }
делать проверку на успешность отправки сообщения, и если получили ошибку то выходить оператором return;
 
СПАСИБО! СПАСИБО! СПАСИБО! БУДУ ПРОБОВАТЬ!
 
Sergey Kolemanov:

Вот ещё вариант с массивом:

Условие для отправки сообщения Вы не предоставили, пропишите его сами. Вместо "EURUSD" необходимо передать символ по которому отправляется письмо.

p.s. Да и желательно здесь:

делать проверку на успешность отправки сообщения, и если получили ошибку то выходить оператором return;


Спасибо, огромное! 

Все работает!