Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 829

 
в мт5 когда тестируешь по реальным тикам, там комиссия учитывается, или только спред?
 

Мультивалютный эксперт в цикле запрашивает данные по символам. Там есть такой фрагмент:

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

По всем символам всё проходит нормально. При первом проходе время около 120мс, т.к. наполняются буфера индикаторов. Начиная со второго прохода время вычисления на текущем баре  меньше 1 мс.

Особенность в том, что у одного известного брокера есть символ EURRUR, по которому нет данных ("Ожидайте обновления"). Поэтому вычисления застряют на этой строке на 51 секунду. Ошибка 4806. 51 сек - это даже для одного (первого) раза неприемлемо, не  говоря уже про цикл.

Вопрос. Как быстро выяснить факт того, что по заданному символу нет данных? Я бы тогда его запомнил и на следующих итерациях просто переступал через него и шёл дальше без потери темпа.

 

Коллеги - подскажите как преобразовать массив типа double в string. Надо для записи его в файл. Вот общий тренировочный код.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

инф-ия взята из статьи

Сохранение и загрузка массивов из файла

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

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Здравствуйте, столкнулся с такой проблемой.

Есть два советника по одному инструменту, с разными магиками соответственно. Магик выставляю через CTrade, открываю позицию соответственно тоже через CTrade. При открытой позиции первого советника его магик  присваевается второму советнику (установил проверку после открытии позиции, с.м. ниже), поэтому проверка на наличие открытых позиций не видит своего магика, в дальнейшем открывая множество позиций в одну сторону. Счет стоит на демке, в тестере такое выявить невозможно. Если значение магика сохраняется в классе, может его обнулять нужно, но я не знаю как.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Здравствуйте, столкнулся с такой проблемой.

Есть два советника по одному инструменту, с разными магиками соответственно. Магик выставляю через CTrade, открываю позицию соответственно тоже через CTrade. При открытой позиции первого советника его магик  присваевается второму советнику (установил проверку после открытии позиции, с.м. ниже), поэтому проверка на наличие открытых позиций не видит своего магика, в дальнейшем открывая множество позиций в одну сторону. Счет стоит на демке, в тестере такое выявить невозможно. Если значение магика сохраняется в классе, может его обнулять нужно, но я не знаю как.

 Пожалуйста, Вставляйте код правильно, а не в виде простыни текста.


По коду: задавайте во входных параметрах каждому советнику СВОЙ магик. Допустим первому задаёте 10001, тогда второму 10002.

 
Vladimir Karputov:

 Пожалуйста, Вставляйте код правильно, а не в виде простыни текста.


По коду: задавайте во входных параметрах каждому советнику СВОЙ магик. Допустим первому задаёте 10001, тогда второму 10002.

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

 
Pavel Nikiforov:

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

В этом случае, лучше задавать магик

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
перед каждым открытием позиции\ордера, а не в OnInit.
 
Alexey Viktorov:

В этом случае, лучше задавать магик

перед каждым открытием позиции\ордера, а не в OnInit.

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

В общем последовательность такова:

  • нужно открывать позиции с магиком 1 - устанавливаем магик 1, последующие позиции будут иметь магик 1,
  • нужно открывать позиции с магиком 2 - устанавливаем магик 2, последующие позиции будут иметь магик 2,
  • нужно открывать позиции с магиком 3 - устанавливаем магик 3, последующие позиции будут иметь магик 3,

и т.д. ...

 
Alexey Viktorov:

В этом случае, лучше задавать магик

перед каждым открытием позиции\ордера, а не в OnInit.

Изначально было так, не помогает. Но в примерах обычно стоит в OnInit поэтому перенес. Давно с этим вожусь, стоят совы на тесте вроде всё ровно идет, вдруг открываешь сервер, а там 20 позиций в одну сторону. Может ли влиять то что проверка открытых позиций не через классы?

 
Pavel Nikiforov:

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

Так как в классе CTrade нет метода GetExpertMagicNumber, после торговой операции распечатайте этот код:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

так проверите, точно ли разные магики у обоих экспертов.