Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1358

 

MakarFX , qual é a função a que se vincula: qual é a sua função?


input int BarTrade = 5; // Entendo que este é o número dos períodos rastreados de 5.

int TimeBarTrade=BarTrade*Periodo()*60; // como posso entender? Por que é multiplicado por 60?

 
Alexey Belyakov:

MakarFX , qual é a função a que se vincula: qual é a sua função?


input int BarTrade = 5; // Entendo que este é o número dos períodos rastreados de 5.

int TimeBarTrade=BarTrade*Periodo()*60; // como entendemos? Por que ele é multiplicado por 60?

BarTrade*Periodo()*60

número de barras * período de tempo atual * 60 segundos

ou seja, quantidade de barras convertida em segundos

 
MakarFX:

BarTrade*Periodo()*60

número de barras * período de tempo atual * 60 segundos

ou seja, número de barras convertido em segundos

Você pode fazer desta maneira.

int TimeBarTrade = PeriodSeconds()*BarTrade;
 
MakarFX:

Se você excluir erros relacionados a

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

então as corujas não estarão atingindo o servidor.

Makar, muito obrigado por indicar que verificações precisam ser feitas para evitar angustiar o servidor e proibir o EAJ.

Verificações feitas desta forma

mod nível de parada para parada

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL);//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }

mod stop nível para lucro

      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL);// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         


Verificar a autorização de comércio

//---- ПРОВЕРКА НА РАЗРЕШЕНИЕ ТОРГОВ ПЕРЕД ОТКРЫТИЕМ ОРДЕРОВ
   if(MarketInfo(Symbol(),MODE_TRADEALLOWED)==true)
   {// начало есл торговля разрешена
  /*
куча проверок на условия открытия и само открытие ордеров
*/
} // КОЕНЦ ПРОВЕРКИ НА РАЗРЕШЕНИЕ ТОРГОВЛИ
          
          else //ИНАЧЕ ЕСЛИ ТОРГОВЛЯ НЕ РАЗРЕШЕНА 
          
          { // НАЧАЛО ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ 
          
          Print("ТОРГИ НЕ РАЗРЕШЕНЫ- ПЫТАТЬСЯ ОТКРЫТЬ ОРДЕРА НЕ БУДЕМ");
          }  // КОЕНЦ ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ

Verificação de lote máximo e mínimo

Primeiro obtive valores máximos de lote e mínimos de lote nas variáveis como esta

  double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);   // МИНИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);     // МАКСИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ

E então em algum lugar abaixo, enquanto escrevo o Graal, eu verifico

  if(lot<Min_Lot) lot=Min_Lot; //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ МЕНЬШЕ ЧЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ЛОТ ПРИСВАЕМАЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА
if(lot>Max_Lot) lot=Max_Lot;  //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ БОЛЬШЕ ЧЕМ МАКСИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ОЛТ ПРИСВАЕВАЕМ МАКС ЛОТ У БРОКЕРА

Isto é correto ou estou errado?

Eu não verifiquei a mudança de etapa do lote porque o lote é calculado como uma porcentagem do depósito e aí esse valor é multiplicado por um ponto e normalizado - esse cheque pode ser omitido - certo, ou eu deveria fazê-lo de qualquer forma? Se ainda precisarmos verificar como passar este cheque?

O ponto principal de todas essas verificações é ter sempre o valor correto de parada, lucro e tamanho de lote, para que possamos geralmente começar a abrir pedidos. Se todos esses parâmetros estiverem OK, o Expert Advisor não incomodará o servidor; eu entendo isso corretamente?

 
DanilaMactep:

Muito obrigado, Makar, por me dizer que cheques fazer para evitar o servidor e proibir o EAJ.


//ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА
// ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ

Pode haver aqui um erro de 130 devido a um deslizamento.

Eu faria isso

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         
 

Olá a todos, alguém teve algum problema com pontos pendurados no gráfico encontrado através do iHighest/iLowest?

Pré-história: Tenho experiência mínima de programação, estou escrevendo um indicador em mql4 que deve mostrar os pontos no gráfico, encontrados pelas condições de se e conectá-los com linhas. Logicamente, procura os pontos corretamente, mas os desenha com um offset, depois para 2 barras, depois para 3 barras. Como posso combater isto? Também anexei o arquivo com o código.


int start()
  {
   int counted_bars=IndicatorCounted(); //хранит количество посчитанных индикатором баров. Функция IndicatorCounted() возвращает количество неизмененных баров после прошлого вызова функции start().
   int n,limit;
   int val_index;
   
  if(counted_bars>0)
      counted_bars--;
   limit=Bars-counted_bars; //количество последних баров, которые нужно пересчитать.
   if(limit>barsToProcess)
      limit=barsToProcess;

   for(n=0; n<=limit; n++)
     {
      if((Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2]) || (Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3]))
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer[n]=Low[val_index];
        }
      else
         if((Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2]) || (Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3]))
          {
            val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
            myAZBuffer[n]=High[val_index];
            ExtHighBuffer[n]=High[val_index];
           }
     }
   return (0);
  }
Arquivos anexados:
AZforum.mq4  8 kb
 
azolotta:

Olá a todos, alguém teve algum problema com pontos pendurados no gráfico encontrado através do iHighest/iLowest?

Pré-história: Tenho experiência mínima de programação, estou escrevendo um indicador em mql4 que deve mostrar os pontos no gráfico, encontrados pelas condições de se e conectá-los com linhas. Logicamente, procura os pontos corretamente, mas os desenha com um offset, depois para 2 barras, depois para 3 barras. Anexei também o arquivo com o código.


Os pontos são desenhados corretamente, sem compensação.

Se a condição for cumprida e iHighest/iLowest forem maiores ou menores que o atual High/Low

desenha


 
MakarFX:

os pontos são desenhados corretamente, sem compensação

se a condição for atendida e iHighest/iLowest for maior ou menor do que a atual High / Low

então desenha


Então, acho que estou começando a perceber meu erro) Então, para exibir visualmente esses pontos no lugar certo, preciso entrar em um contador separado em vez de n para myAZBuffer[n], ExtLowBuffer[n], ExtHighBuffer[n] ? mas como fazer isso
 
azolotta:
Então, eu acho que estou começando a perceber meu erro) Acontece que para exibir visualmente estes pontos no lugar certo, eu preciso entrar em algum contador separado em vez de n para myAZBuffer[n], ExtLowBuffer[n], ExtHighBuffer[n] ? mas como fazer isso

não, você entendeu corretamente.

a condição usa duas ou três barras da história,

é por isso que ele desenha após 2-3 barras quando a condição é preenchida

 
MakarFX:

não, você entendeu corretamente.

a condição usa duas ou três barras da história,

é por isso que ele desenha após 2-3 barras quando a condição é preenchida

OK, então como eu retrabalho o código se eu precisar, por exemplo, escolher o ponto mais alto das 3 últimas barras (que atendem às condições do if) e colocar um ponto sobre ele (bem neste ponto alto!), então também encontrar o ponto baixo.