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

 
Сообственно сабж.

Брокер FXDD, два разных демо-счета, запущенно два терминала для каждого эксперта.
Разные входы... :(
Если несколько экспертов на одном счете, то же разнятся результаты,
раньше думал "разделение торгового потока"... Повесил каждого на свой терминал, то же самое...

Может это уже обсуждалось, может нет....

Да, если успеть заметить, что один из них тупит и перезапустить,  то сделку откроет...

PS: В следующей версии будет возможность тестировать портфель экспертов на разных валютах?
PPS: Удобно было бы сохранять результаты оптимизации с параметрами а не просто конечный результат...

Спасибо за внимание и возможное участие.
 
Вам необходимо разбираться в своем коде и в логах эксперта. Терминал исполняет то, что хочет эксперт.
 
Renat:
Вам необходимо разбираться в своем коде и в логах эксперта. Терминал исполняет то, что хочет эксперт.
Код обычный, взято за основу то, что было в примерах и в чемпионате, ни чего экстраординарного.
Почему он при тике не генерирует сигнал точно - это не понятно. Логи соответствуют тикам, то есть все молчком.

Нулевой бар не рассматривается, везде в индикаторах бар 1-й.

Вы можете выложить  эталон, который будет адекватно работать как с несколькими экспертами,
так и гарантировать точность работы на каждом тике?

Вот пример правильного омеговского RSI.. :)





#property copyright "Copyright © Khrapovskiy Igor"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
externintRSIPeriod=14;
//---- buffers
doubleMyRSIBuffer[];
//double PosBuffer[];
//double NegBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
intinit()
{
stringshort_name;
//---- 2 additional buffers are used for counting.
IndicatorBuffers(1);
// SetIndexBuffer(1,PosBuffer);
// SetIndexBuffer(2,NegBuffer);
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,MyRSIBuffer);
//---- name for DataWindow and indicator subwindow label
short_name="MyRSI("+RSIPeriod+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//----
SetIndexDrawBegin(0,RSIPeriod);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Relative Strength Index |
//+------------------------------------------------------------------+
intstart()
{
inti,counted_bars=IndicatorCounted();
doublerel,negative,positive;

//----
if(Bars<=RSIPeriod)return(0);
//---- initial zero
if(counted_bars<1)
for(i=1;i<=RSIPeriod;i++)MyRSIBuffer[Bars-i]=0.0;
//----

for(i=0;i<Bars-RSIPeriod-1;i++)
{
doublesumn=0.0,sump=0.0;
for(intk=0;k<RSIPeriod;k++)
{
rel=Close[i+k]-Close[i+k+1];
if(rel>0)sump+=rel;
elsesumn+=(-1*rel);
}
positive=sump/RSIPeriod;
negative=sumn/RSIPeriod;

// PosBuffer[i]=positive;
// NegBuffer[i]=negative;

if(positive+negative!=0){MyRSIBuffer[i]=100.0*positive/(positive+negative);}
else{MyRSIBuffer[i] = 0; }
}
//----
return(0);
}
//+------------------------------------------------------------------+
/*
Омегавская формула расчета:

For Counter = 0 To MyRange-1 Begin
UpAmt = Price[Counter] - Price[Counter + 1];
If UpAmt >= 0 Then
DownAmt = 0
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / MyRange;
DownAvg = DownSum / MyRange;

If UpAvg+DownAvg <> 0 Then
RSI = 100 * UpAvg / (UpAvg + DownAvg)
Else
RSI = 0;*/
Примерно такой код. Почему у вас другой RSI ?????
 
То, что Вы привели - это сильно упрощенный RSI. Почти все новички делают ошибку в описании RSI, когда принимают условие сглаживания как простое SMA.

В стандартном описании RSI про усреднение написано так:

Расчет

Основная формула расчета технического индикатора Relative Strength Index:

RSI = 100 - (100 / (1 + U / D))

Где:

U — среднее значение положительных ценовых изменений;
D — среднее значение отрицательных ценовых изменений.

Хотя на самом деле используется сглаженное усреднение:
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive;
//----
   if(Bars<=RSIPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=RSIPeriod;i++) RSIBuffer[Bars-i]=0.0;
//----
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;
        }
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;
      if(negative==0.0) RSIBuffer[i]=0.0;
      else RSIBuffer[i]=100.0-100.0/(1+positive/negative);
      i--;
     }
//----
   return(0);
  }
 
Так как Вы сменили тему и вместо предоставления полного кода эксперта, который по разному торгует, перешли на RSI, то считаю, что тему с экспертом закрыли.
 
Такое общение на статус мега терминала не тянет...

Вот код открытия, присутствующий в эксперте:

for(c=0;c<popitka;c++)
{
ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,uroven-Stop*Point,Ask+TakeProfit*Point, "Pipsoed",_MagicNumber,0,Green);

err=GetLastError();
if(err==0)
{
TimeOfTrade=TimeMinute(Time[0]); //Что бы не лезть в сделку каждую минуту
break;
}
else
{
if(err==4 || err==137 ||err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}

Вам это что-то скажет?

Насчет RSI "сглаженность" не является ли "сглаженности" сигналов, то есть их отсутсвии?? В том примере,  который я привел очень наглядно видно преимущество перекупленности и перепроданности на уровнях 30 и 70, чем их "сглаженность"...
 
К сожалению, Вы не предоставили полный код эксперта и не описали условия проверки так, чтобы можно было все повторить. А это не позволяет ответить на Ваш вопрос.
 
Код все равно можно пронять только с опытом и с временем соотвествующим. В выборке множества вариантов любой код без многолетного опыта - мусор.
 
Я не перввый раз уже встречаю заявления, что тот или иной индикатор в MetaTrader 4 считается иначе, чем в ...(тут идет название так называемого авторитетного программного продукта).
При этом, приводя некие куски кода из другой программы технического анализа, человек ничтоже сумняшеся обычно полагает , что привел железобетонное доказательство своей правоты (и неправильности расчетов в МТ4).
Тот факт, что "найденный человеком баг" почему-то не исправляется разработчиками без сторонней помощи еще больше подзадоривает к спору.

Чтобы закрыть тему о правильности или неправильности того или иного индикатора, необходимо предоставить простые и ясные примеры - лобовые доказатекльства. Что мы имеем?
Имеем два разных индикатора, причем разница видна визуально. Можем ли мы сделать вывод, что "именно мой код, который взят из Омеги, является более правильным"?
Если сделать поиск в интренете, то можно найти вот такое определение индикатора RSI - http://www.dbceuro.com/education/studies.jsp?study=RSI

Этот же алгоритм можно увидеть в книге Роберта Колби "Энциклопедия технических индикаторов рынка". Код в пользовательском индикаторе RSI, который идет в стандартной поставке, на первый взгляд кажется сложным и запутанным. Но если Вы в свое время потратили достаточное время для разгрызания книг Билла Вильямса по его торговой системе, изложенной в книге "Новые измерения биржевой торговли", то увидели бы использование сглаженной скользящей средней на массивах, содержащих ценовые изменения (Close[i]-Close[i+1]).
 
Поэтому, я разложил пользовательский индикатор RSI на три других. Первый индикатор (PositivePriceChange) показывает сглаженную скользящую среднюю от положительных изменений цены.

//+------------------------------------------------------------------+
//|                                          PositivePriceChange.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DarkBlue
//---- input parameters
extern int       Per=14;
//---- buffers
double SmoothPos[];
double PosMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,SmoothPos);
   SetIndexDrawBegin(0,Per);
   SetIndexBuffer(1,PosMapBuffer);
   SetIndexEmptyValue(1,0);
   IndicatorShortName("Smoothed Positive Price Changes("+Per+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   int i,limit,limit1;
   double val;
   if (counted_bars==0)
      {
      limit=Bars-2;
      limit1=Bars-Per-1;
      }
   if (counted_bars>0)
      {
      limit=Bars-counted_bars;
      limit1=limit;
      }
      
   for (i=limit;i>=0;i--)
      {
      val=Close[i]-Close[i+1];
      if (val>0) PosMapBuffer[i]=val;
      else PosMapBuffer[i]=0.0;
      }
   for (i=limit1;i>=0;i--)
      {
      SmoothPos[i]=iMAOnArray(PosMapBuffer,0,Per,0,MODE_SMMA,i);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Видно, что в буфер PosMapBuffer мы записываем только положительные изменения цен закрытия, а затем сглаживаем этот буфер штатной функцией iMaOnArray() с типом сглаживания MODE_SMMA . Именно такие мувинги используются при построении Аллигатора (вот почему мне знаком алгоритм сглаживания).
 
Строим второй индикатор (NegativePriceChange) , аналогичный первому, только в нем мы уже исследуем отрицательные изменения цен закрытия на периоде Per=14 (по умолчанию).

//+------------------------------------------------------------------+
//|                                          NegativePriceChange.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Orange
//---- input parameters
extern int       Per=14;
//---- buffers
double SmoothNeg[];
double NegMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,SmoothNeg);
   SetIndexDrawBegin(0,Per);
   SetIndexBuffer(1,NegMapBuffer);
   SetIndexEmptyValue(1,0);
   IndicatorShortName("Smoothed Negative Price Changes("+Per+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   int i,limit,limit1;
   double val;
   if (counted_bars==0)
      {
      limit=Bars-2;
      limit1=Bars-Per-1;
      }
   if (counted_bars>0)
      {
      limit=Bars-counted_bars;
      limit1=limit;
      }
      
   for (i=limit;i>=0;i--)
      {
      val=Close[i]-Close[i+1];
      if (val<0) NegMapBuffer[i]=-val;
      else NegMapBuffer[i]=0.0;
      }
   for (i=limit1;i>=0;i--)
      {
      SmoothNeg[i]=iMAOnArray(NegMapBuffer,0,Per,0,MODE_SMMA,i);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+