Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 176

 
mila.com:

Читаю, но никогда не догадалась бы открывать файл перед циклом )

Возможно невнимательно читала )
Так там же даже пример есть чтения файла построчно от начала до конца...
 

Есть советник, который при торговле отталкивается от Пинбара. Робот корректно работает на валютах и абсолютно непредсказуемо на CFD.

Подскажите, пожалуйста, как такое может быть? 

 
RichLux:

Написал робота который при торговле отталкивается от Пинбара. Робот корректно работает на валютах и абсолютно непредсказуемо на CFD.

Подскажите, пожалуйста, как такое может быть? 

Здесь есть всё по вашему случаю.
 

Вот такая функция определения Пинбара

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Когда вставляю ее в советник, то функция отрабатывает (т.е. советник устанавливает сделки на след.свече после бара соответствующему условиям функции) на валютных парах отлично. А на CFD сделки устанавливаются где попало. 

В чем разница для данной функции между CFD и валютными парами?

 
RichLux:

Вот такая функция определения Пинбара

Когда вставляю ее в советник, то функция отрабатывает (т.е. советник устанавливает сделки на след.свече после бара соответствующему условиям функции) на валютных парах отлично. А на CFD сделки устанавливаются где попало. 

В чем разница для данной функции между CFD и валютными парами?

В первую очередь замените все && на {} чтобы каждое из условий было в своём блоке - тогда вы сможете в каждом из блоков распринтовать проверяемый результат - поглядите в журнале какие значения у вас получаются.
 
Artyom Trishkin:
В первую очередь замените все && на {} чтобы каждое из условий было в своём блоке - тогда вы сможете в каждом из блоков распринтовать проверяемый результат - поглядите в журнале какие значения у вас получаются.

Спасибо, последовал совету - понял где туплю. Из-за того что советник ганялся по пятизнаку, а CFD - это всего лишь 2 знака, там где я ожидал реакцию советника на минимум 50 пунктов, а получал уже начиная с 5ти. Протупил.

Просьба помочь еще с таким моментом.

Есть в коде такая часть:

MathAbs(Close1-Open1)/(High1-Low1)

Иногда случается, что High1=Low1. Тогда тестер выдает критическую ошибку, что на ноль делить нельзя. 

Как обойти?

 
RichLux:

Спасибо, последовал совету - понял где туплю. Из-за того что советник ганялся по пятизнаку, а CFD - это всего лишь 2 знака, там где я ожидал реакцию советника на минимум 50 пунктов, а получал уже начиная с 5ти. Протупил.

Просьба помочь еще с таким моментом.

Есть в коде такая часть:

Иногда случается, что High1=Low1. Тогда тестер выдает критическую ошибку, что на ноль делить нельзя. 

Как обойти?

Можно не думая:

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

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


void OnTick()

  {

      double minprice=999999, mp, maxprice=-999999;

      for(int i=0; i<10; i++)

      {

         mp = iLow(Simbol(), PERIOD_CURRENT, i);

         

      if (mp < minprice)

         minprice = mp;

      }


      for(int i=0; i<10; i++)

      {

         mp = iHigh(Simbol(), PERIOD_CURRENT, i);

         if (mp > maxprice)

         maxprice = mp;

      }

   

   Comment("Minprice: " + DoubleToString(minprice, 5) + "\n"+ 

           "Maxprice: " + DoubleToString(maxprice, 5));

  } 


В учебнике есть функции эти на которые компилятор ругается iLow и iHigh и переменная Simbol() там она в строчном режиме правда, но там другую задачу в примере решают. Что мне необходимо подправить в коде который выше. Я завис и не могу скомпилировать цикл чтобы проверить его.

ИЗ УЧЕБНИКА

Если  необходимо  получить  значение,  соответствующее  текущему  незавершенному  бару,  то

можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Пример:

#property copyright "2009, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property description "Пример вывода значений High[i] и Low[i]"

#property description "для баров, выбранных случайным образом"

double High[],Low[];

//+------------------------------------------------------------------+

//| Получим Low для заданного номера бара                            |

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

  {

   double low=0;

   ArraySetAsSeries(Low,true);

   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

   if(copied>0 && index<copied) low=Low[index];

   return(low);

  }

//+------------------------------------------------------------------+

//| Получим High для заданного номера бара                           |

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

  {

   double high=0;

   ArraySetAsSeries(High,true);

   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

   if(copied>0 && index<copied) high=High[index];

   return(high);

  }

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

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


void OnTick()

  {

      double minprice=999999, mp, maxprice=-999999;

      for(int i=0; i<10; i++)

      {

         mp = iLow(Simbol(), PERIOD_CURRENT, i);

         

      if (mp < minprice)

         minprice = mp;

      }


      for(int i=0; i<10; i++)

      {

         mp = iHigh(Simbol(), PERIOD_CURRENT, i);

         if (mp > maxprice)

         maxprice = mp;

      }

   

   Comment("Minprice: " + DoubleToString(minprice, 5) + "\n"+ 

           "Maxprice: " + DoubleToString(maxprice, 5));

  } 


В учебнике есть функции эти на которые компилятор ругается iLow и iHigh b переменная Simbol() там она в строчном режиме правда, но там другую задачу в примере решают. Что мне необходимо подправить в коде который выше. Я завис и не могу скомпилировать цикл чтобы проверить его.

ИЗ УЧЕБНИКА

Если  необходимо  получить  значение,  соответствующее  текущему  незавершенному  бару,  то

можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Пример:

#property copyright "2009, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property description "Пример вывода значений High[i] и Low[i]"

#property description "для баров, выбранных случайным образом"

double High[],Low[];

//+------------------------------------------------------------------+

//| Получим Low для заданного номера бара                            |

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

  {

   double low=0;

   ArraySetAsSeries(Low,true);

   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

   if(copied>0 && index<copied) low=Low[index];

   return(low);

  }

//+------------------------------------------------------------------+

//| Получим High для заданного номера бара                           |

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

  {

   double high=0;

   ArraySetAsSeries(High,true);

   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

   if(copied>0 && index<copied) high=High[index];

   return(high);

  }

//+------------------------------------------------------------------+


у вас ошибка в этом слове Simbol() надо Symbol() или _Symbol писать
 
Sergey Gritsay:

у вас ошибка в этом слове Simbol() надо Symbol() или _Symbol писать

Спасибо, ошибка по Simbol исправлена путём правильного написания Symbol. Что-то не то у меня с функциями iLow и iHigh. см. фото

Насколько в % вообще сходство между MQL 4 и MQL 5 ? а то это я так буду каждый цикл голову ломать по видеоурокам MQL4.

Файлы:
1.png  64 kb