Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 846

 
erotin:

¿Puede decirme qué pasa con el racionamiento del lote?

Todo está mal. Lea el artículo "Qué controles debe pasar un EA...". Ahí hay una función preparada.

 

Hecho, hice una plantilla vacía, preparé todo lo necesario para la función iCustom().

Pongo el indicador iCrossAD que me interesa en la función.

La función funciona, encuentra los índices de las flechas exteriores de subida y bajada correctamente, pero los valores de los precios a los que se fijaron estas flechas son erróneos.

El código es corto, así que lo pondré aquí, adjuntaré archivos de este asesor e indicador por si acaso.

//+------------------------------------------------------------------+
//|                                             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();
  }
Archivos adjuntos:
iCrossAD.mq5  49 kb
 

Este es el aspecto de las entradas de registro en la pestaña "Expertos"

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 es el aspecto de las entradas de registro en la pestaña "Expertos"

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

En lugar del precio al que se crearon las flechas = -11211905,17483469



 

Sergey Voytsekhovsky:

...

En lugar de los precios a los que se crearon las flechas = -11211905.17483469

Pulse Ctrl+D, mueva el ratón por las líneas del indicador y vea en la ventana de datos qué valores tienen sus topes.

 
Artyom Trishkin:

Pulsa Ctrl+D, arrastra el ratón a lo largo de las líneas del indicador y mira en la ventana de datos para ver qué valores tienen sus topes.

Si te he entendido bien, ¿buscaba un gato en la habitación que no está? La matriz no se llenó con los precios, sino con los valores del indicador en ese momento? Gracias, me lo replantearé.

Una última pregunta - el compilador me da 2 advertencias


signo de desajuste Test_iCustom.mq5 79 20

signo de desajuste Test_iCustom.mq5 92 20


No puedo entender su razón, por favor dígame. ¿Qué significa "sign mismatch" (traductor Yandex)?


 
Sergey Voytsekhovsky:

Si te he entendido bien, ¿buscaba un gato en la habitación que no está? La matriz no se llenó con los precios, sino con los valores del indicador en ese momento? Gracias, me lo replantearé.

Una última pregunta - el compilador me da 2 advertencias


signo de desajuste Test_iCustom.mq5 79 20

signo de desajuste Test_iCustom.mq5 92 20


No puedo entender su razón, por favor dígame. ¿Qué significa "falta de coincidencia de signos" (traductor Yandex)?


Puede que estés perdiendo un signo de número. Muestra estas líneas de código.

 
Artyom Trishkin:

Puede que estés perdiendo un signo de número. Muestra estas líneas de código.

for(n=0; n<period_find; n++)
La segunda es exactamente igual (bucles para encontrar valores distintos de cero en las matrices de Arrows).
 
Sergey Voytsekhovsky:
La segunda es exactamente igual (bucles para encontrar valores distintos de cero en las matrices "Flechas").

¿Cuáles son los tipos de variables n y period_find ? Lo más importante que no mostraron...

Pruébalo:

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

¿Por qué se declara una variable de bucle a nivel del manejador OnTick()?

Puedes hacerlo así:

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

Puedes eliminar la declaración n de OnTick() - no la necesitamos allí.

 
Artyom Trishkin:

¿Cuáles son los tipos de variables n y period_find? Lo más importante y no mostrado...

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;
Razón de la queja: