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

 
erotin:

Você pode me dizer o que está errado com o racionamento do lote?

Tudo está errado. Leia o artigo "O que verifica se um EA deve passar...". Há ali uma função pronta para uso.

 

Feito, fez um modelo vazio, preparou tudo que era necessário para a função iCustom().

Coloco o indicador iCrossAD que me interessa na função.

A função funciona, ela encontra os índices das setas para cima e para baixo mais externas corretamente, mas os valores de preço em que essas setas foram definidas estão errados.

O código é curto, então vou colocá-lo aqui mesmo, vou anexar os arquivos deste assessor e indicador só para o caso de.

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart08.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
input string               Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----

input uint                 InpPeriodFind           = 400;                 // Bars for calculate
input uint                 InpUnheckedBars         = 2;                   // Unchecked bars
input uint                 InpPeriodIND            = 21;                  // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

uint            period_find = InpPeriodFind;       //Number bars for calculate

int            CrossAD;                           //Хэндл индикатора iCrossAD

double         Buf_Arrow_Sell[],                  //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,            //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
               
double         Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete objects
   ObjectsDeleteAll(0,"",-1);
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int n=0;
   
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();
  }
Arquivos anexados:
iCrossAD.mq5  49 kb
 

Este é o aspecto das entradas de registro na guia "Especialistas".

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0


 
Sergey Voytsekhovsky:

Este é o aspecto das entradas de registro na guia "Especialistas".

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

Em vez do preço pelo qual as setas foram criadas = -11211905.17483469



 

Sergey Voytsekhovsky:

...

Em vez dos preços aos quais as setas foram criadas = -11211905.17483469

Pressione Ctrl+D, mova o mouse ao longo das linhas do indicador e veja na janela de dados quais os valores que seus amortecedores têm.

 
Artyom Trishkin:

Pressione Ctrl+D, arraste o mouse ao longo das linhas indicadoras e olhe na janela de dados para ver quais os valores que seus amortecedores têm.

Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.

Uma última pergunta - o compilador me dá 2 avisos


sinal de desajuste Test_iCustom.mq5 79 20

sinal de desajuste Test_iCustom.mq5 92 20


Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor de Yandex)??


 
Sergey Voytsekhovsky:

Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.

Uma última pergunta - o compilador me dá 2 avisos


sinal de desajuste Test_iCustom.mq5 79 20

sinal de desajuste Test_iCustom.mq5 92 20


Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor Yandex)?


Você pode estar perdendo um sinal de número. Mostrar estas linhas de código.

 
Artyom Trishkin:

Você pode estar perdendo um sinal de número. Mostrar estas linhas de código.

for(n=0; n<period_find; n++)
A segunda é exatamente a mesma (loops para encontrar valores não zero em setas de flechas).
 
Sergey Voytsekhovsky:
O segundo é exatamente o mesmo (loops para encontrar valores não zero em arrays "Arroys").

Quais são os tipos de variáveis n e period_find ? A coisa mais importante que eles não mostraram...

Experimente:

for(n=0; n<(int)period_find; n++)

Por que você declara uma variável de laço no nível do manipulador OnTick()?

Você pode fazer desta maneira:

for(int n=0; n<(int)period_find; n++)

Você pode remover n declaração da OnTick() - não precisamos dela lá.

 
Artyom Trishkin:

Quais são os tipos de variáveis n e period_find ? A coisa mais importante e não mostrou...

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;
Razão: