Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 120

 
Ihor Herasko:

Ага, вижу. И ответ на вопрос вижу постом ниже https://www.mql5.com/ru/forum/160587/page115#comment_6521492. Другими словами, проблема в том, что функционал не разделен на логические подзадачи. Вы свалили в кучу: перебор ордеров, принятие решения о торговом действии и совершение торговой операции.

Такая задача решается именно в три этапа:

  1. Сбор информации об ордерах, за которыми должна следить программа. Это как раз цикл перебора ордеров, который у Вас уже есть. Результатом выполнения цикла должно быть формирование массива ордеров.
  2. Расчет торговых сигналов. Результат расчета - команда открытия и/или закрытия ордеров. Зависит от торговой стратегии. Раньше, когда не было перечислений (enum) я использовал коды: 0 - нет сигнала, 1 - открыть Buy, -1 - открыть Sell, 2 - закрыть Buy, -2 - закрыть Sell. 
  3. Выполнение одной торговой операции. Если имеется какой-то торговый сигнал и для него подходит один из ордеров (п. 1), то совершается одна торговая операция. После нее весь алгоритм перезапускается, начиная с п. 1. В некоторых случаях даже происходит выход из OnTick  с тем, чтобы продолжить все на следующем тике.

Ну вот, спасибо. По крайней мере стало ясно, что делать. Попробую сам разобраться "как". Правда с массивами я ещё не знакомился. Во всяком случае, ещё раз спасибо.

 

Подскажите как выкрутится !!!


for(int i=OrdersTotal()-1; i>=0; i--) 

     {

      OrderSelect(i,SELECT_BY_POS);

      if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)

         break;

Предупреждение такое:    return value of 'OrderSelect' should be checked

Как эту величину 'OrderSelect' ещё надо проверить?

если сделаю так: j=OrderSelect(); Это правильно?


 
Rewerpool:

Подскажите как выкрутится !!!


for(int i=OrdersTotal()-1; i>=0; i--) 

     {

      OrderSelect(i,SELECT_BY_POS);

      if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)

         break;

Предупреждение такое:    return value of 'OrderSelect' should be checked

Как эту величину 'OrderSelect' ещё надо проверить?

если сделаю так: j=OrderSelect(); Это правильно?


 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
 
Alekseu Fedotov:

Не помогло!(

((((

 
Записал в файл, все отлично, а как теперь спарсить данные например "еурусд" "1.2242"  временные данные и т д?
 
Mickey Moose:   Записал в файл, все отлично, а как теперь спарсить данные например "еурусд" "1.2242"  временные данные и т д?

   string s=FileReadString(F1);       // Чтение очередной строки текстового файла
   StringSplit(s,     ","    ,    a);       // Выделение разделенных запятой элементов строки в массив
   datetime T1=StrToTime(a[4]);   // Дальше у меня идут преобразования ...
   int ord=StrToInteger(a[8]);
   double Цена=StrToDouble(a[12]);
 

 
novichok2018:

Ну вот, спасибо. По крайней мере стало ясно, что делать. Попробую сам разобраться "как". Правда с массивами я ещё не знакомился. Во всяком случае, ещё раз спасибо.

Напишите хотя бы один блок и покажите. Дальше тут подскажут в таком случае.

 
Rewerpool:

Не помогло!(


Читайте внимательней, еще раз

 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

весь код будет выглядеть так

   for(int i=OrdersTotal()-1; i>=0; i--) 
     {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
       if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
          {
         break;
          }
        }
      }
 
Rewerpool:

Не помогло!(


Так Вы ведь и не сделали ничего. Написали же выше:

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

А у Вас без проверки написано. Хотя читабельнее будет так выглядеть:

for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;
   ....
}
 

@Ihor Herasko @Alekseu Fedotov

БЛАГОДАРЮ!! ПОМОГЛО ИМЕННО ТАК!

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