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

 
yaaarik777:

Добрый вечер!

П‌омогите пожалуйста написать код, сам чувствую не справлюсь, суть такая:


Суть в следующем: тут в этой ветке помогают страждущим и ищущим.
Если нужно чтобы сделали за вас - то это во фриланс. А чтобы помогли надо рассказать что хотели получить, показать что делали и описать что не получилось.
 
Maxim Kuznetsov:
Суть в следующем: тут в этой ветке помогают страждущим и ищущим.
Если нужно чтобы сделали за вас - то это во фриланс. А чтобы помогли надо рассказать что хотели получить, показать что делали и описать что не получилось.


суть в том что я не понимаю как сделать так, чтобы советник считал только ордера одной конкретной пары, а не суммарно всех пар на терминале.

е‌сли можно, подкиньте идею или пример кода, т.к. в учебниках описывается по отдельности что и как работает, а конкретных примеров не много.

буду благодарен за помощь.

спасибо.

 
Здравствуйте.
Эх,давно не брал я в руки шашек. а когда взял снова, то оказалось что 

играть я разучился.
Прошу помощи.
Есть старый добрый советник который использует индикатор ЗигЗаг от Rosh
и работает четко как швейцарские часы.
Его прикрепил Код чтобы не скачивать советник привожу внизу текста.

Идея советника была в том что ордера открываются и закрываются в момент 

совпадения разных ЗигЗагов.
Сейчас мне понадобилось заменить индикатор от Rosh на другой 

индикатор,тоже одна из первых версий ЗигЗаг ещё со времён МТ3.
Но у этого индикатора другой алгоритм рисования Зигзага.

Её я прикрепил тоже.Название индикатора High_Low v2 (ZigZag),(во вложении почему то название глюкнуло)

Методом тыка,который иногда срабатывал, я просто заменил  условия 
   double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
   double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
на
   double zz1 = iCustom( NULL, 0, "High_Low v2 (ZigZag)",300, 6, 0, 0);

   double zz2 = iCustom( NULL, 0, "High_Low v2 (ZigZag)",300, 6, 0, 0);

‌То есть заменил название одного пользовательского индикатора и его

параметры на  другой.В случае с фракталами,допустим, у меня это 

проходило.
Параметры поставил одинаковые, потому что не нужно совпадение двух 

Зигзагов, а нужен лишь факт его изменения.
Цифру 60 заменил на 0 для работы на всех ТФ.

После замены советник скомпилировался без ошибок,но при установке на 

график работать категорически не хочет.Мало того, он и в тестере тестится 

не желает.

Вопрос - что не так?
И другой вопрос-как правильно?
Спасибо,извините за большой текст.


//+------------------------------------------------------------------+
//|                                                           ZZ.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#include <stdlib.mqh>

#define MAGIC  20110220

extern double TakeProfit = 50;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int pos=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)  pos++;
        }
     }
//---- return orders volume
   if(pos>0) return(pos);
    }  
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   int    res;

//---- get ZZ 
   double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
   double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
   
//---- buy conditions
   if(CompareDoubles(zz1,Low[0]) && CompareDoubles(zz2,Low[0]))  
     {
      

res=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,Ask+TakeProfit*Point,"",MAGIC,0,Bl

ue);
      return;
     }   
//---- sell conditions
   if(CompareDoubles(zz1,High[0]) && CompareDoubles(zz2,High[0]))   
     {
      

res=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,Bid-TakeProfit*Point,"",MAGIC,0,Re

d);
      return;
     }

//----
  } 
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
//---- get ZZ 
   double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
   double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(CompareDoubles(zz1,High[0]) && CompareDoubles(zz2,High[0])) 

OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(CompareDoubles(zz1,Low[0]) && CompareDoubles(zz2,Low[0]))  

OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+













MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Торговая платформа MetaTrader 5 - это бесплатный инструмент трейдера, позволяющий торговать на форексе и фондовых биржах.
Файлы:
 
yaaarik777:


суть в том что я не понимаю как сделать так, чтобы советник считал только ордера одной конкретной пары, а не суммарно всех пар на терминале.

е‌сли можно, подкиньте идею или пример кода, т.к. в учебниках описывается по отдельности что и как работает, а конкретных примеров не много.

буду благодарен за помощь.

спасибо.

не стесняйтесь подглядывать в CodeBase - цикл перебора ордеров есть в каждом советнике :-)

к примеру https://www.mql5.com/ru/code/16588 (первое что попалось)

  for(int index = orders-1; index >= 0; index--)
      {
      if(OrderSelect(index,SELECT_BY_POS,MODE_HISTORY)==false)
         {
         Print("Error in history!");
         break;
         }
      if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)
         {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
            if(OrderProfit()>0) break;
            if(OrderProfit()<0) losses++;
            }
         }
      }

‌условие "if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)" как раз и отбирает ордера по конкретному символу и с конкретным MAGIC

PS/ в приведённом copy-paste коде ‌break в случае ошибки OrderSelect не вполне корректен, правильнее ставить continue (мало-ли отчего ордер не выбрался, может с каким внутренним механизмом МТ проблема, следующий зато не будет пропущен)

Middle Moving Average
Middle Moving Average
  • голосов: 6
  • 2016.10.18
  • Dmitriy Kudryashov
  • www.mql5.com
Вариант советника, основанного на среднем значении цены для расчета Moving Average.
 
Maxim Kuznetsov:

не стесняйтесь подглядывать в CodeBase - цикл перебора ордеров есть в каждом советнике :-)

к примеру https://www.mql5.com/ru/code/16588 (первое что попалось)

Он не только есть в кодебазе, он есть в одной из двух веток на форуме, важно начать искать, и их будет более сотни в разных интерпретациях.
 
Спасибо, буду побывать 
 

Здравствуйте ребята!!! помогите написать функцию,которая бы возвращала торговый сигнал или на покупку или на продажу. Не умею ещё работать с барами  в MQL( хотя я много что не умею!).

у‌словие такое: Материнский бар -  это бар внутри которого, а именно внутри хая и лоя находятся бары с ценой закрытия (это важно!!! именно цена закрытия.).Как только какой нибуть бар пробивает Материнский и закрыкается выше хая или ниже лоя, то теперь этот бар становится материнским баром!

Е‌сли у материнского бара цена закрытия выше цены открытия, то возвращаем сигнал на покупку.

‌Е‌сли у материнского бара цена закрытия ниже цены открытия, то возвращаем сигнал на продажу.

о‌чень важно выставление таймфрема во внешней переменной.

 ‌    Но вот теперь загвоздка для меня по крайней мере - как найти эксперту на графике последний мат. бар???Да, визуально я его  сразу вижу!....

‌Мне было бы удобно во внешне переменной указать индекс  последнего Материнского бара  и тогда функция  начнёт от него плясать ,  или вариант другой  взять бар с индексом например 50 и в цикле перебрать  до нулевого.

 ‌ Очень прошу помогите сироте!!!

 

Добрый день!

Подскажите идею. Нужно чтобы советник не мог открыть ордер если по такой цене ордер уже открыт. Как реализовать проверку?

 
Kot:

Добрый день!

Подскажите идею. Нужно чтобы советник не мог открыть ордер если по такой цене ордер уже открыт. Как реализовать проверку?

Сложная задача. От безвыходности, учитывая проскальзывания я назначал магик ордерам желаемая_цены/_Point

В mql5 проще, там есть позиция с ценой не соответствующей заявленной и есть ордер с запрошенной ценой.

 
Kot:

Добрый день!

Подскажите идею. Нужно чтобы советник не мог открыть ордер если по такой цене ордер уже открыт. Как реализовать проверку?


Пишете цикл перебора ордеров, в котором сравниваете цену открытия каждого ордера с заданным значением цены, если есть совпадение - флаг нового ордера не поднимать.
Причина обращения: