Oxy
..ιllιlι.lι.ιllι.ιlι..

 
Уровень 27

  Торгую в компаниях:


Группа "Кодоводство"

Рейтинг 136



Советник - в основе индикатор ForexLine

На просторах интернета нашла индикатор ForexLine и было интересно сделать на его основе советник. Углубленно не копалась в коде индикатора, посмотрела, что он использует MACD. И периодически появляются алерты, среди которых сообщения к совершению покупок или продаж.


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

Так как индикатор перерисовывает, то в советнике можно в переменной указать, что сигнал брать не с текущей свечи, а с предыдущей.

Входящие параметры:

Можете задавать значения безубытка и трала.

Результат тестера после оптимизации за это полугодие, таймфрейм H4, пара EUR/USD:


Советник EA_ForexLine и индикатор к нему:
opentraders.ru/downloads/1201/

Первоисточник индикатора ForexLine здесь.
Но в советнике используется измененная его версия, поэтому используйте тот индикатор, что прилагается к советнику.
  • +4
  • Просмотров: 5492
  • 8 июня 2016, 14:18
  • Oxy
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Кодоводство", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник: buy/sell stop по фракталам
Следующая запись в группе  
Проверяем плечо и маржу
03 июня 2016
20 июня 2016

Брокер для ваших роботов, 15 лет на рынке

Комментарии (4)

+
0
По каким критическим ошибкам обычно вырубаешь советник? У меня сейчас в функции: 2,4,7,9,64,65,133,140,147,150,4110,4111.

if(BU_Step_Move!=0 && (BU_Step_Move<1 || BU_PointStep-BU_Step_Move<_mi_lv))

Здесь грамотно, заодно проверяешь чтобы BU_Step_Move не был больше BU_PointStep
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 8 июня 2016, 17:05
+
0
В OnInit почти все входящие переменные проверяю.

Ты правильно вопрос задал про ошибки. В советнике, который работает только на своей валютной паре, ни в OnInit, ни в OnTick я их не проверяю. Только разрешена ли автоматическая торговля(и здесь есть огромный нюанс). Отслеживаю ошибки, только когда отправляю запрос на сервер.

Когда советник отсылает запрос на сервер, проверяет ответ, и если там некритическая ошибка, то чуть позже отправит (и если надо, подкорректирует к этому времени) значения:
if (err==4 || err==6 || err==8 || err==128 || err==137 || err==141 || err==146) Sleep(1000*100);
(Количество таких попыток — внешняя переменная.)
А если другая ошибка — то сообщаем об этом пользователю.

Но это все хорошо с не мультивалютными советниками.
А вот с мультиками всё гораздо обстоятельнее проверяю.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 8 июня 2016, 17:53
+
0
На примере функции открытия ордеров добавляю еще 3 бороды <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp;  Это без проверки стоплевела и я еще только учусь <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 
У тебя как выглядит в расширенном варианте?


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0,err=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   if(AccountFreeMarginCheck(Symbol(),type,Lot())<=0 || GetLastError()==134)
     {
      Print("No enough money!");
      Trade=false;
      return;
     }

   for(int i=1; i<=10; i++)
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
        {
         break;
        }

      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();

      r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
      if(r>0) break;
      else
        {
         err=GetLastError();
         // Вывод сообщения об ошибке
         Print("Error(",err,") opening position: ",ErrorDescription(err));

         // Блокировка работы советника
         if(ErrorsAction(err)==2)
           {
            Trade=false;
            Print("Stop the Advisor!");
            return;
           }
         // Длительная пауза
         if(ErrorsAction(err)==1)
           {
            Sleep(1000*300); return;
           }
         if(ErrorsAction(err)==0)
           {
            Sleep(1000*10);
           }
        }
     }
   return;
  }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ErrorsAction(int error_code)
  {
   int act=0;
//----
   switch(error_code)
     {
      // ---- Error codes returned from trade server:
      case 0: Print("No error"); break;
      case 1: Print("No error, but the result is unknown"); return(0);
      case 2: Print("Common error"); return(2);
      case 3: Print("Wrong parameters"); return(0);
      case 4: Print("Trade server is busy"); return(1);
      case 5: Print("Old version of client terminal"); return(2);
      case 6: Print("No connection with trade server"); return(0);
 ..................................................................................
      case 148: Print("Amount of open and pending orders has reached the limit set by the broker"); return(0);
      case 149: Print("An attempt to open an order opposite to the existing one when hedging is disabled"); return(2);
      case 150: Print("An attempt to close an order contravening the FIFO rule"); return(2);

      // ---- Error codes run MQL4 programs:

      case 4000: Print("No error"); return(1);
      case 4001: Print("Wrong function pointer"); return(0);
      case 4002: Print("array Index is out of range"); return(0);
      case 4003: Print("No memory to stack functions"); return(0);
      case 4004: Print("stack Overflow after recursive call"); return(0);
   ..............................................................................................
      case 4203: Print("Unknown object type"); return(0);
      case 4204: Print("No object name"); return(0);
      case 4205: Print("Error coordinates object"); return(0);
      case 4206: Print("Not found specified subwindow"); return(0);
      default: Print("Error when working with object");
     }
//----
   return(0);
  }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string ErrorDescription(int error_code)
  {
   string error_string;
//----
   switch(error_code)
     {
      // ---- Error codes returned from trade server:
      case 0: error_string="No error"; break;
      case 1: error_string="No error, but the result is unknown"; break;
      case 2: error_string="Common error"; break;
      case 3: error_string="Wrong parameters"; break;
      case 4: error_string="Trade server is busy"; break;
      case 5: error_string="Old version of client terminal"; break;
      case 6: error_string="No connection with trade server"; break;
........................................................................................................................
      case 147: error_string="Using the expiration date of the warrant is prohibited broker"; break;
      case 148: error_string="Amount of open and pending orders has reached the limit set by the broker";break;
      case 149: error_string="An attempt to open an order opposite to the existing one when hedging is disabled"; break;
      case 150: error_string="An attempt to close an order contravening the FIFO rule";break;

      // ---- Error codes run MQL4 programs:

      case 4000: error_string="No error"; break;
      case 4001: error_string="Wrong function pointer"; break;
      case 4002: error_string="array Index is out of range"; break;
      case 4003: error_string="No memory to stack functions"; break;
 ............................................................................................
      case 4206: error_string="Not found specified subwindow"; break;
      default: error_string="Error when working with object";
     }
//----
   return(error_string);
  }

Редактирован: 9 июня 2016, 05:53
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 9 июня 2016, 05:46
+
0
Из моей скромной практики, ErrorsAction и ErrorDescription нужны только для маркета (где я еще не продавала). Заказчики в большинстве ни вкладку «эксперт», ни вкладку «журнал» не читают. (Кстати, по этой причине все ошибки инициализации я стала выводить в алёрт, а не в принт.) И я при любых вопросах просто прошу логи этих вкладок. А мне достаточно только общей фразы для всех ошибок и номера ошибки. Поэтому PutOrder я поскромнее делаю.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 9 июня 2016, 11:50

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий