Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 989

 
Aleksey Vyazmikin:

Wie kann ich den Grund für diese Meldung herausfinden?

Profiler

 
Artyom Trishkin:

Sie wissen nicht, wie Sie den Rückgabewert auf Null prüfen können? Und ich weiß nicht, wie ich OnCalculate() mit einem Rückgabewert von Null beenden kann? Haben Sie noch nie versucht, auf der Website nach Informationen zu suchen?

  1. Abrufen des gewünschten Wertes aus der Funktion
  2. Prüfen, ob er Null ist
    1. Ist er gleich Null, wird 0 zurückgegeben;
    2. Wenn er nicht Null ist, dann zu Schritt 3
  3. Arbeiten mit diesem Wert
Ich hätte nie gedacht, dass ich die Grundlagen der Logik auf dieser Ressource einem Mann mit einer Bewertung von mehr als 13 Tausend erzählen werde...

Dies ist kein Indikator.

Ich habe absichtlich angegeben, ob ich bei jedem Aufruf Überprüfungen durchführen soll oder ob eine zu Beginn von OnTick ausreicht...

Retouren sind für mich nicht akzeptabel ... und die Warteschleife im Tester ist unmöglich, und in der realen sollte funktionieren (oder nicht?).

Meine Bewertung ist nicht für die Programmierung, ich bin kein Programmierer, und ich lerne dieses komplizierte Geschäft nur dank Leuten wie Ihnen, ich schätze wirklich Feedback von sachkundigen Leuten.

Ich danke Ihnen für Ihr Verständnis.

 
Artyom Trishkin:

Profiler

Was ist, wenn es einmal am Tag oder weniger passiert?

 
Hallo. Aus irgendeinem Grund sendet Handel nur, wenn er auf alle Zeiträume eingestellt ist, aber wenn ich einen bestimmten Zeitraum einstelle, kommt nichts. Ich weiß nicht, was das Problem ist. Ich habe versucht, den Text direkt und nicht über globale Variablen einzugeben, das Ergebnis ist das gleiche. Was ist los? Der Wert muss aus einer Periode stammen.
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
Hallo. Aus irgendeinem Grund überträgt handel nur, wenn ich alle Zeiträume einstelle, aber wenn ich einen bestimmten Zeitraum einstelle, gibt es nichts. Ich weiß nicht, was das Problem ist. Ich habe versucht, Daten nicht aus globalen Variablen direkt in handel einzugeben, das Ergebnis ist das gleiche. Was ist los?
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
     {
      PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
      return(0.0);
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

Studieren Sie den Fehler. Artem hat Recht, wenn er sagt, dass Sie alles 10 Mal überprüfen sollten...

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERR_INVALID_ARRAY

4006

Array von ungeeignetem Typ, ungeeigneter Größe oder beschädigtes dynamisches Array-Objekt


ERR_INDICATOR_DATA_NOT_FOUND

4806

Angeforderte Daten nicht gefunden


 
kopeyka2:
Hallo. Mir ist aufgefallen, dass das Handle nur übertragen wird, wenn es für alle Zeiträume eingestellt ist, aber wenn ich es für einen bestimmten Zeitraum einstelle, passiert nichts. Ich verstehe nicht, wo das Problem liegt. Ich habe versucht, den Text direkt und nicht über globale Variablen einzugeben, das Ergebnis ist das gleiche. Was ist los? Der Wert muss aus demselben Zeitraum stammen.

Du nimmst Beispiele aus der CodeBase von Scriptor's Indikatoren, nicht wahr? Oder? Dann suchen Sie in seinem (kürzlich veröffentlichten) Code nach Beispielen, die MTF im Namen tragen, aber ohne MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Wenn Sie z.B. Daten für das aktuelle Symbol, aber für einen anderen Zeitrahmen als die Chart-Periode abrufen möchten, benötigen Sie ein Beispiel für einen Multi-Timeframe-Indikator. In MCP sollten Sie sich noch nicht einmischen - dort auf die OOP mit der Verwendung der Standardklassen. Sie werden verwirrt sein.

Zum Beispiel diese Berechnung:

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

Es ist nur für MA, die mit dem aktuellen Zeitraum und Symbol arbeiten. Für die Arbeit in einem anderen Zeitraum wird die Berechnung anders ausfallen. Schauen Sie nach - alles ist in der Nähe, und die Richtung, die ich Ihnen gegeben habe.

 
Artyom Trishkin:

Du nimmst Beispiele aus der CodeBase von Scriptor's Indikatoren, nicht wahr? Oder? Dann suchen Sie in seinem (kürzlich veröffentlichten) Code nach Beispielen, die MTF im Namen tragen, aber ohne MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Wenn Sie z.B. Daten für das aktuelle Symbol, aber für einen anderen Zeitrahmen als die Chart-Periode abrufen möchten, benötigen Sie ein Beispiel für einen Multi-Timeframe-Indikator. In MCP sollten Sie sich noch nicht einmischen - dort auf die OOP mit der Verwendung der Standardklassen. Sie werden verwirrt sein.

Zum Beispiel diese Berechnung:

es ist nur für MA, die mit der aktuellen Periode und dem Symbol arbeiten. Für Arbeiten, die einen anderen Zeitraum betreffen, wird die Berechnung anders ausfallen. Suche - alles ist in der Nähe, und ich habe dir die Richtung angegeben.

Ich danke Ihnen...
 
Aleksey Vyazmikin:

Studieren Sie den Fehler. Artem hat Recht, wenn er sagt, dass Sie alles 10 Mal überprüfen sollten...

ERR_INVALID_ARRAY

4006

Array von ungeeignetem Typ, ungeeigneter Größe oder beschädigtes dynamisches Array-Objekt

Dankeschön
 
kopeyka2:
Dankeschön

Bitte, aber ich habe den falschen Fehler kopiert, er sollte lauten

ERR_INDICATOR_DATA_NOT_FOUND

4806

Die angeforderten Daten wurden nicht gefunden

Der Punkt ist, dass die Anzahl der Balken für die verschiedenen TFs unterschiedlich ist und dies berücksichtigt werden sollte.

 
Aleksey Vyazmikin:

Bitte, aber ich habe den falschen Fehler kopiert, er sollte lauten

ERR_INDICATOR_DATA_NOT_FOUND

4806

Die angeforderten Daten wurden nicht gefunden

Der Punkt ist, dass die Anzahl der Balken für die verschiedenen TFs unterschiedlich ist und dies berücksichtigt werden sollte.

Ich habe es gerade überprüft. Das PROBLEM besteht jedoch darin, dass die Einstellung von Handel auf eine konstante Periode, in

CopyBuffer ist der Wert in anderen Zeiträumen NICHT PERMANENT. Auf der eingestellten Handle-Periode war der Wert, aber auf den kleineren Timeframes 0,0 (Null). Habe mich auf die Suche nach dem Puffer gemacht... Null. Warum wird er nicht anCopyBuffer übergeben?