Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1530

 
Andrey Sokolov:

Capisco, grazie. Qualcun altro ha dei suggerimenti?

Anch'io ho imparato con te.

MiddleBuffer

//+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- входные параметры
input int                  bands_period=20;           // период скользящей средней
input int                  bands_shift=0;             // сдвиг
input double               deviation=2.0;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int    handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим хэндл индикатора
   handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      //--- работа индикатора завершается досрочно
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- почистим график при удалении индикатора
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- индикаторные буферы
   double         UpperBuffer[];
   double         LowerBuffer[];
   double         MiddleBuffer[];
//--- количество копируемых значений из индикатора iBands
   int values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу
   if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
      return;
//--- сформируем сообщение
   Print("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iBands               |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[],     // индикаторный буфер средней линии Bollinger Bands
                           double &upper_values[],    // индикаторный буфер верхней границы
                           double &lower_values[],    // индикаторный буфер нижней границы
                           int shift,                 // смещение
                           int ind_handle,            // хэндл индикатора iBands
                           int amount                 // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2
   if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }
//+------------------------------------------------------------------+
 
Ragazzi, chi non è occupato e può guardare. abbozzato un EA sull'indicatore di ieri, ma qualcosa non funziona bene. Sembra che apra dei trade non basati su segnali. Ho provato ad aggiungere ordini di chiusura sul segnale opposto ma le operazioni vengono chiuse e poi no. Ho un'idea se c'è un errore nella condizione.
input int Magic = 000;
input double Lots = 0.1;
input int TakeProfit = 100;
input int StopLoss = 50;
input int Slippage = 5;

double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  /* if (Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      StopLoss *=10;
      Slippage *=10;
   }*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
           
     
      vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
      vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз
      
     //-----------------------------------------------------------
     if (CountSell() == 0 && vnuz >0)
      {
      tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
      
      ////////////////////////////////////////////////////////////////
    if (CountBuy() == 0 && vverh >0)
      {
      tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else Print("Ошибка открытия ордера на покупку");
      }  
     
      
  }
//+------------------------------------------------------------------+
int CountSell()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
         count++;
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
         count++;
      }
   }
   return(count);
}
File:
 
PapaYozh:

Basta non essere sorpresi quando smette di funzionareo funzionaa intermittenza.

Per quale motivo? Perché non scrivi cosa c'è che non va?

 
Andrey Sokolov:

Per quale motivo? Perché non dici cosa c'è che non va?

Cosa sono tutte queste molestie?

 
PapaYozh:

Come mai l'omissione di soccorso?

Capisco.

Qualcun altro può dirmi cosa c'è di sbagliato lì, e per quale motivo smetterà di funzionare se c'è davvero qualcosa di sbagliato?

 
Andrey Sokolov:

Capisco.

Forse qualcun altro può dirmi cosa c'è di sbagliato lì, e qual è la ragione per cui smette di funzionare se c'è davvero qualcosa di sbagliato?

Ecco la risposta

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione di algoritmi e codici

Igor Makanu, 2021.07.05 14:16.

perché l'indicatore non è ancora calcolato.

https://www.mql5.com/ru/docs/series/barscalculated


la sezione OnInit() non è il posto migliore per ottenere l'ambiente terminale, penso che funzioni logicamente e correttamente

 
Alexey Viktorov:
Ecco la risposta.

Grazie.

Ho bisogno che faccia i calcoli della storia immediatamente all'avvio. Lo faccio nell'inite perché mi serve così.

Ho aggiunto una pausa nell'init, prima dei calcoli. Se è così, ci sono ancora delle insidie?

 
Andrey Sokolov:

È necessario fare i calcoli sulla storia all'avvio. Lo faccio nell'inite perché mi serve così.

Ho aggiunto una pausa nell'inite, prima dei calcoli. Se è così, ci sono ancora delle insidie?

È più facile e più affidabile mettere il primo flag di avvio in OnTick()

 
jarikn:
Ragazzi, chi non è occupato e può guardare. abbozzato un EA sull'indicatore di ieri, ma qualcosa non funziona bene. Sembra che apra dei trade non basati su segnali. Ho provato ad aggiungere ordini di chiusura sul segnale opposto ma le operazioni vengono chiuse e poi no. Credo che mi manchi.
Molto probabilmente, l'indicatore disegna ... e cerca gli errori nel log
 
Andrey Sokolov:

Per quale motivo? Perché non scrivi cosa c'è che non va?

Perché gli sviluppatori hanno scritto che OnInit() è destinato all'inizializzazione, non a qualcos'altro

Cosa succederà - hai fatto una pausa per ottenere i valori dell'indicatore in OnInit() - cosa succederà se l'utente cambia il TF allo stesso tempo?

SZZY: E come si comporterebbe il tuo codice se esegui un EA, poi chiudi il terminale e riapri il terminale con un EA in esecuzione?