Пасиму нисего не рисует, насяльника? - страница 2

 
Maxim Dmitrievsky:
ну да, он. Основное мучение у меня тут с буферами - че куда копируется, че как индексируется, и непонятки с мультивалютным индюком, котировки по другим символам могут отставать ввиду того, что индюк пересчитывается с приходом нового тика текущего символа, а по другим могли изменения произойти. А онтаймеры и ончартивенты дополнительные начинают тормозить индикатора, который должен быть быстрым )

Я конечно совсем не мастак в 5-рке, но в 4-ом, чтобы получить значение от i на другом инструменте, относительно текущего, нужно синхронизировать бары по времени. Т.е. если, к примеру 10-ый бар по евро в 10-00, то 10-го бара по фунту в 10-00 может и не быть, а 10-ый бар будет уже за рамками массива, т.к. 9-ый бар по фунту в 10-00. Примерно так понимаю вылет за границы массива в данном случае.

Для синхронизации баров на 4-рке мы узнаем время текущего бара от i по текущему инструменту, находим номер бара на интересуюещем нас инструменте, у которого время будет равно нужному относительно текущего инструмента, и присваиваем необходимое значение от i, по найденному номеру бара в массив другого инструмента. Таким образом, если на текущем инструменте будет дыра в истории, то эта дыра появится на всех остальных инструментах, даже если там чо то было.

 
new-rena:

Я конечно совсем не мастак в 5-рке, но в 4-ом, чтобы получить значение от i на другом инструменте, относительно текущего, нужно синхронизировать бары по времени. Т.е. если, к примеру 10-ый бар по евро в 10-00, то 10-го бара по фунту в 10-00 может и не быть, а 10-ый бар будет уже за рамками массива, т.к. 9-ый бар по фунту в 10-00. Примерно так понимаю вылет за границы массива в данном случае.

Для синхронизации баров на 4-рке мы узнаем время текущего бара от i по текущему инструменту, находим номер бара на интересуюещем нас инструменте, у которого время будет равно нужному относительно текущего инструмента, и присваиваем необходимое значение от i, по найденному номеру бара в массив другого инструмента. Таким образом, если на текущем инструменте будет дыра в истории, то эта дыра появится на всех остальных инструментах, даже если там чо то было.

Как так бара не будет, а куда он денется? из-за гэпа?
 
Maxim Dmitrievsky:
Как так бара не будет, а куда он денется? из-за гэпа?
допустим мы синхронизируем по времени валютные пары евро и фунта. Пусть в 10-00 по евро нет бара, а по фунту есть. Чтобы синхронизировать валютные пары относительно евро, нам нужно сопоставить бары по времени. Т.е. по фунту в 10-00 бар мы просто пропускаем.
 

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

//+------------------------------------------------------------------+
//|                                              Arbitrage Pairs.mq5 |
//|                        Copyright 2016, Dmitrievsky Max           |
//|                        https://www.mql5.com/ru/users/dmitrievsky |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  Green
#property indicator_type2   DRAW_LINE
#property indicator_color2  Red
   
double ExtBidBuffer[];
double ExtAskBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
   SetIndexBuffer(0, ExtBidBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, ExtAskBuffer, INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   ArraySetAsSeries(ExtBidBuffer,true);     ArraySetAsSeries(ExtAskBuffer,true);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {
   MqlTick tickEUR;
   MqlTick tickGBP;
   MqlTick tickEURGBP;
   
   SymbolInfoTick("EURUSD",tickEUR);
   SymbolInfoTick("GBPUSD",tickGBP);
   SymbolInfoTick("EURGBP",tickEURGBP);
   
     ExtBidBuffer[0]=NormalizeDouble(tickEUR.bid/tickGBP.bid-tickEURGBP.bid,_Digits);
     ExtAskBuffer[0]=NormalizeDouble(tickEUR.ask/tickGBP.ask-tickEURGBP.ask,_Digits);
     
   return(rates_total);
  }
//+------------------------------------------------------------------+

 


 
Maxim Dmitrievsky:


ArraySetAsSeries(ExtBidBuffer,true);
ArraySetAsSeries(ExtAskBuffer,true);

вынесите в Инит

/tickGBP.bid

проверка на 0 перед делением должна быть

или проверка успешности

SymbolInfoTick
 
o_O:

вынесите в Инит

проверка на 0 перед делением должна быть

или проверка успешности

Да, все сделал, индикатор уже не нужен как таковой, просто для визуального наблюдения был. Вшил все в советник.
 
o_O:

вынесите в Инит

проверка на 0 перед делением должна быть

или проверка успешности

"Или" не достаточно, нужны обе проверки.

Есть плавающий глюк в МТ5, когда SymbolInfoTick возвращает true, но бид = 0.

Я его ловил пару лет назад и повторно - пару месяцев назад. Сервис-деск воспроизвести не может. 

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