Вечер выходного дня - страница 9

 
Aleksey Panfilov:

Там шесть хендлов с одного индикатора на трех таймфреймах.

И смещение снимаемого значения, уже заложено. Копировал с них по одному значению.

А запутался используя три хендла одного индикатора на трех таймфреймах и копируя с них интервал возможного смещения.

Если за один раз нужно получать значение индикатора более чем с одного бара - нужно копировать значения в массив. На примере iATR:

//+------------------------------------------------------------------+
//| Get value of buffers for the iATR                                |
//+------------------------------------------------------------------+
double iATRGet(const int index)
  {
   double ATR[1];
//--- reset error code 
   ResetLastError();
//--- fill a part of the iATR array with values from the indicator buffer that has 0 index 
   if(CopyBuffer(handle_iATR,0,index,1,ATR)<0)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iATR indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(0.0);
     }
   return(ATR[0]);
  }
//+------------------------------------------------------------------+
//| Get value of buffers for the iATR in the array                   |
//+------------------------------------------------------------------+
bool iATRGetArray(const int start_pos,const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      Print("This a no dynamic array!");
      return(false);
     }
   ArrayFree(arr_buffer);
   int       buffer_num=0;          // indicator buffer number 
//--- reset error code 
   ResetLastError();
//--- fill a part of the iATRBuffer array with values from the indicator buffer that has 0 index 
   int copied=CopyBuffer(handle_iATR,buffer_num,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iATR indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(false);
     }
//---
   return(result);
  }
 
Vladimir Karputov:

Если за один раз нужно получать значение индикатора более чем с одного бара - нужно копировать значения в массив. На примере iATR:

Да, похоже ошибка была, что массивы в которые копировал оставил динамическими. :(

Проверю.

 
Aleksey Panfilov:

Да, похоже ошибка была, что массивы в которые копировал оставил динамическими. :(

Проверю.

Я копирую только в динамические массивы! Причём, перед копированием, принудительно делаю ArrayFree. Со статическими были косяки. С тех пор только динамические.

 
Vladimir Karputov:

Я копирую только в динамические массивы! Причём, перед копированием, принудительно делаю ArrayFree. Со статическими были косяки. С тех пор только динамические.

Понял. Ошибка не здесь.

Вот эксперт который не пошел.

Файлы:
 
Aleksey Panfilov:

Понял. Ошибка не здесь.

Вот эксперт который не пошел.

ERROR: так всё таки копируете ОДНО значение или ДВЕСТИ?

   //---  Используя функцию CopyBuffer, мы копируем по 1 последних новых значения индикаторов в динамические массивы

   if(CopyBuffer(Handle_4P72_L0_1,0,0,200,line1_L0)<0  // || CopyBuffer(Handle_4P72_L0_2,0,0,1,line2_L0)<0   || CopyBuffer(SMA_Handle_00,0,0,1,SMA_L0)<0
   || CopyBuffer(Handle_4P72_L1_1,0,0,200,line1_L1)<0  // || CopyBuffer(Handle_4P72_L1_2,0,0,1,line2_L1)<0   || CopyBuffer(SMA_Handle_01,0,0,1,SMA_L1)<0
   || CopyBuffer(Handle_4P72_L2_1,0,0,200,line1_L2)<0  // || CopyBuffer(Handle_4P72_L2_2,0,0,1,line2_L2)<0   || CopyBuffer(SMA_Handle_02,0,0,1,SMA_L2)<0
   ||  CopyTime(_Symbol,_Period,0,1,New_Time)<0)
 
Vladimir Karputov:

ERROR: так всё таки копируете ОДНО значение или ДВЕСТИ?

В этом эксперте (он отличается датой) я пробовал три хендла и двести значений.

 

Если готовы для биржи под МТ5 делать роботов, могу начать подкидывать идеи. Моделирую условия в ТС-Лабе, но торговать хотелось бы ими на МТ5 в авторежиме.

Если проблем с тестом нет, опишу логику торговли. Первый будет, вероятно, вот этот. 

Файлы:
 
Vladimir Karputov:

 

Начну небольшими порциями. 

Как только остаётся "Seconds before closing the signal candle" секунд до закрытия текущей свечи, вычисляем средний размер "Number of candles for calculating the average candle size" свеч. Если текущая свеча превышает средний размер на "Current candle: excess body size, percent" процентов - открываем позицию объёмом "Lots" и выставляем отложенный лимитный ордер объёмом "Lots" * "Multiplication factor" от цены открытия позиции на расстоянии "Pending limit level: percent of the height of the current candle" в процентах от высоты сигнальной свечи.

Вроде правильно?


Нужно время чтобы вспомнить, что я там навоял :) А тут как специально, сквозняки и как результат - простуда. И зло берёт и одновременно смешно: летом схватить температуру и простудиться :)

 
Vladimir Karputov:

Нужно время чтобы вспомнить, что я там навоял :) А тут как специально, сквозняки и как результат - простуда. И зло берёт и одновременно смешно: летом схватить температуру и простудиться :)

Поправляйтесь. 

 
Vladimir Karputov:

Я копирую только в динамические массивы! Причём, перед копированием, принудительно делаю ArrayFree. Со статическими были косяки. С тех пор только динамические.

Да ладно.. У меня и со статическими нет забот. Хотя, смотря о чём речь. В индюках да, лучше динамические, если нет желания буфером управлять и ловить косяки. А так в совах разницы нет никакой, на самом деле.