Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 846

 
erotin:

Können Sie mir sagen, was an der Rationierung des Loses falsch ist?

Alles ist falsch. Lesen Sie den Artikel "Welche Prüfungen ein EA bestehen sollte...". Dort gibt es eine vorgefertigte Funktion.

 

Erledigt, eine leere Vorlage erstellt, alles Notwendige für die Funktion iCustom() vorbereitet.

Ich habe den iCrossAD-Indikator, an dem ich interessiert bin, in die Funktion eingegeben.

Die Funktion funktioniert, sie findet die Indizes der äußersten Auf- und Abwärtspfeile korrekt, aber die Kurswerte, auf die diese Pfeile gesetzt wurden, sind falsch.

Der Code ist kurz, so werde ich es hier setzen, werde ich Dateien von diesem Berater und Indikator nur für den Fall anhängen.

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

So sehen die Protokolleinträge auf der Registerkarte "Experten" aus

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:

So sehen die Protokolleinträge auf der Registerkarte "Experten" aus

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

Statt des Preises, zu dem die Pfeile erstellt wurden = -11211905.17483469



 

Sergey Voytsekhovsky:

...

Statt der Preise, zu denen die Pfeile erstellt wurden = -11211905.17483469

Drücken Sie Strg+D, bewegen Sie die Maus entlang der Linien des Indikators und sehen Sie im Datenfenster, welche Werte seine Puffer haben.

 
Artyom Trishkin:

Drücken Sie Strg+D, ziehen Sie die Maus entlang der Indikatorlinien und sehen Sie im Datenfenster nach, welche Werte die Puffer haben.

Wenn ich Sie richtig verstanden habe, habe ich nach einer Katze im Zimmer gesucht, die nicht da ist? Das Array wurde nicht mit Preisen gefüllt, sondern mit den Werten des Indikators zu diesem Zeitpunkt? Danke, ich werde es mir noch einmal überlegen.

Eine letzte Frage - der Compiler gibt mir 2 Warnungen


Vorzeichenabweichung Test_iCustom.mq5 79 20

Vorzeichenabweichung Test_iCustom.mq5 92 20


Ich kann ihre Gründe nicht verstehen, bitte sagen Sie es mir. Was bedeutet "Zeichenfehlanpassung" (Yandex-Übersetzer)???


 
Sergey Voytsekhovsky:

Wenn ich Sie richtig verstanden habe, habe ich nach einer Katze im Zimmer gesucht, die nicht da ist? Das Array wurde nicht mit Preisen gefüllt, sondern mit den Werten des Indikators zu diesem Zeitpunkt? Danke, ich werde es mir noch einmal überlegen.

Eine letzte Frage - der Compiler gibt mir 2 Warnungen


Vorzeichenabweichung Test_iCustom.mq5 79 20

Vorzeichenabweichung Test_iCustom.mq5 92 20


Ich kann ihre Gründe nicht verstehen, bitte sagen Sie es mir. Was bedeutet "Zeichenfehlanpassung" (Yandex-Übersetzer)?


Sie könnten ein Nummernschild verlieren. Zeigen Sie diese Codezeilen.

 
Artyom Trishkin:

Sie könnten ein Nummernschild verlieren. Zeigen Sie diese Codezeilen.

for(n=0; n<period_find; n++)
Die zweite ist genau dasselbe (Schleifen, um Nicht-Null-Werte in Arrows-Arrays zu finden).
 
Sergey Voytsekhovsky:
Die zweite ist genau dasselbe (Schleifen, um Nicht-Null-Werte in Arrays "Arrows" zu finden).

Was sind die Typen der Variablen n und period_find ? Das Wichtigste, das sie nicht gezeigt haben...

Versuchen Sie es:

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

Warum deklarieren Sie eine Schleifenvariable auf der Ebene des OnTick()-Handlers?

Sie können es so machen:

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

Sie können die n-Deklaration aus OnTick() entfernen - wir brauchen sie dort nicht.

 
Artyom Trishkin:

Was sind die Typen der Variablen n und period_find? Das Wichtigste und nicht Gezeigte...

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;