Примеры: MetaEditor: Опираясь на силу шаблонов - страница 6

 
Как упростить шаблон из статьи "Опираясь на силу шаблонов", удалив SL, TP, отложенные ордера и их модификацию. А то невозможно эксперементировать.
 

ПОМОГИТЕ НОВИЧКУ СДЕЛАТЬ СОВЕТНИК ПО СИСТЕМЕ.

ВРОДЕ ВСЁ ПРОСТО,НО НЕ ПОЛУЧАЕТСЯ ВЫСТАВИТЬ ЛИМИТ ОРДЕРА НА

ЗНАЧЕНИЯХ СРЕДНИХ И ПРОВЕСТИ ИХ МОДИФИКАЦИЮ НА КАЖДОМ БАРЕ.

МОЖЕТ КОГО ЗАИНТЕРЕСУЕТ СИСТЕМКА И СПЕЦЫ ПО-БЫСТРОМУ ВЫЛОЖАТ КОД?

ЗАРАНЕЕ СПАСИБО ЗА ПОМОЩЬ.

//+------------------------------------------------------------------+
//| функция выдачи торговых сиглналов |
//+------------------------------------------------------------------+
int yourFunction(int workPeriod)
{
int res=OP_BALANCE;
//----
double iMA1 = iMA(Symbol(),workPeriod,MovingPeriod1,0,MODE_SMMA,4,MODE_SIGNAL);
double iMA2 = iMA(Symbol(),workPeriod,MovingPeriod2,0,MODE_SMMA,4,MODE_SIGNAL);
double iMA3 = iMA(Symbol(),workPeriod,MovingPeriod3,0,MODE_SMMA,4,MODE_SIGNAL);


if (iMA3<iMA2 && iMA2<iMA3) res=OP_SELLLIMIT;

//----
return (res);
}
//---- input parameters
extern int MovingPeriod1 = 13;
extern int MovingPeriod2 = 18;
extern int MovingPeriod3 = 5;
extern int StopLoss=150;
extern int TakeProfit=35;
extern double Lots=0.1;

Описание торговой системы

Использую три мувинга периоды 5, 8 и 13. Метод сглаживания усреднённый. Параметр для расчёта - средняя цена ( high + low / 2). Без сдвига. Масштаб Н1, GBP/USD
Допущения:
1. Если значения МА расположены по-порядку, - значит на данном периоде есть тренд. (Например: значение самой быстрой больше значений других, а значение самой медленной меньше всех, то на данном ТФ восходящая тенденция).
2. Наиболее выгодная цена для покупки во время ралли - ниже своего среднего значения
3. Наиболее выгодная цена для продажи на медвежьем рынке - выше своего среднего значения.
Сигнал к открытию генерируется следующим образом:
1. Определяется наличие и направление тренда (метод см. выше). Торговля осуществляется в направлении тренда.
2. Отложный ордер (limit) ставится за средней МА и за медленной МА. Не за быстрой МА, как наиболее консервативный вариант вступления в торги.
Закрытие позиций происходит по тейк-профиту, стоп-лоссу либо при появлении аналогичного сигнала в другую сторону(модификация ордеров ежечасно,по открытию новой свечи).
Управление рисками.
(тп=35п, сл=150п, ордер=0.1, депозит=1000$, максимальное кол-во одновременно открытых сделок=2, время установки ордеров с 9.00 до 19.00 мск)

 
Не могу разобраться как в этот шаблон добавить возможность использовать индикаторы на нескольких периодах. http://forum.mql4.com/ru/36501 - здесь задал по этому поводу вопрос. Надеюсь кто нибудь сможет помоч.
 

Статья познавательная для программистов mql4! Немного корректировки (может в комментариях уже говорили, не всё читал).

  • Тут много функций, но это перегруз для шаблона. Им место в библиотеке, которую надо подключить к шаблону добавив в шаблон всего одну строку (#include ...). К тому же эти функции могут понадобиться и в скриптах, и в индикаторах.
  • По всему коду проходят функция переворачивания. Это совсем не надо. Достаточно сделать ТОЛЬКО функцию открытия ордера, которая открывает ордер по указанному типу переворачивая Ask и Bid в зависимости от этого типа. (например OpenOrder(type, lot, setprice, sl, tp);) И ВСЁ!..
    А переключатель переворота сигнала должен быть на выходе из функции анализатора (модуля программы который согласно ТС по разным индикатором и методам выдаёт всего один сигнал - со значением в каком направлении открываться). Вот этот сигнал переворачиваем если надо, и дальше отправляем в функцию OpenOrder.
    (А вообще, тесты показывают что перевороты сигналов индикаторов не работают, это давно бы пора в словарике каком-нить прописать как аксиому, чтобы каждый новый программист не тратил месяцы своей жизни на что давно всем известно и проверенно миллионами тестов до него.)
  • Мне кажется в функции "isNewBar(int timeFrame)" ошибка, в case 1 наверно должно быть i=1:
    switch (timeFrame) { 
       case 1 :  i=0; break; 
       case 5 :  i=2; break; 
       case 15 : i=3; break;
 

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

Я так понял что вот в эту функцию

PrepareTicketsToClose
но почему то ничего не получается...

//+------------------------------------------------------------------+
//|  подготовить массив тикетов для закрытия                         |
//+------------------------------------------------------------------+
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], 
				   double & lots[],double arrayTickets[][9])
   {
   int size=ArrayRange(arrayTickets,0);
double SAR=iSAR(0,0,0.02,0.2,1);
 //----
   if (size==0) return;
 
   int i,type,ticket,closeSize;
   for (i=0;i<size;i++)
      {
      type=arrayTickets[i][1];
      // если тип ордера не рыночный, то пропуcкаем
      if (type>OP_SELL) continue;
 
      if (Revers) // перевернем тип рыночного ордера
         {
         if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
         }
      
      // тут решаем для каждого открытого ордера его судьбу
      //  оставить в рынке или добавить в массив на закрытие
      if (type==OP_BUY)
         {
         //  
         // код разрешающий оставить покупку
         Здесь решаем - оставить ордер BUY или закрыть
         
         // как пример
         if (signal==OP_BUY && SAR>Close[1]) continue;
         }
      
      if (type==OP_SELL)
         {
         //  
         // код разрешающий оставить продажу
         Здесь решаем - оставить ордер SELL или закрыть

         
         // как пример
         if (signal==OP_SELL && SAR<Close[1]) continue;
         }
 
      closeSize=ArrayRange(ticketsClose,0);
      ArrayResize(ticketsClose,closeSize+1);
      ArrayResize(lots,closeSize+1);
      ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
      ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера
      Print("arrayTickets[i][0]=",arrayTickets[i][0],"   ticketsClose[closeSize][0]=",ticketsClose[closeSize][0]);
      
      // здесь укажем сколько лотов нужно закрыть
      lots[closeSize] = arrayTickets[i][2]; // закрываемый объем
      // можно закрывать частично, тогда нужно переписать строку сверху
      }
//----
   return;   
   }
Скажите что я здесь делаю не так?
 
incognitos:

Статья познавательная для программистов mql4! Немного корректировки (может в комментариях уже говорили, не всё читал).

  • Тут много функций, но это перегруз для шаблона. Им место в библиотеке, которую надо подключить к шаблону добавив в шаблон всего одну строку (#include ...). К тому же эти функции могут понадобиться и в скриптах, и в индикаторах.
Может быть... Не имеет значения.
 
incognitos:
  • По всему коду проходят функция переворачивания. Это совсем не надо. Достаточно сделать ТОЛЬКО функцию открытия ордера, которая открывает ордер по указанному типу переворачивая Ask и Bid в зависимости от этого типа. (например OpenOrder(type, lot, setprice, sl, tp);) И ВСЁ!..
    А переключатель переворота сигнала должен быть на выходе из функции анализатора (модуля программы который согласно ТС по разным индикатором и методам выдаёт всего один сигнал - со значением в каком направлении открываться). Вот этот сигнал переворачиваем если надо, и дальше отправляем в функцию OpenOrder.
И так можно, наверно. Нужно смотреть как поведут себя операции с Stop Loss и Take Profit.
 
incognitos:
  • (А вообще, тесты показывают что перевороты сигналов индикаторов не работают, это давно бы пора в словарике каком-нить прописать как аксиому, чтобы каждый новый программист не тратил месяцы своей жизни на что давно всем известно и проверенно миллионами тестов до него.)

Не факт. Вы можете обнаружить, что в сильном тренде традиционные сигналы осцилляторов подведут вас под монастырь. Я переворачивал некоторые системы, работали :)
 
incognitos:
  • Мне кажется в функции "isNewBar(int timeFrame)" ошибка, в case 1 наверно должно быть i=1:
    switch (timeFrame) { 
       case 1 :  i=0; break; 
       case 5 :  i=2; break; 
       case 15 : i=3; break;

Не могу сказать, нужно проверять.
 
Замечательная статья. Спасибо большое автору.