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

 
Alexey Belyakov:

Вставил. Ды не. Открывает пачками. Мagic - игнорирует



Когда пишите код, переводите его логику на русский. У Вас сперва идет некий цикл, в котором происходят сравнения, если выбранный ордер не является рыночным то к следующей итерации, если инструмент не евробакс то к следующей итерации и если магик не равен Вашему магику то к следующей итерации.  а если условие выполняется ,то далее. В конце цикла вы считаете количество пройденных до конца циклов. Цикл заканчивается и программа приступает к открытию ордеров по условиям. С учетом того, что одно из условий всегда истинно, происходит открытие ордера. И это на каждом тике.

 
Valeriy Yastremskiy:

Когда пишите код, переводите его логику на русский. У Вас сперва идет некий цикл, в котором происходят сравнения, если выбранный ордер не является рыночным то к следующей итерации, если инструмент не евробакс то к следующей итерации и если магик не равен Вашему магику то к следующей итерации.  а если условие выполняется ,то далее. В конце цикла вы считаете количество пройденных до конца циклов. Цикл заканчивается и программа приступает к открытию ордеров по условиям. С учетом того, что одно из условий всегда истинно, происходит открытие ордера. И это на каждом тике.

   Я понимаю. Но в этом случае:   if(OrderMagicNumber() == MagicNumber)continue;    Ордера, которые выставленные принимаются за ордера выставленные Magic(ом).  То есть ордер выставленный вручную по евробаксу, должен игнориться, и открываться ещё один экспертом с магиком.

OrdersTotal() - вот эта зараза, ставит точку в любых манипуляциях с магиком.
 
Alexey Belyakov:

   Я понимаю. Но в этом случае:   if(OrderMagicNumber() == MagicNumber)continue;    Ордера, которые выставленные принимаются за ордера выставленные Magic(ом).  То есть ордер выставленный вручную по евробаксу, должен игнориться, и открываться ещё один экспертом с магиком.

OrdersTotal() - вот эта зараза, ставит точку в любых манипуляциях с магиком.

Код выполняется сверху вниз. в цикле по правилам цикла. После цикла у Вас выставление ордеров.   if(OrderMagicNumber() == MagicNumber)continue; Прервет исполнение тела цикла и начнется новая итерация цикла.  И все. Цикл закончится и начнется выставление ордеров. Это так у Вас написано. И общее количество ордеров здесь не при чем. Если Вы хотите сделать условие, что если нет выставленных ордеров с вашим магик и инструментом, то тогда выставить ордер Код должен быть другим.

Цикл по номерам ордеров. Если нашелся ордер с нашим магик и на нашем инструменте, то ретурн - выход из старт. Или флаг, что Ваш ордер есть и в начале онтик или старт проверку по флагу.

И лучше советник создавать из шаблона создать советник скрипт, индикатор. Основные поля кода будут более правильными.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
          

             
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1])&&(n==0))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}
 
Valeriy Yastremskiy:

Код выполняется сверху вниз. в цикле по правилам цикла. После цикла у Вас выставление ордеров.   if(OrderMagicNumber() == MagicNumber)continue; Прервет исполнение тела цикла и начнется новая итерация цикла.  И все. Цикл закончится и начнется выставление ордеров. Это так у Вас написано. И общее количество ордеров здесь не при чем. Если Вы хотите сделать условие, что если нет выставленных ордеров с вашим магик и инструментом, то тогда выставить ордер Код должен быть другим.

Цикл по номерам ордеров. Если нашелся ордер с нашим магик и на нашем инструменте, то ретурн - выход из старт. Или флаг, что Ваш ордер есть и в начале онтик или старт проверку по флагу.

И лучше советник создавать из шаблона создать советник скрипт, индикатор. Основные поля кода будут более правильными.

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Это я так понял не решение, а в каком направлении работать?

Я уже пару дестяков варинтов испробывал. Либо открывает один ордер, либо без перерыва, туевукучу.

Тут кстати перео OrderSekect - переменную типа bool надо поставить, а то ругается

 
Alexey Belyakov:

Это я так понял не решение, а в каком направлении работать?

Я уже пару дестяков варинтов испробывал. Либо открывает один ордер, либо без перерыва, туевукучу.

Тут кстати перео OrderSekect - переменную типа bool надо поставить, а то ругается

Да, ругаться должен, возвращает в никуда 

for(int i = OrdersTotal(); i >= 0; i--) 
{
     bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Лучше напишите алгоритм, какой хотите сделать. так непонятно что нужно.

 
Alexey Belyakov:

Это я так понял не решение, а в каком направлении работать?

Я уже пару дестяков варинтов испробывал. Либо открывает один ордер, либо без перерыва, туевукучу.

Тут кстати перео OrderSekect - переменную типа bool надо поставить, а то ругается

вместо return(0) по смыслу должно быть continue

 

Люди добрые и знающие! Помогите реализовать индикатор Envelopes в советнике MT5. Сам советник должен обрабатывать каждый тик (без пропусков). Я пробовал несколько вариантов, смотрел в документации, там понравился вариант вроде бы, но он для обработчика OnCalculate. Со стандартной библиотекой еще не пробовал возиться ... Вообщем вот такая у меня начальная реализация:

input int       Indicatorperiod         = 3;
input double    EnvelopesDeviation      = 0.07;
int    handle;                                          //--- переменная для хранения хэндла индикатора iEnvelopes
double upperEnv[3], lowerEnv[3];                        // динамические массивы для хранения численных значений Emvelopes
double local_envelopesupper, local_envelopeslower;      // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...

int OnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...

void OnTick()
...
//--- Объявляем структуру, которая будут использоваться
   MqlRates mrate[3];           // Будет содержать цены, объемы и спред для каждого бара
   ArraySetAsSeries(mrate, true); 

      //--- Получить исторические данные последних 3-х баров
      if(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
        {
         Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
         return;
        }

      //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы
      if(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
        {
         Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
         return;
        }
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...

В визуальном тестере получаю:


Подскажите, в чем ошибка и как лучше сделать?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Некорректное отображение индикатора
 
Valeriy Yastremskiy:

Да, ругаться должен, возвращает в никуда 

Лучше напишите алгоритм, какой хотите сделать. так непонятно что нужно.

В первом собщении код. Всё просто: пробиваем предыдущий high/low - открывваем сделку. Нужно чтобы открываемые ордера этим советником не пересекались с другими ордерами открытыми вручную, или другим советником, т.е чтобы советник работал независимо.

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

 
Alexey Belyakov:

В первом собщении код. Всё просто: пробиваем предыдущий high/low - открывваем сделку. Нужно чтобы открываемые ордера этим советником не пересекались с другими ордерами открытыми вручную, или другим советником, т.е чтобы советник работал независимо.

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

Полностью работу советника опишите пошагово. Первый шаг проверяем есть ли ордера с нашим магик на выбранном инструменте. Если есть, то заканчиваем работу, если нет то выставлем ордера. После выставлкния ордеров что? Как то так
 
Maxim Kuznetsov:

вместо return(0) по смыслу должно быть continue

Там если равно, поэтому дальше не идём и завершаем.. Мне не нравится если не равно то проходим дальше. Сложнее в понимании.