Статус
Закрыто для дальнейших ответов.

zhserg

Местный знаток

Вложения

  • TmaSlope.v1.5 Pobeda(z).ex4
    31,5 КБ · Просмотры: 144
  • Screenshot_1.png
    Screenshot_1.png
    33,7 КБ · Просмотры: 250
Последнее редактирование:

advanced

Элитный участник

Fillelin,V papkie metatreidera "indicators" jiest obie peredielanyjie versii, piervaja versija indikatorv,kotoruju vy peredielali (TMA i T3) jiest v papkie "indicators" otkrytovo terminala,a vtoroj versii nietu...
Terminal peregruzhal nieskolko raz...dazhe restartiraval kompiuter-niepojavilis...
Posmotritie pozhalujsta,v chiom prichina ...
Spasibo vam ogromnojie
 

Slavich

Интересующийся
Помогите пожалуйста в доработке индикатора.

Индикатор предназначен для прогнозирования направления движения цены на следующей свече.

Проблема, с которой я столкнулся – это появление ложных сигналов. При присоединении индикатора к графику я вижу отличную статистику прибыльных сделок на истории (75-80% прибыльных сделок). Но во время тестирования в тестере стратегий, появляются сигналы на тех же свечах за исключением 1-2 свечей (просто не появляются сигналы на них ) в течение суток на 15-ти минутном таймфрейме плюс много ложных сигналов. На других таймфреймах то же самое. Мое подозрение пало на неправильный расчет баров при тестировании, в MQL4 я не силен, точно утверждать не могу. Причем индикатор НЕ РИСУЕТ. Он делает расчет уже на основе исторических данных – тиковых объемов и цен открытия и закрытия свечей с 1 по 6, то есть уже сформировавшихся, и выдает сигнал на нулевой (формирующейся) свече.

Прикрепляю скриншоты от 01 мая 2014г. Один из них – сигналы индикатора SOT_DOT_6 NEW.mq4 на истории пары EURCHF без ложных сигналов. Другой скрин - сигналы этого же индикатора после тестирования на тестере стратегий с ложными сигналами. Свечи с ложными сигналами выделены красными линиями. Например, в 04:15, 10:15, 14:00, 22:30, 22:45. Если сравнить эти скриншоты, то можно увидеть и другие ложные сигналы, но я не стал их отмечать, чтобы не загромождать скриншот.
Я заметил еще одну особенность в поведении ложных сигналов. Допустим, при тестировании на тестере стратегий у нас появился очередной сигнал на свече. Пока мы не знаем, ложный он или нет. Ждем появления следующего сигнала. После того, как появился следующий сигнал, удаляем индикатор с графика и затем снова присоединяем индикатор к графику. Если предыдущий сигнал не исчез с графика, то он был настоящим, если исчез – то был ложным. Если не дожидаться появления следующего сигнала, то даже после отрисовки нескольких свечей удаляя индикатор с графика и затем снова присоединяя его к графику, предыдущий сигнал в любом случае будет сохраняться, даже если в последствии выяснится, что он был ложным.

И еще я заметил такой момент.

Всего 2 условия, при которых появляется сигнал в начале формирования текущей свечи, например, для сигнала на покупку:
1. Средняя арифметическая скорость торговли на свече 1 (SOT1) больше средней арифметическая скорость торговли за последние 6 свечей, умноженной на 2., т. е. (SOT1>SOTAV2)
2. Цена закрытия свечи 2 должна быть меньше цены открытия свечи 2 и одновременно с этим цена закрытия свечи 1 должна быть меньше цены открытия свечи 2, т. е. (ClosePrice2<OpenPrice2) && (ClosePrice1<OpenPrice2).
Я из строк 179 и 188 кода исключил условие (SOT1>SOTAV2), оставил только условия по взаимному расположению свечей и протестировал индикатор в таком виде. Естественно, сигналов стало больше, так как исчез фильтр (SOT1>SOTAV2), но в тоже время сигналов во время тестирования больше, чем на истории. Хотя такого не должно быть, потому что сигнал появляется уже после формирования свечей.
Как видно на скриншотах, в 14:00 сигнала нет ни на истории, ни на тесте, хотя он должен появиться по условиям взаимного расположения свечей в 13:30 и 13:45. Тоже какая-то странность…

Помогите пожалуйста разобраться с этим.
 

Вложения

  • Тест без объемов.JPG
    Тест без объемов.JPG
    195,9 КБ · Просмотры: 85
  • История без объемов.JPG
    История без объемов.JPG
    129,3 КБ · Просмотры: 63

Fillelin

Элитный участник
Fillelin,V papkie metatreidera "indicators" jiest obie peredielanyjie versii, piervaja versija indikatorv,kotoruju vy peredielali (TMA i T3) jiest v papkie "indicators" otkrytovo terminala,a vtoroj versii nietu...
Terminal peregruzhal nieskolko raz...dazhe restartiraval kompiuter-niepojavilis...
Posmotritie pozhalujsta,v chiom prichina ...
Spasibo vam ogromnojie


Пробуйте так:
 

Вложения

  • © TMAcentered & bands_ mtf.ex4
    35,2 КБ · Просмотры: 47
  • © T3 basic_mtf.ex4
    39,4 КБ · Просмотры: 48

volodymyr67

Гуру форума
Доброе утро. Помогите доработать советник на Белом тигре: он использует два индикатора, один - на графике, один - на осциллографе, смысл такой, что, когда сигналы на обоих индикаторах совпадают, например, они оба красные - происходит продажа, зеленые - покупка. Однако советник заключает сделки неправильно, мне кажется, что я не так прописал сигналы или условие выставления/закрытия ордеров. Помогите разобраться, подскажите что не так. Код советника ниже. Спасибо.
PHP:
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double Lots          = 0.1;
extern int    TakeProfit  = 100 ;
extern int    StopLoss     = 50 ;
extern int    Slippage      = 5;
extern string comment       = "WT BOT";
extern int    Magic         = 123;


double Sig1, Sig2, Sig3, Sig4, SL, TP;
int    ticket;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   if (Digits == 3 || Digits == 5)
   {
     TakeProfit *= 10;
     StopLoss   *= 10;
     Slippage   *= 10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{

int Signal_1,Signal_2 ;
// индикатор в осциллографе
  Sig1 = iCustom(Symbol(), 0,  "SFCC5", 3, 1); //зеленый
  Sig1 = NormalizeDouble(Sig1,Digits);
  Sig2 = iCustom(Symbol(), 0,  "SFCC5", 4, 1); //красный
  Sig2 = NormalizeDouble(Sig2,Digits);
  
  
 // индикатор на графике 
 Sig3 = iCustom(Symbol(), 0,  "SFCS5", 1, 1); //зеленый 
 Sig3 = NormalizeDouble(Sig3,Digits);
 Sig4 = iCustom(Symbol(), 0,  "SFCS5", 0, 1); //красный
 Sig4 = NormalizeDouble(Sig4,Digits);
 
 {
 if( Sig1 != EMPTY_VALUE && Sig2 == EMPTY_VALUE)Signal_1=1;//зеленый
 if( Sig1 == EMPTY_VALUE && Sig2!= EMPTY_VALUE)Signal_1=2;//красный
 if( Sig3 != EMPTY_VALUE && Sig4 == EMPTY_VALUE)Signal_2=1;//зеленый
 if( Sig3 == EMPTY_VALUE && Sig4 != EMPTY_VALUE)Signal_2=2;//красный
  }
  if((Signal_1 ==1 && Signal_2 == 1) && (CountSell() > 0)) //зеленый и есть ордера на продажу. то закрываем
  {
      for (int i = OrdersTotal ()-1; i >=0; i--)
      {
        if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true)
        {
          if (OrderMagicNumber () == Magic && OrderType() == OP_SELL )
              OrderClose (OrderTicket(), OrderLots (), Ask, Slippage, Black);
        }
        
      } 
      
     }   
  
  
  
  if((Signal_1 == 2 && Signal_2 == 2) && (CountBuy() > 0))//красный и есть ордера на покупку. то закрываем

   {
      for (i = OrdersTotal ()-1; i >=0; i--)
      {
        if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true)
        {
          if (OrderMagicNumber () == Magic && OrderType() == OP_BUY )
              OrderClose (OrderTicket(), OrderLots (), Bid, Slippage, Black);
        }
        
      } 
      
     }
   if((Signal_1 == 1 && Signal_2 == 1) && (CountBuy() == 0))//зеленый и нет ордера на покупку. то открываем
    {
      SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
      TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
      
       ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
      if (ticket > 0) 
      {
       if( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
         OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);
      }  
  }
    
  if((Signal_1 == 2 && Signal_2 == 2) &&( CountSell() == 0))//красный и нет ордера на продажу. то открываем
  {
      SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
      TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
      
      ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
      if (ticket > 0) 
      {
       if( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
         OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);
      }
  }
         

   return(0);
}
//+------------------------------------------------------------------+
int CountSell ()
{
  int count = 0;
  for (int trade = OrdersTotal()-1; trade >= 0; trade--)
  {
   OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic)
   {
      if (OrderType () == OP_SELL)
      count++;
  }
 }
 return(count);
}
//+------------------------------------------------------------------+

int CountBuy ()
{
  int count = 0;
  for (int trade = OrdersTotal()-1; trade >= 0; trade--)
  {
   OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic)
   {
      if (OrderType () == OP_BUY)
      count++;
  }
 }
 return(count);
}
//+------------------------------------------------------------------+]

А ИНДЮКИ ГДЕ ?
 

viktor 12345

Местный знаток
Подскажите как в своём терминале запустить счёт если известны IP адреса торговых серверов для работы? В каком файле терминала прописывать ip адрес торгового сервера?
 

NSerega

Администратор
Подскажите как в своём терминале запустить счёт если известны IP адреса торговых серверов для работы? В каком файле терминала прописывать ip адрес торгового сервера?

А зачем в файл прописывать? В самом терминале заходите в "Сервис" -> "Настройки", выбираете вкладку "Сервер" и в строку "Сервер:" вбиваете ip адрес, ниже логин и пароль и "Ок".
 

SYSTEMOFF

Интересующийся
Индюки вот
 

Вложения

  • SFCC5.mq4
    6 КБ · Просмотры: 42
  • SFCS5.mq4
    1,8 КБ · Просмотры: 44

vlad_123

Местный знаток
Для дорабатывающих/перерабатывающих советников под новые билды терминала - только что столкнулся с неожиданным "подарком" компилятора, который стал гораздо умнее... ;)
Итак, в советнике есть цикл, пробегающий по всем открытым ордерам и закрывающий часть из них (например, OP_BUY) при определенном условии и использующий bool флаг, указывающий - была ли закрыта хоть одна позиция. Логика цикла представлена ниже:
Код:
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
 OrderSelect(i,...);
 flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
}
В старых билдах компилятор генерил код, который вызывал OrderClose() для всех ордеров, выбранных в OrderSelect().
В новых билдах (у меня - 670й) - OrderClose() срабатывал только один раз. Затем компилятор смотрел - ага, flOrderWasClose уже равна true, и дальше уже не изменится, значит OrderClose() можно не вызывать. :)

Я долго не мог понять, почему не закрываются все ордера при срабатывании условия, пока не вспомнил Webinar по Java, где чувак рассказывал про то, что тамошний runtime-оптимизатор тоже может выбрасывать часть кода, результат работы которого в дальнейшем не используется.

Так что - будьте внимательны! Новый компилер может быть хитрее, чем вы думаете :laugh:

P.S. А тот код, который выше, я переписал так:
Код:
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
 OrderSelect(i,...);
 if (!flOrderWasClose) flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
 else OrderClose(OrderTicket(),...);
}
и это работает, как надо.
 

AlexeyVik

Программист mql4 mql5
Для дорабатывающих/перерабатывающих советников под новые билды терминала - только что столкнулся с неожиданным "подарком" компилятора, который стал гораздо умнее... ;)
Итак, в советнике есть цикл, пробегающий по всем открытым ордерам и закрывающий часть из них (например, OP_BUY) при определенном условии и использующий bool флаг, указывающий - была ли закрыта хоть одна позиция. Логика цикла представлена ниже:
Код:
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
 OrderSelect(i,...);
 flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
}
В старых билдах компилятор генерил код, который вызывал OrderClose() для всех ордеров, выбранных в OrderSelect().
В новых билдах (у меня - 670й) - OrderClose() срабатывал только один раз. Затем компилятор смотрел - ага, flOrderWasClose уже равна true, и дальше уже не изменится, значит OrderClose() можно не вызывать. :)

Я долго не мог понять, почему не закрываются все ордера при срабатывании условия, пока не вспомнил Webinar по Java, где чувак рассказывал про то, что тамошний runtime-оптимизатор тоже может выбрасывать часть кода, результат работы которого в дальнейшем не используется.

Так что - будьте внимательны! Новый компилер может быть хитрее, чем вы думаете :laugh:

P.S. А тот код, который выше, я переписал так:
Код:
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
 OrderSelect(i,...);
 if (!flOrderWasClose) flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
 else OrderClose(OrderTicket(),...);
}
и это работает, как надо.
Попробуй лучше такой оператор _http://docs.mql4.com/ru/basis/operators/ternary здесь использовать. Думаю тебе понравится.
 

vlad_123

Местный знаток
Попробуй лучше такой оператор _http://docs.mql4.com/ru/basis/operators/ternary здесь использовать. Думаю тебе понравится.
Не представляю, как этот оператор здесь можно использовать...
Функция OrderClose должна выполняться в любом случае...
Я, наверное, сильно упростил код - вместо OrderClose() на самом деле вызывается самописная функция, возвращающая true, если ордер был закрыт, но которая может ордер и не закрыть.
Эта самописная функция должна вызываться в любом случае, для каждого ордера.

P.S. А, теперь понял... ;-)
 
Последнее редактирование:

vlad_vl

Прохожий
Советник breakdownlevelday

Здравствуйте тестировал на валюте GBPUSD,постоянно сливает,решил попробовать поменять ордера на buylimit и selllimit, в итоге советник получился сливным на 87%.Может у кого есть идеи как его развернуть,т.е. сделать на 87 % прибыльным TP и SL 50 пунктов

Посмотреть вложение StrategyTesterGBPUSD.rar
 
Статус
Закрыто для дальнейших ответов.
Верх