[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 470

 
tol64:

А как оптимизируете параметры мультивалютника? В тестере MT4 ведь нет возможности сразу несколько инструментов тестировать... Я думаю над мультивалютником и пока пришёл к тому, что параметры оптимизируются на каждом инструменте по отдельности, а для торговли потом все эти параметры переносить в эксперт, который предназначен для мультивалютного режима.

Я в правильном направлении двигаюсь или всё проще на самом деле?)))

В mql5 это всё можно реализовать в одном эксперте сразу и для тестов и для торговли, но я пока решил mql4 изучить.

Просто размышляя на эту тему я подумал, если нельзя протестировать несколько инструментов сразу, зачем тогда в один эксперт всё городить, если можно на каждый график инструмента просто установить свою копию и будет тоже самое. Хотелось бы услышать мнения членов сообщества.)))

У меня не мультивалютник, я просто на каждый инструмент вешаю один и тот же советник.
 
Извините, не понял ответ
 
demlin:
Извините, не понял ответ

Смотри поиском по запросу через гугл: "как правильно оптимизировать советника site:mql4.com", также - здесь.

Рекомендую грамотную книжку по этому же вопросу: Ральф Винс "Разработка, тестирование и оптимизация торговых систем для биржевого трейдера" - все подробно, по полочкам и понятно.

 

Задача: на рисунке показана некая кривая (например МА). Точки A,C,E - это локальные максимумы, а точки B,D - это локальные минимумы. Вопрос: как их вычислить, если расстояние между соседними максимумом и минимумом больше, чем N пунктов? Попыталась сделать, но как-то уж слишком громоздко все получается. Может есть готовый алгоритм решения подобной задачи? Подскажите, если кто сталкивался

 
Elenn:

Задача: на рисунке показана некая кривая (например МА). Точки A,C,E - это локальные максимумы, а точки B,D - это локальные минимумы. Вопрос: как их вычислить, если расстояние между соседними максимумом и минимумом больше, чем N пунктов? Попыталась сделать, но как-то уж слишком громоздко все получается. Может есть готовый алгоритм решения подобной задачи? Подскажите, если кто сталкивался


Определяем направление скользящей.

Если оно вверх и при этом переемнные В,C,D и E пустые, то вносим в переменную А текущее значение скользящей.

Если Переменная А не пустая и при этом скользящая направлена вниз, и при этом переменные С,D,E пустые, то в переменную В вносим текущее значение скользящей. Если переменная А и переменная B не пустые и при этом скользящая направлена вверх и при этом переменные D и Е - пустые, то в переменную С вносим текущее значение скользящей.

Ну и так далее заполняем значения переменных значениями.

Теперь если переменная А и С не пустые и при этом модуль разности между А и С более или равен заранее заданному количеству пунктов, то выполняется задуманное Вами действие.

Вобщем, код сделать вполне можно. Только нужно определить, в какой именно точке алгоритма мы будем обнулять переменные чтоб советник понял, что он пришёл в точку нового старта. Можно через цикл и массивы сделать и вполне возможно, что код окажется короче и проще, но для понимания лучше рассмотреть алегоритм именно через переменные - ну просто чтоб не путаться в индексах массивив и в номерах свеч в цикле.

 

Ребята, недавно, столкнулся с данным вопросом. Кто в теме - прокомментируйте. Сам - благо быстро нашел ошибку... При написании кода - все компилится без ошибок, при этом не работает трал... т.е. не идем дальше по циклу перебора ордеров... Участки кода - привожу... Ошибка была в следующем - во внешних переменных магик ордера был задан с большой буквы, а в условиях перебора ордеров в цикле - с маленькой, при этом поиск через CTRL+F - на запрос "Мagic" переходил и на "magic"...компилятор ошибки не выдавал, но в цикле до перехода на вид трала исполнение программы не доходило... цикл прерывался на "magic"... Вообще, так и должно быть??? Я всегда считал, что "magic" и "Magic" - это разные переменные... и, следовательно, компилятор должен был указать на эту ошибку, что переменная "magic" - не определена... В коде, в таком виде, как сейчас исполнение до выбора трала и Printa () уже не доходит - выход из цикла по этому условию - из-за magic - т.е. это условие - никогда выполнено не будет, из-за различных имен - "magic" и "Magic".

if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

// глоб переменные
...
...
extern int  Magic = 10;     // MagicNumber

//----------------------------------------------------------------------------
int start()                            // Спец. функция start
  {
  
   
   int orderCount = 0; 
  
   //---------------------------ТРАЛ ОРДЕРОВ---------------------------------------------------------------------------------------
   int orderType;
    for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
    {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))
      {
         continue;
      }
                ticket = OrderTicket( );                         // Номер ордера
       double   orderLots = OrderLots();                         // Lots   
       double   orderProfit = OrderProfit() + OrderSwap();       // Profit
       double   Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
       double   SL =  OrderStopLoss();                           // Значение StopLoss ордера
       double   TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
                 
         
      orderCount++;                     // считаем ордера (не больше 10)
     
            
       while (!IsTradeAllowed() || !IsConnected()) Sleep(5000); RefreshRates();
       
      //----------------------------Тралим последовательно все наши ордера по виду трала------------------
      if (UseTrailing && orderCount > 0 && type ==0)   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook (1);          // если селл
          }      
      ...
      ...
      ...   
     Print( "Эксперт база: Всего наших ордеров = " ,orderCount);
     }   
//--------------------------------------------------------------------------------------------------------------------------------------     
   
   
  
//----------------------------------------------------------------  
   return;                             // Выход из start()
  }

П.С. Кто не в курсе - знайте об этом, иначе возможно не понятно сколько провозекаться с кодом...

 
Roman.:

Ребята, недавно, столкнулся с данным вопросом. Кто в теме - прокомментируйте. Сам - благо быстро нашел ошибку... При написании кода - все компилится без ошибок, при этом не работает трал... т.е. не идем дальше по циклу перебора ордеров... Участки кода - привожу... Ошибка была в следующем - во внешних переменных магик ордера был задан с большой буквы, а в условиях перебора ордеров в цикле - с маленькой, при этом поиск через CTRL+F - на запрос "Мagic" переходил и на "magic"...компилятор ошибки не выдавал, но в цикле до перехода на вид трала исполнение программы не доходило... цикл прерывался на "magic"... Вообще, так и должно быть??? Я всегда считал, что "magic" и "Magic" - это разные переменные... и, следовательно, компилятор должен был указать на эту ошибку, что переменная "magic" - не определена... В коде, в таком виде, как сейчас исполнение до выбора трала и Printa () уже не доходит - выход из цикла по этому условию - из-за magic - т.е. это условие - никогда выполнено не будет, из-за различных имен - "magic" и "Magic".

П.С. Кто не в курсе - знайте об этом, иначе возможно не понятно сколько провозекаться с кодом...


У меня если объявлена Magic, а орбащение идет к magic, то компилятор пишет, что переменная magic не объявлена.

MetaEditor 4 401.

 
Roman.:

Ребята, недавно, столкнулся с данным вопросом. Кто в теме - прокомментируйте. Сам - благо быстро нашел ошибку... При написании кода - все компилится без ошибок, при этом не работает трал... т.е. не идем дальше по циклу перебора ордеров... Участки кода - привожу... Ошибка была в следующем - во внешних переменных магик ордера был задан с большой буквы, а в условиях перебора ордеров в цикле - с маленькой, при этом поиск через CTRL+F - на запрос "Мagic" переходил и на "magic"...компилятор ошибки не выдавал, но в цикле до перехода на вид трала исполнение программы не доходило... цикл прерывался на "magic"... Вообще, так и должно быть??? Я всегда считал, что "magic" и "Magic" - это разные переменные... и, следовательно, компилятор должен был указать на эту ошибку, что переменная "magic" - не определена... В коде, в таком виде, как сейчас исполнение до выбора трала и Printa () уже не доходит - выход из цикла по этому условию - из-за magic - т.е. это условие - никогда выполнено не будет, из-за различных имен - "magic" и "Magic".

П.С. Кто не в курсе - знайте об этом, иначе возможно не понятно сколько провозекаться с кодом...

Сравните с моим простейшим тралом. В частности цикл перебора ордеров:

   // В глоб. переменных
   string sy=Symbol();
   // ...................................................................
   color  cl;
   double sl, StopLevel;
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=sy)           continue;
         if (OrderMagicNumber()!=Magic)   continue;
         if (OrderType()>1)               continue;
         sl=OrderStopLoss();
         if (OrderType()==OP_BUY) {
            cl=clModifyBuy;
            StopLevel=NormalizeDouble(strG-DeltaStop*PointX, dg);
            if (sl<StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         if (OrderType()==OP_SELL) {
            cl=clModifySell;
            StopLevel=NormalizeDouble(strR+DeltaStop*PointX, dg);
            if (sl>StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         }
      }

Думаю принцип ясен будет.

А переменные magic и Magic - действительно разные. Во время поиска их по Ctrl+F поставьте галочку "Учитывать регистр"

Где-то в коде вы всё-таки объявили их обе

 
artmedia70:

А переменные magic и Magic - действительно разные. Во время поиска их по Ctrl+F поставьте галочку "Учитывать регистр"

Где-то в коде вы всё-таки объявили их обе

Точно. Только благодаря Вам нашел... :-))) Внизу инклюда Variables дополнительно к переменной extern int Magic = 10; былa мной объявлена переменная -
int magic = 12345;

:-)))

Получалось, в ф-ии открытия ордеров я учитывал - Magic, а в цикле - magic, поэтому цикл перебора ордеров для их трала и не работал...:-)))

От души благодарю Вас - разобрался с вопросом. Галочку "Учитывать регистр" - поставил - все работает исправно.

П.С. От как бывает-то!!!... (Когда пруха по коду идет - готов и не только по нескольку маджиков объявлять...:-))))

 
artmedia70:

Сравните с моим простейшим тралом. В частности цикл перебора ордеров:

Думаю принцип ясен будет.

Благодарю за вариант трала. Принцип ясен.